Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

iWork Studio

PYPI · IWORK-STUDIO

Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe.

Available components

+18 this week 96 Trust /100

Last scanned (1 day ago)

Scores higher than 98% of PyPI servers

Category Documents and Files

Trust breakdown (7 categories)

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
Changelog

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.

Diagnostics

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 →

MCP tools · 65 exposed · ~13,026 tokens

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 →

Tool Tokens
iwork_capabilities ~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 ~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.

NameTypeReqDescription
pathstringyesWhere 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 ~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.

NameTypeReqDescription
pathstringyesWhere to create the new file; it must not exist yet.
templatestringyesThe 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 ~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.

NameTypeReqDescription
namestringyesName of the saved kit to delete (presets can't be deleted).

Structured output declared, but exposes no named fields.

No examples provided.

iwork_export ~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.

NameTypeReqDescription
formatstringyesNumbers: 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.
overwriteboolean–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.
pathstringyesPath 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 ~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.

NameTypeReqDescription
name––Name for the kit, e.g. "Acme" (required with save=true).
overwriteboolean–true = replace a saved kit with the same name.
pathstringyesA .key deck or .numbers table that already has the look to capture.
saveboolean–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 ~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.

NameTypeReqDescription
folder––Folder to search; omit to search the allowed folders, else Documents, Desktop and Downloads.
kind––numbers | keynote | pages; omit for all three.
limitinteger–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 ~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.

NameTypeReqDescription
pathstringyesPath 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 ~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 ~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.

NameTypeReqDescription
appstringyesnumbers | pages | keynote.

Structured output declared, but exposes no named fields.

No examples provided.

iwork_metadata ~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.

NameTypeReqDescription
pathstringyesPath to the .numbers, .key or .pages file (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

iwork_read ~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.

NameTypeReqDescription
pathstringyesPath 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 ~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.

NameTypeReqDescription
backupstringyesBackup name from iwork_list_backups.
pathstringyesPath to the .numbers, .key or .pages file (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

iwork_samples ~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.

NameTypeReqDescription
folderstringyesFolder 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 ~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.

NameTypeReqDescription
kit–yes{"fonts": {...}, "colors": {...}, "theme": "...", "background": "#RRGGBB", "base": "<preset>"} or a preset name to copy.
namestringyesName to save under, e.g. "Acme" (letters, digits, spaces, - or _; not a preset name).
overwriteboolean–true = replace a saved kit with the same name.

Structured output declared, but exposes no named fields.

No examples provided.

iwork_thumbnail ~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.

NameTypeReqDescription
out_dir––Folder for the extracted JPEG; omit for a temporary folder.
pathstringyesPath 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 ~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.

NameTypeReqDescription
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.
pathstringyesPath to the .numbers, .key or .pages file (absolute, or starting with ~).
size––Expected size in points (±0.6).
textstringyesText 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 ~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.

NameTypeReqDescription
assert_textstringyesText that must be visibly rendered; for Arabic, one word.
expected_pages––Expected page (or slide) count; omit to skip that check.
pathstringyesPath 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 ~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.

NameTypeReqDescription
columnsarrayyesColumn names, e.g. ["Q1", "Q2", "Q3"].
dataarrayyesOne list of numbers per row name, each as long as columns.
dry_runboolean–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_bystring–row (each row is a series) | column.
pathstringyesPath to the .key deck (absolute, or starting with ~).
rowsarrayyesRow names, e.g. ["2025", "2026"] (series when group_by="row").
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).
typestring–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 ~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.

NameTypeReqDescription
dry_runboolean–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.
imagestringyesImage file to place (png, jpg, heic, pdf…).
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide 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 ~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.

NameTypeReqDescription
after––Insert after this slide number; 0 = make it the first slide; omit = at the end.
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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_rowsinteger–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
rowsarrayyesThe table, header first: [["Region", "Q1"], ["Riyadh", 1200]]; text, numbers or null; "=…" is a formula.
slideintegeryesSlide 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 ~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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
set_themeboolean–true = also switch to the kit's theme first.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
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.
pathstringyesWhere to create the new .key deck; it must not exist yet.
slidesarrayyesThe 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 ~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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
color––Text colour "#RRGGBB".
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
size––Font size in points.
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
pathstringyesPath to the .key deck (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
pathstringyesPath to the .key deck (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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 ~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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesThe slide to move, 1-based.
tointegeryesWhere it should end up, 1-based.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
findstringyesText to find (literal unless regex=true).
pathstringyesPath to the .key deck (absolute, or starting with ~).
regexboolean–true = treat find as a regular expression.
replacestringyesReplacement text.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
pathstringyesPath to the .key deck (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
notesstringyesThe presenter notes text (replaces existing notes).
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
layoutstringyesLayout (master slide) name from keynote_inspect_style.
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
body––New body: a string, or a list of bullets; omit to leave it.
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide 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 ~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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
themestringyesTheme name from keynote_list_themes.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
automatic––true = advance to the next slide on its own.
delay––Delay before it starts, in seconds.
dry_runboolean–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.
effectstringyesTransition effect, e.g. "dissolve", "push", "magic move", or "none".
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .key deck (absolute, or starting with ~).
skippedboolean–true = hide the slide in the slideshow; false = show it again.
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).

Structured output declared, but exposes no named fields.

No examples provided.

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).

NameTypeReqDescription
pathstringyesPath to the .key deck (absolute, or starting with ~).
slideintegeryesSlide number, 1-based (keynote_list_slides lists them).
widthinteger–Image width in pixels (320–2560).

No output schema declared.

No examples provided.

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.

NameTypeReqDescription
actionstringyesstart | stop | next | previous.
from_slideinteger–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 ~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.

NameTypeReqDescription
dry_runboolean–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_columnsinteger–How many columns on the left are headers.
header_rowsinteger–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.
pathstringyesPath to the .numbers file (absolute, or starting with ~).
rowsarrayyesThe data, header first: [["Region", "Revenue"], ["Riyadh", 1200]].
sheet––Existing sheet to add it to; omit for the first sheet.
table_namestringyesName of the new table (must not exist on that sheet).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
bandingboolean–true = tint alternate body rows.
dry_runboolean–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.
pathstringyesPath 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 ~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.

NameTypeReqDescription
pathstringyesWhere to create the new .numbers file; it must not exist yet.
sheetsarrayyesSheets 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 ~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.

NameTypeReqDescription
atintegeryes1-based position of the first one to delete.
countinteger–How many to delete.
dry_runboolean–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.
pathstringyesPath 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.
whatstringyesrows | columns.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .numbers file (absolute, or starting with ~).
refstringyesOne 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–yesNew 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 ~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.

NameTypeReqDescription
csv_pathstringyesThe CSV or TSV file to read (UTF-8).
delimiter––Column separator, e.g. "," or "\t"; omit to detect it.
header_rowsinteger–How many rows at the top are headers (styled and kept on top).
numbersboolean–true = plain numbers become numbers; false = keep every cell as text.
pathstringyesWhere to create the new .numbers file; it must not exist yet.
sheetstring–Name for the new sheet.
tablestring–Name for the new table.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
at––1-based position to insert before; omit to append at the end.
countinteger–How many to insert.
dry_runboolean–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.
pathstringyesPath 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]].
whatstringyesrows | columns.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
pathstringyesPath 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 ~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.

NameTypeReqDescription
cellsstringyesThe range to merge, e.g. "A1:C1". Refused if it would hide values.
dry_runboolean–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.
pathstringyesPath 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.

Install

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

# add to Claude Code
claude mcp add arkanji-iwork-studio -- uvx iwork-studio
Common questions

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.