iWork Studio
PYPI · IWORK-STUDIO
Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe.
Available components
Last scanned (1 day ago)
Scores higher than 98% of PyPI servers
Category Documents and Files
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security99
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 7 of 59 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Arkanji/iwork-studio). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 21 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13655 tokens (~210/item across 65 items; 65 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Nov 26 +1
- Stability: 0.97 → pass security
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +16
- Malware scan: unverified → pass ▲ security
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed pypi/iwork-studio@2.6.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Arkanji/iwork-studio |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Arkanji/iwork-studio/.github/workflows/release.yml@refs/tags/v2.6.1 |
| Rekor log index | 3242531913 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:040fe65ce1d0faae24a28237cc903d48c669160fd6aa615fd0a845872814d7b3 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 59 packages
| Packages resolved | 59 |
|---|---|
| Stale | 6 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
iwork_capabilities What this Mac can do ~77
What this machine can do right now: routes, GUI session, installed apps, Keynote slide-op status. Call first when unsure. Call first when unsure what this machine can do: which apps exist, whether a GUI session is available, which toolsets are loaded. Not needed before plain reads of .numbers or .key files.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
iwork_create New file from a built-in template ~152
New .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. Use for a new, empty file from Apple's templates. Instead: iwork_create_from_template to copy the user's own file, numbers_create to make a Numbers file from data, keynote_build_deck for a finished deck from an outline.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Where to create the new file (.numbers, .key or .pages); it must not exist yet. |
| template | – | – | Template or theme name from iwork_list_templates; omit for Blank / Basic White. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_create_from_template New file from your own file ~114
Start 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. Use when the user has their own template or past file to start from. For Apple's built-in templates use iwork_create.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Where to create the new file; it must not exist yet. |
| template | string | yes | The user's own .numbers, .key or .pages file to copy. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_delete_design_kit Delete design kit ~89
Delete 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. Use only when the user asks to remove a saved kit. To change a kit, save it again with overwrite=true instead.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Name of the saved kit to delete (presets can't be deleted). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_export Export (PDF, Excel, Word, PowerPoint…) ~335
Export 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. Needs macOS + the app. Use to hand the result over in another format (PDF, Excel, Word, PowerPoint, images). Never export to docx/pptx/xlsx to edit and convert back: edit the iWork file directly.
| Name | Type | Req | Description |
|---|---|---|---|
| format | string | yes | Numbers: pdf | xlsx | csv. Pages: pdf | docx | epub | txt | rtf. Keynote: pdf | pptx | images | movie. |
| image_format | – | – | Slide images only: jpeg | png | tiff. |
| image_quality | – | – | good | better | best. |
| out | – | – | Output path (a folder for images); omit to write next to the source. |
| overwrite | boolean | – | true = replace an existing output (the old one is kept as a backup or returned). Default false. |
| password | – | – | Optional password for pdf, xlsx, docx or pptx. |
| password_hint | – | – | Optional hint shown with the password prompt. |
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_extract_design_kit Extract design kit ~250
Make 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 must pass). The file is never changed. Use when the user has a deck or table that already has their brand look. If they give colours and fonts directly use iwork_save_design_kit instead.
| Name | Type | Req | Description |
|---|---|---|---|
| name | – | – | Name for the kit, e.g. "Acme" (required with save=true). |
| overwrite | boolean | – | true = replace a saved kit with the same name. |
| path | string | yes | A .key deck or .numbers table that already has the look to capture. |
| save | boolean | – | true = save it under name for reuse; contrast must pass. |
| sheet | – | – | For .numbers: the sheet holding the styled table. |
| table | – | – | For .numbers: the styled table. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_find Find iWork files ~162
Find 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. Use when the user names a file loosely ("my sales deck") or you don't know its path; then read it with iwork_read. Not needed when you already have the path.
| Name | Type | Req | Description |
|---|---|---|---|
| folder | – | – | Folder to search; omit to search the allowed folders, else Documents, Desktop and Downloads. |
| kind | – | – | numbers | keynote | pages; omit for all three. |
| limit | integer | – | Maximum results (1–500). |
| name | – | – | Part of the file name to match (case-insensitive). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_list_backups List backups ~100
List the versioned backups (newest first) every write left for this file, plus the Keynote write manifest. Use when the user wants to undo or compare versions: it lists the backups, then iwork_restore_backup restores one. Not needed after a failed tool call: failed writes never change the file.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_list_design_kits List design kits ~126
Design 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": {...}}. Use before any styling to pick a kit, and to see the user's saved brand kits. Pass the name as kit= to keynote_build_deck, keynote_apply_design or numbers_apply_design.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
iwork_list_templates List templates ~80
Built-in templates for Numbers or Pages, or themes for Keynote (app: numbers | pages | keynote). Needs macOS + the app. Use before iwork_create to get valid template or theme names. Not needed for iwork_create_from_template, which copies the user's own file.
| Name | Type | Req | Description |
|---|---|---|---|
| app | string | yes | numbers | pages | keynote. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_metadata File details ~104
What 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. Use for file facts (template, app build, slide count) without reading content. For the content itself use iwork_read.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_read Read an iWork file ~103
Read a .numbers, .key or .pages file into JSON (.pages needs the Pages app and a GUI session). Use to see a file's content before editing it. Not for formatting details: use numbers_inspect_format (Numbers) or keynote_inspect_style (Keynote). For file facts only, iwork_metadata is cheaper.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_restore_backup Undo: restore a backup ~109
Undo: atomically restore a backup (a name from iwork_list_backups). The current version is backed up first. Use to undo a change, with a backup name from iwork_list_backups. The current version is backed up first, so a restore can itself be undone.
| Name | Type | Req | Description |
|---|---|---|---|
| backup | string | yes | Backup name from iwork_list_backups. |
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_samples Copy sample files to try ~122
Copy 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. Use when the user wants to try iWork Studio but has no file handy, or asks for an example; then follow one of the returned try_it prompts. Not for the user's own files.
| Name | Type | Req | Description |
|---|---|---|---|
| folder | string | yes | Folder to copy the samples into (created if missing), e.g. ~/Desktop. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_save_design_kit Save design kit ~225
Save 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. Use when the user gives brand colours and fonts directly. To capture them from an existing file use iwork_extract_design_kit.
| Name | Type | Req | Description |
|---|---|---|---|
| kit | – | yes | {"fonts": {...}, "colors": {...}, "theme": "...", "background": "#RRGGBB", "base": "<preset>"} or a preset name to copy. |
| name | string | yes | Name to save under, e.g. "Acme" (letters, digits, spaces, - or _; not a preset name). |
| overwrite | boolean | – | true = replace a saved kit with the same name. |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_thumbnail Preview image ~133
Extract 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. Use for a quick look at the stored first-page preview with no app. It reflects the last save in the app, not your latest edits: to see a slide as it renders now, use keynote_slide_image.
| Name | Type | Req | Description |
|---|---|---|---|
| out_dir | – | – | Folder for the extracted JPEG; omit for a temporary folder. |
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_verify_format Check rendered formatting ~235
Independent 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. Use to prove how a piece of text is drawn (font, size, colour, page size). To check text is merely present use iwork_verify_render.
| Name | Type | Req | Description |
|---|---|---|---|
| bold | – | – | Expected bold (true) or not bold (false). |
| color | – | – | Expected text colour "#RRGGBB". |
| font | – | – | Expected font; matches when the drawn font name contains it, e.g. "Avenir". |
| page_height | – | – | Expected page height in points. |
| page_width | – | – | Expected page width in points. |
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
| size | – | – | Expected size in points (±0.6). |
| text | string | yes | Text that must appear in the rendered PDF; for Arabic, one word (multi-word RTL text is reordered). |
Structured output declared, but exposes no named fields.
No examples provided.
iwork_verify_render Check text is rendered ~140
Export the file to PDF through its app and assert `assert_text` is visibly rendered. For Arabic, use one word. Use after an important write to prove the text really shows when rendered. To check font, size or colour use iwork_verify_format; to check a deck's whole design use keynote_review_deck.
| Name | Type | Req | Description |
|---|---|---|---|
| assert_text | string | yes | Text that must be visibly rendered; for Arabic, one word. |
| expected_pages | – | – | Expected page (or slide) count; omit to skip that check. |
| path | string | yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_add_chart Keynote: add chart ~349
Add 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. Use for a chart on an existing slide. In a new deck, put the chart in keynote_build_deck's outline instead; for exact numbers use keynote_add_table.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | Column names, e.g. ["Q1", "Q2", "Q3"]. |
| data | array | yes | One list of numbers per row name, each as long as columns. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| group_by | string | – | row (each row is a series) | column. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| rows | array | yes | Row names, e.g. ["2025", "2026"] (series when group_by="row"). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
| type | string | – | bar | stacked_bar | horizontal_bar | stacked_horizontal_bar | line | area | stacked_area | pie | scatter (or a *_3d variant). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_add_image Keynote: add image ~250
Place 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. Use to place a picture or logo on a slide. For data, use keynote_add_chart or keynote_add_table rather than a picture of a chart.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| image | string | yes | Image file to place (png, jpg, heic, pdf…). |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
| width | – | – | Image width in points; height keeps the aspect ratio. |
| x | – | – | Left edge in points (give with y); omit to let Keynote place it. |
| y | – | – | Top edge in points from the slide's top-left corner (give with x). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_add_slide Keynote: add slide ~171
Insert 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. Use for a new blank slide in an existing deck. To copy a slide use keynote_duplicate_slide; for a whole new deck use keynote_build_deck.
| Name | Type | Req | Description |
|---|---|---|---|
| after | – | – | Insert after this slide number; 0 = make it the first slide; omit = at the end. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_add_table Keynote: add table ~442
Add 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 untouched. At most 50 rows × 15 columns. dry_run=true previews the change on a copy without touching the file. Needs macOS + Keynote. Use for a table on an existing slide. In a new deck, put it in keynote_build_deck's outline; to show a trend use keynote_add_chart.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| header_rows | integer | – | How many rows at the top are headers (styled and kept on top). |
| kit | – | – | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Acme") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| rows | array | yes | The table, header first: [["Region", "Q1"], ["Riyadh", 1200]]; text, numbers or null; "=…" is a formula. |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
| width | – | – | Table width in points; omit for Keynote's default. |
| x | – | – | Left edge in points (give with y); omit to let Keynote place it. |
| y | – | – | Top edge in points (give with x). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_apply_design Keynote: apply design ~270
Make 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. Use to restyle a whole deck from a kit. For one text item use keynote_format_text. Preview with dry_run, then run keynote_review_deck.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| kit | – | – | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Acme") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| set_theme | boolean | – | true = also switch to the kit's theme first. |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_build_deck Keynote: build deck ~524
Build 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 removed. Never overwrites. kit = a design kit (iwork_list_design_kits) for a designed deck in one call. Chart slides: add "chart": {"type": "bar", "rows": ["2025", "2026"], "columns": ["Q1", "Q2"], "data": [[1, 2], [3, 4]]} or {"type": "line", "from": "/path/report.numbers", "columns": ["Q1", "Q2"]} (header row → column names, first column → row names); chart slides default to Title Only. Table slides: "table": {"rows": [["Region", "Q1"], ["Riyadh", 1200]]} or {"from": "/path/report.numbers", "columns": ["Q1"], "max_rows": 8}; with a kit the table is styled too. Needs macOS + Keynote. Use for a new deck from an outline, including chart and table slides; then run keynote_review_deck. To change an existing deck use the slide and text tools instead.
| Name | Type | Req | Description |
|---|---|---|---|
| kit | – | – | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Acme") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. |
| path | string | yes | Where to create the new .key deck; it must not exist yet. |
| slides | array | yes | The outline: [{"title": "…", "body": ["bullet", …], "notes": "…", "layout": "…", "image": "/path.png", "chart": {…}, "table": {…}}, …]; see the tool description for chart and table. |
| theme | – | – | Theme name from keynote_list_themes; the kit's theme is used when omitted. |
| transition | – | – | Transition for every slide, e.g. "dissolve". |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_delete_slide Keynote: delete slide ~158
Delete slide number `slide` (1-based). Recoverable with iwork_restore_backup. dry_run=true previews the change on a copy without touching the file. Use to remove a slide for good (the last slide can't be deleted). To keep it but hide it in the slideshow use keynote_skip_slide.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_duplicate_slide Keynote: duplicate slide ~148
Duplicate slide number `slide` (1-based); the copy lands right after it. dry_run=true previews the change on a copy without touching the file. Use to copy an existing slide (layout and content). For a blank slide use keynote_add_slide.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_format_text Keynote: format text ~282
Font (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. Use for one text item's font, size or colour. To restyle the whole deck consistently use keynote_apply_design.
| Name | Type | Req | Description |
|---|---|---|---|
| color | – | – | Text colour "#RRGGBB". |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| font | – | – | PostScript font name, e.g. "HelveticaNeue-Bold". |
| item | – | – | Text item index on the slide (from keynote_inspect_style); or use match. |
| match | – | – | A unique piece of the item's text, to pick it instead of item. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| size | – | – | Font size in points. |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_inspect_style Keynote: inspect style ~94
A 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. Use before formatting: theme, layouts, and each text item's font, size and colour. For slide text and notes use keynote_list_slides.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_list_slides Keynote: list slides ~83
Every slide with its text, presenter notes and whether it is hidden (via Keynote). Use slide numbers from here for slide operations. Use before slide operations to see slide numbers, text, notes and hidden state. For fonts and layouts use keynote_inspect_style.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_list_themes Keynote: list themes ~43
Themes available in Keynote on this Mac (names to pass to keynote_set_theme). Use before keynote_set_theme or keynote_build_deck to get valid theme names.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
keynote_move_slide Keynote: move slide ~164
Move 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. Use to reorder slides. To copy a slide to a new position, duplicate it first with keynote_duplicate_slide.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | The slide to move, 1-based. |
| to | integer | yes | Where it should end up, 1-based. |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_replace_text Keynote: replace text ~185
Find/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. Use to change the same text everywhere in a deck (names, dates, numbers). To rewrite one slide's title or body use keynote_set_slide_text.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| find | string | yes | Text to find (literal unless regex=true). |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| regex | boolean | – | true = treat find as a regular expression. |
| replace | string | yes | Replacement text. |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_review_deck Keynote: review deck ~169
Design 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 macOS + Keynote. Use after building or restyling a deck, before saying it's done; fix every error. To look at a flagged slide use keynote_slide_image; to check one word renders use iwork_verify_render.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_set_presenter_notes Keynote: set presenter notes ~171
Set the presenter notes of slide number `slide` (1-based). Arabic-safe. dry_run=true previews the change on a copy without touching the file. Use for speaker notes on an existing slide. For a new deck, put notes in keynote_build_deck's outline instead.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| notes | string | yes | The presenter notes text (replaces existing notes). |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_set_slide_layout Keynote: set slide layout ~178
Change 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. Use to change one slide's layout (names from keynote_inspect_style). Not for text styling: use keynote_format_text.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| layout | string | yes | Layout (master slide) name from keynote_inspect_style. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_set_slide_text Keynote: set slide text ~226
Fill 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. Use to fill or rewrite one slide's title and body. To change the same words across the deck use keynote_replace_text; for speaker notes use keynote_set_presenter_notes.
| Name | Type | Req | Description |
|---|---|---|---|
| body | – | – | New body: a string, or a list of bullets; omit to leave it. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
| title | – | – | New title text; omit to leave it. |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_set_theme Keynote: set theme ~157
Apply 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. Use to switch the deck's theme only. For a full designed look (fonts, sizes, colours) use keynote_apply_design, which can set the theme too.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| theme | string | yes | Theme name from keynote_list_themes. |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_set_transition Keynote: set transition ~249
Transition 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. Use for one slide's transition. For the same transition on every slide of a new deck, pass transition= to keynote_build_deck.
| Name | Type | Req | Description |
|---|---|---|---|
| automatic | – | – | true = advance to the next slide on its own. |
| delay | – | – | Delay before it starts, in seconds. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| duration | – | – | Duration in seconds. |
| effect | string | yes | Transition effect, e.g. "dissolve", "push", "magic move", or "none". |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_skip_slide Keynote: skip slide ~168
Hide (skipped=true) or show a slide in the slideshow. dry_run=true previews the change on a copy without touching the file. Use to hide or show a slide in the slideshow without deleting it. To remove it use keynote_delete_slide.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| skipped | boolean | – | true = hide the slide in the slideshow; false = show it again. |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
Structured output declared, but exposes no named fields.
No examples provided.
keynote_slide_image Keynote: slide image ~151
One 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. Use to look at a slide's real rendering, e.g. one keynote_review_deck flagged. For a quick preview without Keynote use iwork_thumbnail (first slide, last saved state).
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .key deck (absolute, or starting with ~). |
| slide | integer | yes | Slide number, 1-based (keynote_list_slides lists them). |
| width | integer | – | Image width in pixels (320–2560). |
No output schema declared.
No examples provided.
keynote_slideshow Keynote: slideshow ~108
Present: action = start (needs path; from_slide 1-based) | stop | next | previous. Doesn't change the file. Needs macOS + Keynote. Use to present the deck live; it doesn't change the file. To share it instead use iwork_export.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | start | stop | next | previous. |
| from_slide | integer | – | Slide to start from, 1-based. |
| path | – | – | The deck to present (needed for start). |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_add_table Numbers: add table ~266
Add 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. Use for a new, separate table on a sheet or a new sheet. To grow an existing table use numbers_insert.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| header_columns | integer | – | How many columns on the left are headers. |
| header_rows | integer | – | How many rows at the top are headers (styled and kept on top). |
| new_sheet | – | – | Name of a new sheet to create for the table instead. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| rows | array | yes | The data, header first: [["Region", "Revenue"], ["Riyadh", 1200]]. |
| sheet | – | – | Existing sheet to add it to; omit for the first sheet. |
| table_name | string | yes | Name of the new table (must not exist on that sheet). |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_apply_design Numbers: apply design ~304
Style 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. Use to make a whole table look designed in one call (header band, fonts, banding, aligned numbers). For a few cells use numbers_set_cell_style. Preview with dry_run.
| Name | Type | Req | Description |
|---|---|---|---|
| banding | boolean | – | true = tint alternate body rows. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| kit | – | – | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Acme") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_create Numbers: create ~193
Create 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. Use to make a new Numbers file when you have the rows. From a CSV file use numbers_import_csv; to add a table to an existing file use numbers_add_table.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Where to create the new .numbers file; it must not exist yet. |
| sheets | array | yes | Sheets with their tables: [{"name": "Sales", "tables": [{"name": "Q1", "rows": [["Region", "Revenue"], ["Riyadh", 1200]], "header_rows": 1}]}]. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_delete Numbers: delete ~250
Delete `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. Use to remove rows or columns. Not for clearing values (use numbers_edit_cell with null). Refused in tables with formulas or merges; undo with iwork_restore_backup.
| Name | Type | Req | Description |
|---|---|---|---|
| at | integer | yes | 1-based position of the first one to delete. |
| count | integer | – | How many to delete. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| what | string | yes | rows | columns. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_edit_cell Numbers: edit cell ~253
Set 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. Use to set one value. For a formula use numbers_set_formula; to add whole rows use numbers_insert with values; for how a number displays use numbers_set_number_format.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| ref | string | yes | One cell in A1 notation, e.g. "B2". |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| value | – | yes | New value: a number stays a number, text stays text exactly (Arabic too); null clears. For a formula use numbers_set_formula. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_import_csv Numbers: import csv ~216
Turn 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. Use when the data is in a CSV/TSV file. When you already have the rows use numbers_create.
| Name | Type | Req | Description |
|---|---|---|---|
| csv_path | string | yes | The CSV or TSV file to read (UTF-8). |
| delimiter | – | – | Column separator, e.g. "," or "\t"; omit to detect it. |
| header_rows | integer | – | How many rows at the top are headers (styled and kept on top). |
| numbers | boolean | – | true = plain numbers become numbers; false = keep every cell as text. |
| path | string | yes | Where to create the new .numbers file; it must not exist yet. |
| sheet | string | – | Name for the new sheet. |
| table | string | – | Name for the new table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_insert Numbers: insert ~307
Insert 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. Use to add rows or columns to an existing table (optionally filled). For a separate table use numbers_add_table. In tables with formulas only appending works; do mid-table inserts in Numbers.
| Name | Type | Req | Description |
|---|---|---|---|
| at | – | – | 1-based position to insert before; omit to append at the end. |
| count | integer | – | How many to insert. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| values | – | – | Optional contents: one list per new row (or column), e.g. [["Riyadh", 1200]]. |
| what | string | yes | rows | columns. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_inspect_format Numbers: inspect format ~142
Current 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. Use before formatting to see current styles, number formats, sizes, headers and merges. For values use iwork_read.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_merge_cells Numbers: merge cells ~227
Merge 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. Use to merge a range, e.g. a title across columns. Refused if it would hide values; avoid merging inside data you will sort.
| Name | Type | Req | Description |
|---|---|---|---|
| cells | string | yes | The range to merge, e.g. "A1:C1". Refused if it would hide values. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the iWork Studio MCP server?
iWork Studio runs locally as a PyPI package, launched with uvx iwork-studio. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · iwork-studio
claude mcp add arkanji-iwork-studio -- uvx iwork-studio
What is the iWork Studio MCP server?
iWork Studio is an MCP server listed in the public MCP registry as io.github.Arkanji/iwork-studio. Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe. This page covers its PyPI package (iwork-studio).
Is the iWork Studio MCP server safe to use?
iWork Studio scores 96 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the iWork Studio MCP server expose?
iWork Studio exposes 65 tools: iwork_capabilities, iwork_samples, iwork_read, iwork_list_backups, pages_preflight, and 60 more. Their descriptions and schemas cost roughly 13,026 tokens of context every time the server is loaded.
Is the iWork Studio MCP server still maintained?
iWork Studio is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the iWork Studio MCP server under?
iWork Studio declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.