iWork Studio MCP server
io.github.Arkanji/iwork-studio·v2.6.1·2 starsCreate, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe.
2 stars149 downloads/wk
Reviews
Write oneNobody has reviewed iWork Studio yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
iWork Studio tools (65, 10 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
iwork_capabilitiesWhat this machine can do right now: routes, GUI session, installed apps, Keynote slide-op status. Call first when unsure.
iwork_createwrite actionNew .numbers / .key / .pages from Apple's built-in templates (Keynote: themes); names from iwork_list_templates. Omit template for Blank / Basic White. Refuses to overwrite. Needs macOS + the app.
iwork_create_from_templatewrite actionStart a new document from one of the user's own files (any .numbers / .key / .pages): copies it to `path` and checks it opens. Refuses to overwrite.
iwork_delete_design_kitwrite actionDelete a saved design kit (presets can't be deleted). Returns the kit's contents, so it can be saved again with iwork_save_design_kit.
iwork_exportExport to another format. Numbers: pdf | xlsx | csv. Pages: pdf | docx | epub | txt | rtf. Keynote: pdf | pptx | images | movie. Optional password (+hint) for pdf/xlsx/docx/pptx, image_quality (good|better|best), image_format for slide images (jpeg|png|tiff). Default output sits next to the source. The export is checked against the source with a second tool and the source is verified unchanged. Ne
iwork_extract_design_kitMake a design kit from the user's own deck or table: heading and body fonts (Latin and Arabic) and the title, body and brand colours. .numbers reads the table's header and body styles (no app); .key reads every slide's title and body (needs macOS + Keynote). Parts the file doesn't show come from the nearest preset and are listed in notes. save=true with a name keeps it for reuse by name (contrast
iwork_findFind Numbers / Keynote / Pages files (newest first). kind: numbers | keynote | pages; name: part of the file name. Searches `folder`, else the allowed folders, else Documents/Desktop/Downloads. Uses Spotlight on macOS.
iwork_list_backupsList the versioned backups (newest first) every write left for this file, plus the Keynote write manifest.
iwork_list_design_kitsDesign kits for good-looking decks and tables: font pairs (Latin + Arabic, bundled with macOS), contrast-checked palettes and a type scale. Lists the presets and the kits you saved (saved: true). Use with keynote_build_deck(kit=…), keynote_apply_design, numbers_apply_design. Custom kits: pass {"fonts": {...}, "colors": {...}}.
iwork_list_templatesBuilt-in templates for Numbers or Pages, or themes for Keynote (app: numbers | pages | keynote). Needs macOS + the app.
iwork_metadataWhat a file says about itself, without the app: kind, size, modified, template it was made from, app builds that saved it, file format version, slide count (Keynote), embedded media count.
iwork_readRead a .numbers, .key or .pages file into JSON (.pages needs the Pages app and a GUI session).
iwork_restore_backupUndo: atomically restore a backup (a name from iwork_list_backups). The current version is backed up first.
iwork_samplesCopy sample files (sample-sales.numbers with English and Arabic sheets of synthetic sales data, and sample-outline.md for a deck) into a folder, so a first try needs none of the user's own files. Never overwrites. Returns try-it prompts.
iwork_save_design_kitSave a design kit by name for reuse anywhere a kit is accepted. kit = {"fonts": {...}, "colors": {...}, "theme": "...", "background": "#RRGGBB"} (missing parts come from the "executive" preset, or from "base": "<preset>"), or a preset name to copy. Contrast is checked (4.5:1). Never replaces a saved kit unless overwrite=true; can't reuse a preset's name.
iwork_thumbnailExtract the preview image stored in the file (first page/slide) to a JPEG and return its path — a quick look without opening the app. Reflects the app's last save.
iwork_verify_formatIndependent check of formatting: export a PDF through the app and confirm `text` is drawn with the given font (name contains), size (pt), color (#RRGGBB), bold, and page size (pt). Needs macOS + the app.
iwork_verify_renderExport the file to PDF through its app and assert `assert_text` is visibly rendered. For Arabic, use one word.
keynote_add_chartAdd a chart to a slide from data. rows = series names, columns = category names, data = one list of numbers per row (rows × columns). type: bar | stacked_bar | horizontal_bar | stacked_horizontal_bar | line | area | stacked_area | pie | scatter (or *_3d). group_by: row | column. Text and other charts are verified untouched. dry_run=true previews the change on a copy without touching the file.
keynote_add_imagePlace an image file (png, jpg, heic, pdf…) on a slide; optional x/y position and width in points. All text verified untouched. dry_run=true previews the change on a copy without touching the file.
keynote_add_slidewrite actionInsert a slide after slide number `after` (0 = first, omit = end). Every other slide is verified unchanged. dry_run=true previews the change on a copy without touching the file.
keynote_add_tableAdd a table to a slide (1-based). rows = [["Region", "Q1"], ["Riyadh", 1200], …]: text, numbers, or null; text starting with "=" is a formula. kit (iwork_list_design_kits name or your own) styles it: header band, fonts (Arabic-aware), banding, numbers right-aligned. Optional x, y (points from top-left) and width. Every cell, font and colour is read back; other slides and tables are checked untouch
keynote_apply_designMake a deck look designed: the kit's theme (optional), then every slide's title and body fonts (Arabic-aware), sizes from a type scale, and colours from a contrast-checked palette. kit = a name from iwork_list_design_kits or your own {"fonts": {...}, "colors": {...}}. Text is verified unchanged. dry_run=true previews the change on a copy without touching the file.
keynote_build_deckBuild a new Keynote deck from an outline. slides = [{"title": "…", "body": ["bullet", "bullet"], "layout": "Title & Bullets", "notes": "…", "image": "/path/pic.png"}, …]; the first slide defaults to a title layout, the rest to Title & Bullets. theme from keynote_list_themes; optional transition for every slide (e.g. dissolve). Every slide is read back and checked; on any mismatch the new file is r
keynote_delete_slidewrite actionDelete slide number `slide` (1-based). Recoverable with iwork_restore_backup. dry_run=true previews the change on a copy without touching the file.
keynote_duplicate_slideDuplicate slide number `slide` (1-based); the copy lands right after it. dry_run=true previews the change on a copy without touching the file.
keynote_format_textFont (PostScript name, e.g. "HelveticaNeue-Bold"), size (pt) and/or colour ("#RRGGBB") of one text item on a slide — pick it by item index (from keynote_inspect_style) or by a unique piece of its text (match). Alignment and shape fill are not scriptable. dry_run=true previews the change on a copy without touching the file.
keynote_inspect_styleA deck's styling: current theme, available slide layouts, and per slide its layout plus each text item's text, font, size and colour. Read this before theming.
keynote_list_slidesEvery slide with its text, presenter notes and whether it is hidden (via Keynote). Use slide numbers from here for slide operations.
keynote_list_themesThemes available in Keynote on this Mac (names to pass to keynote_set_theme).
keynote_move_slideMove slide number `slide` so it ends up at position `to` (both 1-based). dry_run=true previews the change on a copy without touching the file.
keynote_replace_textFind/replace text across every slide of a .key deck (literal unless regex=true). Formatting and structure are verified unchanged. dry_run=true previews the change on a copy without touching the file.
keynote_review_deckDesign review of a deck as Keynote actually draws it: renders to PDF and reports, per slide, text drawn off the slide or past the bottom of its box (errors), text boxes drawn on top of each other, text under 18 pt, and slides that are too dense (warnings). Run it after building or restyling a deck, fix the errors, then look at a flagged slide with keynote_slide_image. The file isn't changed. Needs
keynote_set_presenter_notesSet the presenter notes of slide number `slide` (1-based). Arabic-safe. dry_run=true previews the change on a copy without touching the file.
keynote_set_slide_layoutChange one slide's layout (master), e.g. "Title & Bullets". Other slides are verified untouched. dry_run=true previews the change on a copy without touching the file.
keynote_set_slide_textFill a slide's title and/or body box (body may be a list of bullet lines). The title box is the top-most text box, the body the largest other one. Other slides and text boxes are verified untouched. dry_run=true previews the change on a copy without touching the file.
keynote_set_themeApply a different Keynote theme to the whole deck. Rolled back if any slide loses text. dry_run=true previews the change on a copy without touching the file.
keynote_set_transitionTransition into a slide: effect such as dissolve, push, wipe, magic move, cube, flip, move in, reveal, "none"; duration/delay in seconds; automatic=true advances on its own. Other slides verified untouched. dry_run=true previews the change on a copy without touching the file.
keynote_skip_slideHide (skipped=true) or show a slide in the slideshow. dry_run=true previews the change on a copy without touching the file.
keynote_slide_imageOne slide as an image (JPEG, `width` px wide), exported by Keynote, so you can look at the design yourself. Skipped slides aren't exported. The file isn't changed. Needs macOS + Keynote.
keynote_slideshowPresent: action = start (needs path; from_slide 1-based) | stop | next | previous. Doesn't change the file. Needs macOS + Keynote.
numbers_add_tableAdd a table with data to an existing sheet (`sheet`, default the first) or to a new sheet (`new_sheet`). Every existing table is verified unchanged. dry_run=true previews the change on a copy without touching the file.
numbers_apply_designStyle a whole table from a design kit: header band (fill, bold, contrast-checked text), body font and colour (Arabic cells get the Arabic font), alternate-row banding, number columns right-aligned. Values never change; every other table is verified untouched. No app needed. dry_run=true previews the change on a copy without touching the file.
numbers_createwrite actionCreate a new .numbers file from data. sheets = [{"name": "Sales", "tables": [{"name": "Q1", "rows": [["Region", "Revenue"], ["Riyadh", 1200]], "header_rows": 1}]}]. Numbers stay numbers, text stays text exactly (Arabic included). Refuses to overwrite. No app needed.
numbers_deletewrite actionDelete `count` rows or columns (what = rows | columns) starting at 1-based position `at`. Remaining cells are verified. Refused in tables with formulas or merged cells. Undo with iwork_restore_backup. dry_run=true previews the change on a copy without touching the file.
numbers_edit_cellSet one cell (e.g. ref "B2") in a .numbers file. Backed up, verified, atomic; every other cell is checked unchanged. dry_run=true previews the change on a copy without touching the file.
numbers_import_csvTurn a CSV/TSV into a new .numbers file (UTF-8, delimiter auto-detected). Plain numbers become numbers (numbers=false keeps everything as text); dates, "$1,234" and Arabic-Indic digits stay text exactly as written. Refuses to overwrite.
numbers_insertwrite actionInsert rows or columns (what = rows | columns) before 1-based position `at`; omit `at` to append. Optional `values`: one list per new row (or column). Every existing cell is verified at its new position. In tables with formulas, only appending is allowed (shifting would break references). dry_run=true previews the change on a copy without touching the file.
numbers_inspect_formatCurrent formatting of a Numbers table: column widths, row heights, header rows/cols, merges, and per-cell font/colour/fill/alignment, number format (shown_as) and borders. Read this before formatting.
numbers_merge_cellsMerge a rectangular range ("A1:C1"). Refused if any cell other than the top-left holds data (it would be hidden) or the range crosses the header edge. dry_run=true previews the change on a copy without touching the file.
numbers_recalculateMake Numbers recompute every formula from the current values. Numbers keeps showing a formula's old result after edits made without it (numbers_edit_cell, numbers_insert…), so run this after those when the file has formulas — their result says so (formulas_need_recalc). Formulas and inputs are verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy withou
numbers_set_bordersCell borders on a range: sides = all | outline | inner | top | right | bottom | left; width in points; color "#RRGGBB"; style = solid | dashes | dots | none. dry_run=true previews the change on a copy without touching the file.
numbers_set_cell_styleStyle a range ("A1:D1"): font_name, font_size, bold, italic, underline, strikethrough, font_color / fill_color as "#RRGGBB", align (left|center|right|justify|auto), valign (top|middle|bottom), wrap. Only the attributes you pass change; every other cell is verified untouched. dry_run=true previews the change on a copy without touching the file.
numbers_set_dimensionsSet column widths and/or row heights in points, e.g. columns={"A": 160, "C": 90}, rows={"1": 32} (rows are 1-based). Nothing else changes. dry_run=true previews the change on a copy without touching the file.
numbers_set_formulawrite actionPut a formula in one cell, e.g. ref "D10", formula "=SUM(D2:D9)"; Numbers computes it and the result is returned. Every other cell's input is verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file.
numbers_set_headersSet how many header rows / header columns a table has (0–5). dry_run=true previews the change on a copy without touching the file.
numbers_set_number_formatHow numbers display in a range ("B2:B9"): format = number | currency | percentage | scientific | fraction | datetime | text. Options: decimal_places, thousands_separator, negative_style (minus|red|parentheses|red_parentheses), currency_code (ISO, e.g. SAR, USD), accounting, date_format (e.g. "d MMM yyyy"). Values are not changed; the result shows how each cell now displays. dry_run=true previews t
numbers_sortSort a table's body rows by a column letter (header rows stay on top). Verified as a pure reorder. A table whose formulas read other rows (e.g. =B2*0.1 below a base-figure row) is refused, because Numbers' sort would break them; for it, to_new_table=true leaves the table, its formulas and its charts as they are and puts a sorted copy of its values (no formulas) in a new table on the same sheet (na
pages_fill_placeholdersFill template placeholders by tag, e.g. {"Name": "Sara", "Date": "3 October"}. Formatting is kept; the body is verified to change only there. Needs macOS + Pages. dry_run=true previews the change on a copy without touching the file.
pages_list_placeholdersTemplate placeholders in a .pages document (tag + current text), e.g. a letter's "Name" or "Date" fields. Needs macOS + Pages.
pages_preflightCheck Pages can answer AppleEvents. Run once before any Pages op; never loop on failure.
pages_read_tablesEvery table in a .pages document: name, size, and each cell's value, shown text and formula. Needs macOS + Pages.
pages_replace_allReplace every occurrence of `find` in a .pages body (needs Pages + GUI session). Rolled back if the readback disagrees. dry_run=true previews the change on a copy without touching the file.
pages_set_bodyReplace the entire body text of a .pages document (needs Pages + GUI session). Body formatting is reset. dry_run=true previews the change on a copy without touching the file.
pages_set_table_cellswrite actionWrite cells of an existing table in a .pages document. table = its name or number (from pages_read_tables); cells = {"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"} — numbers stay numbers, "=…" makes a formula, null clears. Every other cell and the body text are verified unchanged. New tables can't be created (Pages 15 doesn't script it). Needs macOS + Pages, document closed. dry_run=true previews th
Public scan report
scanner v0.1.10 · 2026-10-13 · same rubric, same numbers if you re-run it
- Code scan29 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
How iWork Studio compares
Against every graded Media MCP server, from our own scans and uptime checks. Updated after each scan run.
- Safety score
- 92/100
- higher than 85% of 1,337 Media servers
- Tools
- 65
- the typical Media server has 7
- Tools that change things
- 15%
- typical: 4%. Fewer write tools means less an agent can break
- GitHub stars
- 2
- more than 70% of 715 Media servers
- Downloads a week
- 149
- more than 70% of 365 Media servers with a package
What its tools let an agent do: 55 read · 10 change
Release history: 2 versions in the registry since 2026-10-04, latest 2026-10-13, typically one every 8 days.
Install iWork Studio in Claude Code, Cursor or VS Code
claude mcp add iwork-studio -- uvx iwork-studio
What the publisher says
From the iWork Studio repository's README, as published. We do not edit it. Read it on GitHub
<!-- mcp-name: io.github.Arkanji/iwork-studio -->
The safe way to let AI edit your Numbers, Keynote and Pages files.
Designed decks from your data and your brand, checked as rendered. Arabic-ready. Every change is backed up, verified and undoable, and anything risky is refused, never guessed.
Install · Try it · Safety · What it can do · All tools · For AI agents · Changelog
15 seconds: data → designed deck → a safe rollback → Arabic. HD video
▶ Watch the film with sound (46s) · Read the launch story
Install
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
iWork Studio: common questions
- Is iWork Studio MCP server safe?
- Yes, by our scan: it is graded A (92/100). Read the iWork Studio safety report
- How do I install iWork Studio?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does iWork Studio need an API key?
- No secret keys are declared. It reads 2 settings from the environment.
- Is iWork Studio maintained?
- The last commit was 22 days ago (2026-10-13). The latest release is v2.6.1.
- What can I use instead of iWork Studio?
- Servers from other publishers that do the same job: Codesign MCP server, b123d-print MCP server and OverlayQA MCP server. Compare all iWork Studio alternatives.
- How does iWork Studio compare with other Media MCP servers?
- safety score 92/100 (higher than 85% of 1,337 Media servers); tools 65 (the typical Media server has 7); tools that change things 15% (typical: 4%. Fewer write tools means less an agent can break). Full comparison.
Alternatives to iWork Studio
Same job from other publishers: the closest match first, then the best rated.
CodesignLocal design engine for AI agents: create, edit and export real, editable designs.not reviewedEstablishedA- b123d-printVibe CAD for 3D printing: design, check and export printable parts with build123d.not reviewedGrowingA
OverlayQARun accessibility, contrast, and design token audits and file QA issues from your AI coding tool.not reviewedGrowingA- Open DesignDesign skills, design systems and artifact tools: landing pages, decks, prototypes, posters, more.not reviewedGrowingB
- DembrandtDesign tokens from any live site: colours, type, spacing, components, drift against a baseline.not reviewedWidely usedB