iWork Studio MCP Server
iWork Studio MCP Server gives AI agents the ability to read, create, edit, design, export, and present Apple Numbers, Keynote, and Pages files, with every write backed up, verified, atomic, and undoable.
Capabilities & discovery: check what the Mac can do (
iwork_capabilities), find iWork files (iwork_find), read file metadata (iwork_metadata), get preview thumbnails (iwork_thumbnail), and inspect templates (iwork_list_templates).Reading: read any
.numbers,.key, or.pagesfile into JSON (iwork_read); inspect Numbers formatting (numbers_inspect_format), Keynote styling/themes/layouts (keynote_inspect_style,keynote_list_themes,keynote_list_slides), and Pages tables/placeholders (pages_read_tables,pages_list_placeholders).Creating files: build Numbers files from data (
numbers_create) or CSV/TSV (numbers_import_csv); create Keynote decks from outlines with charts and tables (keynote_build_deck); make files from built-in templates (iwork_create) or from your own files (iwork_create_from_template).Editing content: set Numbers cells, formulas, rows/columns, tables, sorting, and recalculations (
numbers_edit_cell,numbers_set_formula,numbers_insert,numbers_delete,numbers_add_table,numbers_sort,numbers_recalculate); edit Keynote text, slides, notes, images, charts, tables, transitions (keynote_set_slide_text,keynote_replace_text, slide ops,keynote_add_chart,keynote_add_table,keynote_add_image,keynote_set_transition); edit Pages text, body, placeholders, and table cells (pages_replace_all,pages_set_body,pages_fill_placeholders,pages_set_table_cells).Design: use six built-in design kits (executive, banking, classic, teal, analytics, midnight) via
iwork_list_design_kits, extract a brand kit from existing files (iwork_extract_design_kit), save/delete kits (iwork_save_design_kit,iwork_delete_design_kit), and apply kits to Numbers tables (numbers_apply_design) or Keynote decks (keynote_apply_design); fine-tune styles withnumbers_set_cell_style,numbers_set_number_format,numbers_set_borders,numbers_set_dimensions,numbers_set_headers,numbers_merge_cells,keynote_format_text,keynote_set_theme,keynote_set_slide_layout.Review & verify: run Keynote design review for overflow, overlaps, and small text (
keynote_review_deck), render a slide as an image (keynote_slide_image), verify text renders (iwork_verify_render) and format matches (iwork_verify_format).Export & present: export to PDF, Excel, CSV, Word, EPUB, text, RTF, PowerPoint, images, or movie, with optional passwords (
iwork_export); run slideshows (keynote_slideshow).Safety & undo: every write supports
dry_runpreviews, versioned backups viaiwork_list_backups, and one-call undo viaiwork_restore_backup; writes are atomic, verified, and refused rather than damaging files.Arabic/RTL support: exact round-trips of Arabic text, Arabic-Indic digit preservation, and direction checks in Pages.
Toolset filtering: optionally load only some toolsets (
files,numbers,keynote,pages,design) to reduce context.
Provides tools for reading, creating, editing, formatting, theming, reviewing, and exporting Apple Numbers, Keynote, and Pages documents. It can manage spreadsheet cells, formulas, tables and charts; Keynote slides, layouts, transitions, presenter notes and images; and Pages body text, placeholders and existing tables, with exports to PDF, Office formats, CSV, EPUB, RTF and more.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@iWork Studio MCP ServerTurn sales.csv into a Numbers file and add a bold header with a total row"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Give your AI the keys to Apple iWork.
Create, edit, format, theme and export Numbers, Keynote and Pages files from Claude or any AI agent. Every write is backed up, checked and swapped in atomically, and any change can be undone with one call.
Install · What it can do · Safety · All 64 tools · For AI agents · Changelog
▶ Watch the film with sound (46s) · Read the launch story
Install
Your app | Do this |
Claude desktop app, one click (Mac) | Download |
Claude desktop app (Mac, from Terminal) | Paste in Terminal: |
Claude Code, as a plugin (tools + skill) |
|
Claude Code, tools only |
|
Cursor, VS Code, Codex, any MCP client |
|
That's it. The installer sets up uv if needed, and uv brings its own Python.
Fence it (recommended):
… | sh -s -- --roots ~/Documents ~/Desktoplimits it to those folders. Other clients: setIWORK_STUDIO_ROOTS(:-separated).Load less (optional): only work in Keynote? Set
IWORK_STUDIO_TOOLSETS=keynote,design(any offiles,numbers,keynote,pages,design; default all). Fewer tools keep the AI focused and its context small. The Claude Desktop extension has a Toolsets field; in Claude Code:claude mcp add iwork-studio -e IWORK_STUDIO_TOOLSETS=keynote,design -- uvx --from git+https://github.com/Arkanji/iwork-studio iwork-studio-mcp. Capabilities, read, find, undo and the kit list always load.First run: macOS asks once whether Claude may control Keynote / Pages / Numbers. Click OK. (Missed it? System Settings → Privacy & Security → Automation.)
Check it: ask "what can iwork-studio do on this Mac?".
Remove:
uvx --from git+https://github.com/Arkanji/iwork-studio iwork-studio-mcp uninstall
AI agent setting this up for someone? Pick the row for their app, run it, then call
iwork_capabilities. Rules for using the tools are inAGENTS.md.
Related MCP server: docforge-mcp
Just ask, in English or Arabic
"Build a 6-slide pitch deck on programmable gift cards in the midnight kit, with speaker notes, and export it to PowerPoint."
"Turn sales.numbers into a board deck: chart the quarters, a table of the top regions, in our Resal kit."
"Take the fonts and colours from brand.key and save them as our Resal kit."
"Review pitch.key and fix anything that overflows or is too small to read."
"Make budget.numbers look professional with the banking kit — and show me a preview first."
"Turn sales.csv into a Numbers file, make the header bold on a teal fill, show column B as SAR with two decimals, and add a total row."
"In pitch.key, switch to the Gradient theme, make the title on slide 1 white at 60 pt, add a dissolve between every slide, and put logo.png on the last slide."
"Add a bar chart of revenue by quarter for 2025 and 2026 to slide 4."
"Duplicate slide 3, move the copy to the front and add presenter notes: ملاحظات المتحدث"
"Fill the Name and Date fields in offer-letter.pages, then export it as a password-protected PDF."
"In the invoice.pages table, set the quantity in B3 to 12 and make D9 the total of D2:D8."
"Find my Keynote decks from this week and export each one to PowerPoint."
"Undo the last change to budget.numbers."
What it can do
Numbers | Keynote | Pages | |
Read | Every sheet, table, cell, formula and format | Every slide's text, notes, layout, theme, styling and charts | Body text, placeholders and tables |
Create | From data or CSV ⚡ · from a built-in template · from your own file | A designed deck from an outline, with chart and table slides (straight from a Numbers table) · from a built-in theme · from your own deck | From a built-in template · from your own file |
Edit content | Cells ⚡ · formulas · recalculate · insert/delete rows and columns ⚡ · add tables and sheets ⚡ · sort | Find/replace across the deck ⚡ · slide titles and bullets · add, duplicate, delete, move, hide slides · presenter notes · images · charts · tables | Replace text everywhere · replace the body · fill placeholders · table cells (text, numbers, formulas) |
Design | Design kits ⚡ · your brand kit ⚡ · fonts, colours, fill, alignment, wrap ⚡ · currency, %, dates, decimals ⚡ · borders ⚡ · widths and heights ⚡ · headers ⚡ · merges ⚡ | Design kits · your brand kit · theme · slide layout · text font, size and colour · styled tables · transitions | — |
Review | Design review of what Keynote draws: text off the slide or past its box, text Keynote had to shrink, overlaps, small text, crowded slides · any slide as an image | ||
Export | PDF · Excel · CSV | PDF · PowerPoint · images · movie | PDF · Word · EPUB · text · RTF |
Present | Start, stop, next, previous |
⚡ = works anywhere, no app needed (pure Python). Everything else drives the real app on a Mac with a logged-in session, classic iWork or the Creator Studio apps.
Every file type: preview any change before it's made (dry_run), look up metadata, pull the preview thumbnail, find files with Spotlight, check that a word is visibly rendered, check the rendered font/size/colour, list backups and undo.
What it won't do
On purpose, so it never breaks a file:
Files with charts are refused by the tools that work without the app: their rewrite can silently break a chart's link to its data. The app-driven tools (Keynote slides, theming, transitions, images; Numbers formulas and sort) work on them and check every chart is still there.
Charts in Numbers and Pages can't be created: Apple doesn't make them scriptable. Keynote charts can be added. To chart sorted data without touching a Numbers chart, sort into a new table (
numbers_sortwithto_new_table) and build a Keynote chart slide from it.Pages is limited to text and existing tables: replace, set body, placeholders and table cells. New tables can't be created (Pages 15 doesn't script it), and page-layout documents, like most letter templates, have no body text. There is no Pages file format parser anywhere, so it doesn't fake one.
Formulas and row shifts: in a table that has formulas, rows and columns can only be appended without the app. Inserting in the middle would leave references pointing at the wrong cells.
Not scriptable by Apple, so not offered: Numbers table styles, Keynote shape fill and text alignment, deleting a Keynote table, editing a theme's master slides. Page margins and page setup are planned.
Designed, not just edited
Six design kits turn a plain deck or table into something you'd present: a font pair (Latin + Arabic, all bundled with macOS — nothing to install), a restrained palette checked for WCAG contrast, and a type scale.
Kit | Feel |
| Calm and corporate: slate neutrals, one blue accent |
| Trust and weight: deep navy, restrained gold |
| Formal reports and boards: serif headings, navy and amber |
| Fresh and confident: deep teal |
| Data-forward: strong blue, amber highlights |
| Dark stage: near-black slides, white titles, mint accent |
Build with one (keynote_build_deck(..., kit="midnight")), restyle anything (keynote_apply_design, numbers_apply_design), or bring your brand as colours and fonts — contrast is checked. Agents also get a design guide: one idea per slide, titles that state the takeaway, right-aligned numbers, restrained colour.
Your brand, once. Point iwork_extract_design_kit at a deck or table that already has your look: it reads the fonts (Latin and Arabic) and colours, and saves them as a named kit you can use anywhere a kit goes. Or save your colours and fonts directly with iwork_save_design_kit.
Numbers on slides. A slide in keynote_build_deck can carry a chart or a table, from data or straight from a Numbers table: the header row gives the columns, the first column the rows. Tables get the kit's header band, fonts, banding and right-aligned numbers, and every cell is read back.
It checks its own work. keynote_review_deck renders the deck through Keynote and compares every drawn line with its text box: text off the slide or running past its box is an error; text Keynote had to shrink to fit, overlapping boxes, text under 18 pt and crowded slides are warnings. keynote_slide_image hands a slide back as an image, so an agent can look before it says "done".
The safety model
An iWork app will happily say "saved" about a file it just broke. Nothing here trusts "saved".
backup → change a scratch copy → re-open it and compare → atomic swap
↘ anything off: your file is untouched, the error says whyBackup first, versioned, next to the file in
<file>.backups/.Re-read and compared: exactly the requested change happened, and nothing else did. A cell edit checks every other cell. A row insert checks every cell at its new position. A slide op checks every other slide. A sort checks it's a pure reorder, and refuses up front when the table's formulas read other rows (Numbers' own sort would break them). On files with charts, every chart is counted before and after; on decks with tables, every table's cells are compared. An export is read back with a second, independent tool.
Atomic swap: the file is replaced in one step, so a crash can't leave half a file.
The app's "ok" is never trusted. App-driven writes are re-read from disk, and a write that "succeeded" but didn't land is rolled back.
Undo is one call:
iwork_list_backups→iwork_restore_backup. The restore backs up the current version first, so undo can be undone too.Preview first: every write takes
dry_run=true. It runs the real change on a throwaway copy, with every check, and shows exactly what would change. Your file isn't touched.New files never overwrite an existing one.
Refuse, don't mangle. The worst case is a clear "no", never a broken file.
Arabic & RTL
Arabic text round-trips exactly in all three apps, including presenter notes, Pages placeholders and Pages table cells.
Paragraph direction is checked in Pages. A replace that flips a right-to-left paragraph to left-to-right is rolled back. Pages writes new paragraphs left-to-right, even Arabic ones, and scripting can't change that, so those are flagged: set the direction in Pages (Format › Text).
Values are kept as typed: Arabic-Indic digits (
١٢٣),"$1,234.56"and=…text stay text. Pass a real number when you want a number.When checking a rendered PDF, assert one Arabic word. PDF text layers reorder multi-word RTL text.
All 64 tools
Writes are marked destructive and reads read-only, so clients can ask before writing. Every write that changes an existing file takes dry_run=true for a preview. Every tool has a title, every parameter a description, and every tool says when to use it instead of its siblings. Need fewer? Load only some toolsets (see Load less under Install).
Tool | What it does |
| What this machine can do: apps, GUI session, which routes work |
| Any |
| Find iWork files by kind and name (Spotlight on a Mac) |
| Template, app builds, format version, slide count · the stored preview image |
| New file from Apple's built-in templates · copy of your own file |
| Built-in templates (Numbers, Pages) and themes (Keynote) |
| Design kits: fonts, palettes, type scale — presets and your saved kits |
| A kit from your own deck or table: its fonts and colours; save it by name |
| Keep your brand kit by name · remove one |
| PDF, Excel, CSV, Word, EPUB, text, RTF, PowerPoint, slide images, movie; optional password |
| Rendered PDF shows this text · with this font, size, colour, page size |
| Undo |
Tool | What it does |
| New file from rows of data · from a CSV/TSV |
| Set one cell |
| Put a formula in a cell; Numbers computes it |
| Have Numbers recompute every formula after edits made without it |
| Rows or columns, anywhere |
| New table on a sheet, or on a new sheet |
| Sort body rows by a column. A table whose formulas read other rows is refused, since Numbers' sort would break them; |
| Widths, heights, headers, merges, and every cell's style, number format and borders |
| Font, size, bold/italic/underline/strike, colours, fill, alignment, wrap |
| Number, currency (any ISO code), %, scientific, fraction, date, text; decimals, separators, negatives |
| All / outline / inner / one side; width, colour, style |
| Column widths and row heights · header rows/columns · merges |
Tool | What it does |
| A new deck from an outline: titles, bullets, notes, images, chart and table slides, transition, design kit |
| Design review of the rendered deck: off-slide and overflowing text, overlaps, small text, crowded slides |
| One slide as an image, to look at |
| Fill a slide's title and body |
| Restyle every slide from a design kit |
| Find/replace on every slide, formatting untouched |
| Every slide's text, notes, hidden state and chart count |
| Slide operations |
| Presenter notes |
| Available themes · a deck's theme, layouts and text styling |
| Theme · one slide's layout · one text item's font, size, colour |
| Effect, duration, delay, auto-advance |
| Place an image on a slide |
| Add a bar, line, area, pie or scatter chart from data |
| Add a table, styled from a design kit; every cell is read back |
| Start, stop, next, previous |
Tool | What it does |
| Checks Pages can answer (run once first) |
| Replace text everywhere · replace the whole body (resets its formatting) |
| Template fields like Name and Date |
| Read every table · write text, numbers and formulas into an existing table |
Keynote slide, theme, transition and image tools refuse a deck that's open in Keynote (they never close a window that may hold unsaved work). To hide them all: IWORK_STUDIO_DISABLE_SLIDE_OPS=1.
Prompts. Clients that show MCP prompts get four ready-made workflows: Pitch deck from an outline, Report deck from a Numbers table, Restyle with my brand and Make this table look designed. Each writes to the design rules, builds in one call, previews before restyling, and runs the design review before it calls the job done.
For AI agents
AGENTS.md: setup and usage rules for any agent (Codex, Cursor, Copilot, Gemini; Claude Code reads it viaCLAUDE.md).MCP instructions: the server sends its rules on connect, so the model has them even without this repo.
Skill:
skill-pack/SKILL.md, auto-discovered by Claude Code in this repo, orbash skill-pack/install.shfor other skill-based agents. It includes CLI scripts with JSON output for agents without MCP.llms.txt: a short machine-readable summary.
The contract: JSON in, JSON out. Errors are typed and say what to tell the user: ChartRefusalError, DocumentOpenError, PagesOutOfScopeError, AquaSessionError (no Mac GUI here) and so on. Don't retry a refused write with a trick.
Python
pip install iwork-studio # Python 3.12from iwork_studio import numbers_structure, numbers_format, numbers_io, keynote_io, keynote_slides, exporter, backups
from iwork_studio import keynote_deck, design, review
keynote_deck.build_deck("pitch.key", [{"title": "رسال", "body": "Programmable value"},
{"title": "Why now", "body": ["Trust", "Access"]},
{"title": "Riyadh leads growth", "chart": {"type": "bar", "from": "sales.numbers"}}],
kit="midnight") # macOS + Keynote
review.review_deck("pitch.key")["findings"] # macOS + Keynote
design.extract_kit("brand.numbers", name="Resal", save=True)
numbers_structure.import_csv("sales.csv", "sales.numbers")
design.apply_to_numbers("sales.numbers", "banking")
numbers_format.set_cell_style("sales.numbers", "A1:D1", bold=True, fill_color="#1A7F79", font_color="#FFFFFF")
numbers_format.set_number_format("sales.numbers", "B2:B99", "currency", currency_code="SAR", decimal_places=2)
numbers_io.edit_cell("sales.numbers", "B2", 2500)
keynote_io.edit_text("pitch.key", "2025", "2026")
keynote_slides.set_presenter_notes("pitch.key", 1, "ملاحظات") # macOS + Keynote
exporter.export("pitch.key", "pptx") # macOS + Keynote
backups.restore_backup("sales.numbers", backups.list_backups("sales.numbers")[0]["name"])save in <path>is denied by the iWork sandbox. In-placesaveandexportwork. →sandbox-trap.mdKeynote's slide
title/bodyproperties throw-1700. Use the text item'sobject text. →keynote-1700-defect.mdChart files corrupt quietly when the file-level libraries rewrite them, so those routes refuse them. When the app makes the edit it keeps its own charts linked, so app-driven routes allow them and count every chart before and after.
Byte-equal saves don't exist in iWork's format. The real bar is semantic: it reopens, and the full model matches.
First-run permission and template-chooser dialogs block every script call. A preflight turns the hang into one clear prompt. →
tcc-preflight.md"Creator Studio" apps have different names. A hardcoded
Application("Numbers")drives the wrong app; names are resolved per call. →apps.pystdout is the MCP wire. Import-time warnings from libraries would corrupt it, so they go to stderr.
Keynote's JavaScript insert and move are broken; AppleScript
make new slideandmove slide … to before slide …work.Keynote master slides can't be reached from JavaScript (
-1700); layouts go through AppleScript.numbers-parser doesn't save in-place style edits. Styles are registered first, then applied.
numbers-parser stored 12 as 12.000000000000002. Decimals are now encoded exactly.
numbers-parser doesn't update formula references when rows move, so mid-table inserts in formula tables are refused.
Keynote colours are 0–65535 per channel, not 0–255 or 0–1.
Pages page-layout documents have no body text (
bodyText()is null), and most letter and flyer templates are page layout. Placeholders are filled and checked across every text box instead.Pages tables are invisible to JavaScript scripting but readable and writable from AppleScript; creating tables is broken in Pages 15, so only existing tables are offered.
The Pages sandbox refuses AppleScript
openfor files outside it; JavaScriptopenis allowed, so documents are opened that way and then found by their exact path.numbers-parser can break formulas on re-save (an upstream report). Every no-app write compares every formula, so a broken one is caught and nothing changes.
Numbers doesn't recalculate formulas when it opens a file changed without it: a total keeps its old result. Edits made without the app say so, and
numbers_recalculatehas Numbers recompute every formula.A rounding library used by numbers-parser wipes every warning filter in the process on each save. It's wrapped so it stays quiet without touching anyone else's settings.
Don't keep the repo in iCloud Drive. Sync creates "main 2" copies inside
.git.Keynote creates tables only one way:
tell slide n to make new tableworks, whilemake new table at end of tables of slide nand deleting a table fail with-10000. A failed table add is undone by restoring the backup.
More, each with its status: jxa-traps.md (including traps borrowed from reichenbach/iwork_mcp).
pure Python file parsers (headless, deterministic) → .numbers everything, .key text
the real app via AppleScript / JXA → .key slides & theming, .pages text & tables, formulas, sort, export, render checks
MCP server · CLI scripts · skill → thin wrappers over the same library and the same safety modelsrc/iwork_studio/ numbers_io · numbers_format · numbers_structure · keynote_io · keynote_slides · keynote_theme
keynote_deck · keynote_table · design · review · preview · pages_io · app_ops · exporter
helpers · format_check · render_verify · pdf · backups · apps · mcp_server
mcpb/ Claude Desktop extension manifest (scripts/build_mcpb.sh builds the .mcpb)
skill-pack/ SKILL.md · CLI scripts · references (capabilities, traps, pins); also the Claude Code plugin
.claude-plugin/ plugin marketplace (one plugin: skill-pack/)
tests/ headless suite (CI) · `pytest -m aqua` = live suite for a Mac with iWork
install.sh one-line setup for the Claude desktop appContributing
git clone https://github.com/Arkanji/iwork-studio.git && cd iwork-studio
uv run --extra test pytest -m "not aqua" # headless suite, what CI runs
uv run --extra test pytest -m aqua # live suite: a Mac with Numbers, Keynote and Pages
scripts/live.sh # the same, unattended: logs to ~/.iwork-studio/probes, quits the apps it openediWork changes between releases. If something breaks, check the capabilities and traps, run the live suite, and pin what changed. New write routes must follow the safety model and come with tests that prove the rollback. Clone outside iCloud-synced folders.
License
MIT, traps included. Take them.
Available Tools
64 toolsiwork_capabilitiesWhat this Mac can doARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description's added content is mostly an enumeration of what gets reported, which the output schema already conveys; it discloses no auth needs, cost, or side effects beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening is front-loaded well, but 'Call first when unsure' appears twice in near-identical sentences and the following clause repeats the enumeration already given. The redundancy costs space without adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only probe with an output schema and full annotations, the definition covers when to call it and roughly what it reports. Return-value detail is legitimately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; it adds no misleading parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete diagnostic scope: routes, GUI session, installed apps, and Keynote slide-op status, so an agent knows it reports machine capabilities rather than performing document work. It is distinguishable from siblings like iwork_metadata or iwork_verify_format, though the phrasing is loose and the enumerated items read as output contents rather than a crisp verb+resource statement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Call first when unsure what this machine can do') and an explicit exclusion ('Not needed before plain reads of .numbers or .key files'). An agent can decide whether to call it without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_createNew file from a built-in templateADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Where to create the new file (.numbers, .key or .pages); it must not exist yet. | |
| template | No | Template or theme name from iwork_list_templates; omit for Blank / Basic White. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=false), and the description adds real behavioral facts beyond them: it refuses to overwrite, requires macOS plus the installed app, and treats an omitted template as Blank/Basic White. It stops short of describing failure modes or the response, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and keeps alternatives in a single compact trailing sentence. The telegraphic slash-separated phrasing is dense but nothing is wasted; the only slight cost is readability of the parenthetical Keynote-themes note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Given that, the description covers prerequisites (macOS + app), overwrite behavior, the blank-template default, and routing to sibling tools — everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both path and template, including the must-not-exist constraint and the omit-for-blank rule. The description restates those points and adds only the pointer that names come from iwork_list_templates, which is marginal added value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (create) plus resource (a new .numbers/.key/.pages file from Apple's built-in templates) and names the sibling tools it is not. An agent can distinguish it from iwork_create_from_template, numbers_create, and keynote_build_deck without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives when-to-use (a new, empty file from Apple's templates) and three named alternatives with their selecting conditions: iwork_create_from_template for the user's own file, numbers_create for a Numbers file from data, keynote_build_deck for a finished deck from an outline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_create_from_templateNew file from your own fileADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Where to create the new file; it must not exist yet. | |
| template | Yes | The user's own .numbers, .key or .pages file to copy. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-idempotent, destructive operation, so the safety bar is partly covered. The description adds real behavioral context beyond them: it copies rather than moves, verifies the copy opens, and refuses to overwrite an existing path. It does not explain why destructiveHint is true given the no-overwrite guarantee, but there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, with the core action and the no-overwrite guarantee front-loaded before the routing guidance. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter copy tool with full schema coverage, an output schema, and annotations covering the safety profile, the description supplies everything an agent needs: the action, the source-file constraint, the overwrite refusal, and the sibling it replaces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the 'must not exist yet' constraint on path. The description restates the template/path roles without adding format or syntax detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (start a new document by copying one of the user's own .numbers/.key/.pages files) and explicitly distinguishes itself from the sibling iwork_create, which handles Apple's built-in templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('when the user has their own template or past file to start from') and an explicit alternative ('For Apple's built-in templates use iwork_create'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_delete_design_kitDelete design kitADestructive
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 | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of the saved kit to delete (presets can't be deleted). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, it discloses the recovery behavior — the deleted kit's contents are returned so it can be re-saved — plus the constraint that presets are undeletable. That recovery detail is exactly the kind of context annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and its constraint, then the recovery behavior, then when-to-use and the alternative — all in two compact sentences with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be spelled out, and the description still notes the key return property (kit contents for re-saving). Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'name' parameter is already documented with the same preset constraint. The description adds no format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete a saved design kit') and immediately scopes it with the 'presets can't be deleted' constraint, distinguishing it from iwork_save_design_kit, iwork_extract_design_kit, and iwork_list_design_kits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('Use only when the user asks to remove a saved kit') and names the alternative path for the adjacent intent ('To change a kit, save it again with overwrite=true instead'). This is a complete routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_exportExport (PDF, Excel, Word, PowerPoint…)ADestructive
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 | Required | Description | Default |
|---|---|---|---|
| out | No | Output path (a folder for images); omit to write next to the source. | |
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). | |
| format | Yes | Numbers: pdf | xlsx | csv. Pages: pdf | docx | epub | txt | rtf. Keynote: pdf | pptx | images | movie. | |
| password | No | Optional password for pdf, xlsx, docx or pptx. | |
| overwrite | No | true = replace an existing output (the old one is kept as a backup or returned). Default false. | |
| image_format | No | Slide images only: jpeg | png | tiff. | |
| image_quality | No | good | better | best. | |
| password_hint | No | Optional hint shown with the password prompt. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds genuinely new context: the export is verified against the source by a second tool, the source is confirmed unchanged, and output defaults next to the source. It does not discuss failure modes (e.g., what happens if the format is unsupported for that app) or the backup behavior on overwrite, which the schema covers instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and format matrix, then moves to optional settings and caveats in a logical order. Slightly repetitive — the per-app format list duplicates the schema's format description and the title — but every remaining sentence (verification, macOS requirement, the edit-in-place warning) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is correctly omitted, and annotations plus the full param schema cover the mechanics. The description supplies the platform requirement and the post-export verification step, which are not in structured fields. It stops short of covering error/unsupported-format handling, leaving a small gap for a mutation tool with destructive semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all eight parameters are already documented in the schema, including out, password, overwrite, image_format, and image_quality. The description restates the format options and mentions password/hint/image settings, but adds no syntax, constraints, or defaults beyond the structured data. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export) and resource, and enumerates the exact format matrix per app (Numbers: pdf|xlsx|csv, Pages: pdf|docx|epub|txt|rtf, Keynote: pdf|pptx|images|movie). This lets an agent distinguish it from conversion-adjacent siblings like iwork_verify_format or iwork_create without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use to hand the result over in another format') plus a clear when-not with an alternative: 'Never export to docx/pptx/xlsx to edit and convert back: edit the iWork file directly.' Also names the platform prerequisite (macOS + the app). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_extract_design_kitExtract design kitAIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| name | No | Name for the kit, e.g. "Resal" (required with save=true). | |
| path | Yes | A .key deck or .numbers table that already has the look to capture. | |
| save | No | true = save it under name for reuse; contrast must pass. | |
| sheet | No | For .numbers: the sheet holding the styled table. | |
| table | No | For .numbers: the styled table. | |
| overwrite | No | true = replace a saved kit with the same name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the source file is never changed, .numbers parses styles without launching the app while .key needs macOS plus Keynote, unsupported elements fall back to the nearest preset and are disclosed in notes, and saving requires a name and a passing contrast check. These are real operational constraints the agent cannot derive from readOnlyHint/destructiveHint/idempotentHint alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the outcome, then platform behaviour, then side effects, then the routing rule – a sensible order. It is dense and the mid-section packs several clauses into long sentences, which costs a little readability, but nearly every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter extraction tool with an output schema, the description covers platform requirements, side effects, fallback behaviour and naming/reuse semantics. Return values are covered by the output schema, so nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the save/name coupling ('save=true with a name keeps it for reuse by name') and the contrast gate, which the schema only mentions in passing. It stops short of clarifying sheet/table selection beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (extract a design kit from a deck or table) and enumerates exactly what is captured: heading/body fonts in Latin and Arabic plus title, body and brand colours. It also explicitly names the sibling it is not (iwork_save_design_kit), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('the user has a deck or table that already has their brand look') and an explicit alternative with the selecting condition ('if they give colours and fonts directly use iwork_save_design_kit instead'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_findFind iWork filesARead-only
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 | Required | Description | Default |
|---|---|---|---|
| kind | No | numbers | keynote | pages; omit for all three. | |
| name | No | Part of the file name to match (case-insensitive). | |
| limit | No | Maximum results (1–500). | |
| folder | No | Folder to search; omit to search the allowed folders, else Documents, Desktop and Downloads. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, closed-world behavior, and the description adds real context: the folder fallback chain (folder -> allowed folders -> Documents/Desktop/Downloads) and that it uses Spotlight on macOS. That is useful beyond the annotations, though it doesn't cover things like performance or result truncation behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the tool's identity and ordering, then parameters, then usage guidance. Dense semicolon-packed phrasing but each clause carries information; only minor tightening is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation isn't needed. The description covers search scope, ordering, filtering, and the follow-up workflow, which is everything an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents kind, name, limit, and folder. The description restates kind and name semantics rather than adding new meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Find) and resource (Numbers/Keynote/Pages files) with the result ordering (newest first). It is clearly distinguishable from siblings like iwork_read, iwork_metadata, and the list/verify tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it when the user names a file loosely or the path is unknown, names the follow-up tool (iwork_read), and gives a when-not condition ('Not needed when you already have the path'). This is a complete routing rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_list_backupsList backupsARead-only
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: newest-first ordering, inclusion of the Keynote write manifest, and the behavioral fact that failed writes leave no backup. It stops short of discussing pagination or output shape, but the output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with what it lists and the ordering, followed by when to use and the key negative case. Every sentence earns its place with no repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, the annotation set covers the safety profile, and the description supplies the ordering, manifest inclusion, and failure semantics an agent needs. Nothing required to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage, and the schema already documents the accepted formats (.numbers, .key, .pages; absolute or ~-prefixed). The description adds no further semantics about the path argument, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), resource (versioned backups), and scope (every write left for this file, newest first), plus the Keynote write manifest. It is clearly distinguishable from the sibling iwork_restore_backup, which it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the trigger (user wants to undo or compare versions), routes to the alternative (iwork_restore_backup restores one), and gives an explicit when-not (not needed after a failed tool call, since failed writes never change the file). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_list_design_kitsList design kitsARead-only
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds minor context (presets vs. user-saved kits flagged as saved: true, fonts bundled with macOS), but the line 'Custom kits: pass {"fonts": {...}, "colors": {...}}' is confusing on a zero-parameter tool and reads like it belongs to the consuming tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what a design kit is before the usage instructions, which is good structure. It is somewhat dense and repeats the 'pass the name as kit= to keynote_build_deck, keynote_apply_design or numbers_apply_design' instruction already implied earlier, costing a little efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description need not explain the return shape, and it correctly focuses on purpose, content and integration with the styling tools. The only gap is the ambiguous 'Custom kits' sentence, which muddies rather than completes the picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The mention of passing a kit name as kit= refers to sibling tools' parameters, not this tool's, so it neither helps nor harms semantic coverage here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (design kits / presets / saved kits) and describes the contents of a kit (font pairs, palettes, type scale). This clearly distinguishes it from sibling list tools like iwork_list_templates and keynote_list_themes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance ('Use before any styling to pick a kit') and names the downstream consumers (keynote_build_deck(kit=…), keynote_apply_design, numbers_apply_design), so the agent knows why to call it. It does not, however, state any when-not condition or a true alternative to pick instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_list_templatesList templatesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| app | Yes | numbers | pages | keynote. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description still adds a real environmental prerequisite ('Needs macOS + the app') plus the downstream purpose of the returned names, which annotations cannot express. It stops short of describing output shape or ordering, but the output schema covers that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the noun scope before prerequisites and routing. Minor redundancy in re-listing the app values already present in the schema, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only enumeration tool with full annotation coverage and an output schema, everything an agent needs is present: what it lists, the required environment, and exactly which create-path to pair it with.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter's enum-like values are documented in the schema itself. The description's '(app: numbers | pages | keynote)' merely restates that, adding no syntax or constraint beyond it. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States precisely what is enumerated: built-in templates for Numbers/Pages and themes for Keynote, with the app discriminator named inline. It distinguishes itself from the lookalike sibling keynote_list_themes and from iwork_apply_design/iwork_create_from_template by scoping to built-in assets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing ('Use before iwork_create to get valid template or theme names') and an explicit exclusion ('Not needed for iwork_create_from_template, which copies the user's own file'). Both when-to-use and when-not-to-use are stated, with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_metadataFile detailsARead-only
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds real value by scoping what is disclosed (template, app build, slide counts) and framing it as non-content inspection. It stops short of stating edge behavior for non-iWork files, but the annotation coverage lowers the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both earning their place, with the capability listed first and the routing rule second. The mid-sentence enumeration is dense but each item is a concrete, useful fact, so it stays readable rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the annotations cover safety. The description is complete enough to invoke correctly; only minor gaps remain around behavior on unsupported or corrupt files, which the sibling/annotation context partially absorbs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single well-documented 'path' parameter (absolute or ~ paths), so the schema carries the parameter burden. The description adds no additional path syntax, accepted extensions, or format nuances beyond what the schema already states — baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (file metadata) and enumerates exactly what it reports: kind, size, modified, template, app builds, format version, slide count, embedded media count. It also explicitly distinguishes itself from the sibling iwork_read, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('use for file facts... without reading content') and names the alternative with its triggering condition ('For the content itself use iwork_read'). Nothing is left to inference for the read-vs-metadata decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_readRead an iWork fileARead-only
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered structurally. The description adds a genuine operational constraint not present in annotations: .pages requires the Pages app and a GUI session. It does not describe return shape, but an output schema exists to carry that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, each carrying distinct information (what it does, the GUI prerequisite, when to use it, and the two alternatives). No filler and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with a full output schema and read-only annotations, everything an agent needs is present: purpose, prerequisite for .pages, and explicit routing to sibling tools for formatting or metadata needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'path' parameter is already documented in the schema with absolute/~ syntax. The description adds no path-format guidance beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (.numbers/.key/.pages file) plus the output form (JSON). It explicitly distinguishes itself from sibling tools that also touch iWork files, so an agent can separate it from iwork_metadata and the inspect_format tools without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the positive case ('see a file's content before editing it'), the negative case ('Not for formatting details'), and names the exact alternatives (numbers_inspect_format, keynote_inspect_style) plus a cheaper option for a narrower need (iwork_metadata). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_restore_backupUndo: restore a backupADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). | |
| backup | Yes | Backup name from iwork_list_backups. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the write/irreversibility profile is covered. The description adds meaningful context beyond that: the operation is atomic and the current version is backed up first, so the action is itself reversible. This rollback guarantee is real behavioral value, though it is stated twice.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The key constraint is front-loaded, but the sentence 'The current version is backed up first' is repeated verbatim, making the description longer than needed. Structure is fine; redundancy costs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations cover the safety profile. The description supplies the essential prerequisites and side effect, though it could have used the freed space for something other than restatement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (path, backup) are already documented in the schema, including the backup-name source. The description reinforces that backup comes from iwork_list_backups but adds no format or syntax detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('atomically restore a backup'), and pins down the argument source ('a name from iwork_list_backups'). An agent can identify the operation and its input origin without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('Use to undo a change') and names the prerequisite tool that supplies backup names. It stops short of stating when not to use it or naming alternatives, but the routing context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_save_design_kitSave design kitAIdempotent
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": ""), 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 | Required | Description | Default |
|---|---|---|---|
| kit | Yes | {"fonts": {...}, "colors": {...}, "theme": "...", "background": "#RRGGBB", "base": "<preset>"} or a preset name to copy. | |
| name | Yes | Name to save under, e.g. "Resal" (letters, digits, spaces, - or _; not a preset name). | |
| overwrite | No | true = replace a saved kit with the same name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover write safety (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds substantial context beyond them: contrast is validated at 4.5:1, missing kit parts fall back to the 'executive' preset, preset names cannot be reused, and saved kits are never replaced unless overwrite=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and routes the alternative last, with each sentence carrying distinct information. It is dense and slightly technical, but nothing is redundant and all content earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers the kit payload, defaults, validation, overwrite behavior, naming constraint, and the sibling alternative, leaving no gap for an agent invoking this write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: that omitted kit fields default from the 'executive' preset, that a bare preset name is accepted to copy, and the cross-parameter rule that the name cannot collide with a preset name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Save a design kit by name for reuse'), and explicitly distinguishes itself from the sibling iwork_extract_design_kit. An agent can tell exactly what this does without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('Use when the user gives brand colours and fonts directly') and names the alternative with its selecting condition ('To capture them from an existing file use iwork_extract_design_kit'). This is textbook routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_thumbnailPreview imageARead-only
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). | |
| out_dir | No | Folder for the extracted JPEG; omit for a temporary folder. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds a genuinely useful behavioral caveat beyond the annotations: the image reflects the app's last save, not the user's latest edits, which sets correct expectations about staleness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core facts are front-loaded, but the draft is redundant: 'a quick look without opening the app' is restated as 'a quick look ... with no app', and the last-save caveat is stated twice. Tightening to two sentences would lose nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary. The description covers the key behavioral nuance (stored vs current render) and the sibling alternative, leaving no decisions an agent must make unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (path, out_dir) are already documented in the schema. The description adds no extra semantics about path formats or the temp-folder default, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Extract) and resource (the stored preview image / first page/slide), the output format (JPEG) and the return (its path). It clearly distinguishes itself from the sibling keynote_slide_image by contrasting a stored preview with a live render.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('for a quick look at the stored first-page preview with no app') and names the alternative plus the condition that selects it ('to see a slide as it renders now, use keynote_slide_image'). The routing decision is fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_verify_formatCheck rendered formattingARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| bold | No | Expected bold (true) or not bold (false). | |
| font | No | Expected font; matches when the drawn font name contains it, e.g. "Avenir". | |
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). | |
| size | No | Expected size in points (±0.6). | |
| text | Yes | Text that must appear in the rendered PDF; for Arabic, one word (multi-word RTL text is reordered). | |
| color | No | Expected text colour "#RRGGBB". | |
| page_width | No | Expected page width in points. | |
| page_height | No | Expected page height in points. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful non-annotation context: the tool performs an actual PDF export through the app, requires macOS and the application installed, and that font matching is substring-based. It stops short of noting runtime cost or failure modes for a launch-and-export operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences, front-loaded with the mechanism, then usage, then the sibling disambiguation. Dense but every sentence earns its place; minor parenthetical clutter ('name contains', unit lists) slightly reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter read-only verification tool with an output schema, the description covers mechanism, environment prerequisite, matching semantics, and sibling routing. Return-value detail is unnecessary given the output schema exists, so nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents each parameter's meaning and units (points, #RRGGBB, name-contains). The description reinforces the same matching semantics but adds no new parameter detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (verify formatting) and explains the mechanism precisely: export a PDF through the app and confirm `text` is drawn with a given font, size, color, bold, and page size. It explicitly names the sibling it is not (iwork_verify_render), so an agent can route correctly without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use to prove how a piece of text is drawn') and an explicit alternative with its selection condition ('To check text is merely present use iwork_verify_render'). It also states the prerequisite environment ('Needs macOS + the app'), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
iwork_verify_renderCheck text is renderedARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers, .key or .pages file (absolute, or starting with ~). | |
| assert_text | Yes | Text that must be visibly rendered; for Arabic, one word. | |
| expected_pages | No | Expected page (or slide) count; omit to skip that check. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnly, idempotent, non-destructive), yet the description adds the actual mechanism — it exports through the app to PDF — and the Arabic single-word constraint. It does not disclose failure behavior or where the intermediate PDF goes, so it stops short of full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: action first, constraint second, disambiguation last. No filler, and the most critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return contract need not be explained, and annotations cover safety. The description covers the mechanism and routing well; only minor gaps remain around failure semantics when the text is not rendered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the Arabic-specific guidance in the description merely repeats what the assert_text schema already says. No additional syntax, format, or expected_pages semantics are added, so this sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: export to PDF and assert `assert_text` is visibly rendered. It also explicitly distinguishes itself from iwork_verify_format (font/size/colour) and keynote_review_deck (whole-deck design).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('after an important write to prove the text really shows when rendered') plus two named alternatives with the conditions that select them. An agent can route correctly without opening another schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_add_chartKeynote: add chartADestructive
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 | Required | Description | Default |
|---|---|---|---|
| data | Yes | One list of numbers per row name, each as long as columns. | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| rows | Yes | Row names, e.g. ["2025", "2026"] (series when group_by="row"). | |
| type | No | bar | stacked_bar | horizontal_bar | stacked_horizontal_bar | line | area | stacked_area | pie | scatter (or a *_3d variant). | bar |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| columns | Yes | Column names, e.g. ["Q1", "Q2", "Q3"]. | |
| dry_run | No | 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 | No | row (each row is a series) | column. | row |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and non-idempotency; the description adds meaningful context beyond them by promising that text and other charts are 'verified untouched' and by explaining that dry_run=true previews on a throwaway copy and returns what would change. It still doesn't cover permissions or what happens on a malformed data shape, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and data model, then usage routing and safety notes; every sentence carries information. It is somewhat dense and repeats the full type enum already present in the schema, which is the only real waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with a full output schema, the description covers the data shape, chart-type options, grouping semantics, the dry_run safety valve, verification of untouched content, and sibling alternatives. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds semantics: it clarifies that rows are series when group_by='row' and that data holds one list of numbers per row name, which is the relationship the schema only states piecewise. It also restates the type enum, which is mild redundancy rather than new information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a chart to a slide from data') and immediately defines the data model (rows = series, columns = categories, data = rows × columns), which is the crux of the operation. It explicitly distinguishes itself from keynote_build_deck and keynote_add_table, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('Use for a chart on an existing slide') plus two named alternatives with the conditions that select them: keynote_build_deck for new decks and keynote_add_table for exact numbers. Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_add_imageKeynote: add imageADestructive
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 | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge in points (give with y); omit to let Keynote place it. | |
| y | No | Top edge in points from the slide's top-left corner (give with x). | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| image | Yes | Image file to place (png, jpg, heic, pdf…). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| width | No | Image width in points; height keeps the aspect ratio. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real context: text is verified untouched, and dry_run previews changes on a throwaway copy without touching the file. This meaningfully supplements the safety profile, though it doesn't describe post-placement state or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and key constraints, and every sentence carries routing or safety value. Slightly redundant in restating placement ('Place an image file...' then 'Use to place a picture or logo'), but overall tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% param coverage, the description needn't explain return values, and it covers the dry_run safety path and sibling routing. Complete enough to invoke correctly, missing only edge-case behavior for a destructive placement tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented (x/y pairing, width keeping aspect ratio, slide 1-based). The description mentions x/y/width briefly but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Place an image file ... on a slide') and explicitly names the sibling tools it is not (keynote_add_chart, keynote_add_table). An agent can distinguish it from keynote_slide_image and other siblings at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('place a picture or logo on a slide') and when-not-to-use with named alternatives ('For data, use keynote_add_chart or keynote_add_table rather than a picture of a chart'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_add_slideKeynote: add slideADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| after | No | Insert after this slide number; 0 = make it the first slide; omit = at the end. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, non-idempotent and destructive, so the safety profile is covered. The description adds genuinely non-structured context: that every other slide is verified unchanged, and that dry_run operates on a throwaway copy and returns what would change. It stops short of describing failure modes or when the verification can fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, each earning its place: placement rule first, verification behavior second, dry_run semantics third, alternatives last. No filler and front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-slide insertion with an output schema present, the description covers placement, preview mode, non-target-slide integrity, and sibling routing. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `path`, `after`, and `dry_run` including defaults. The description restates the `after` and `dry_run` semantics rather than adding syntax or edge-case detail beyond them, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert a slide') plus the placement semantics ('after slide number `after`, 0 = first, omit = end'). It also explicitly distinguishes itself from `keynote_duplicate_slide` and `keynote_build_deck`, so an agent can pick the right tool without reading other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit use case ('Use for a new blank slide in an existing deck') and routes to named alternatives for adjacent cases (copy a slide, whole new deck). The dry_run guidance adds a concrete when-to-use rule for risky edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_add_tableKeynote: add tableADestructive
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 | Required | Description | Default |
|---|---|---|---|
| x | No | Left edge in points (give with y); omit to let Keynote place it. | |
| y | No | Top edge in points (give with x). | |
| kit | No | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Resal") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| rows | Yes | The table, header first: [["Region", "Q1"], ["Riyadh", 1200]]; text, numbers or null; "=…" is a formula. | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| width | No | Table width in points; omit for Keynote's default. | |
| dry_run | No | 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 | No | How many rows at the top are headers (styled and kept on top). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive=true, non-idempotent, closed-world; the description goes well beyond them by disclosing verification behavior ('every cell, font and colour is read back; other slides and tables are checked untouched'), hard limits (50 rows × 15 columns), platform requirements, and dry_run semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the rows format, and nearly every clause carries load-bearing detail. It is dense and slightly run-on, packing constraints, styling, verification and routing into long sentences, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation. For a destructive multi-parameter mutation, the description covers safety (dry_run), limits, prerequisites, styling, and alternative tools — everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: rows cell typing (text/numbers/null, '=' prefix means formula), kit styling effects (header band, Arabic-aware fonts, banding, right-aligned numbers), and the pairing constraint on x/y.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a table to a slide') with the indexing convention made explicit (1-based). It routes clearly against siblings by naming keynote_add_chart and keynote_build_deck as the alternatives for different intentions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use for a table on an existing slide') and when-not ('In a new deck, put it in keynote_build_deck's outline; to show a trend use keynote_add_chart'). Prerequisites (macOS + Keynote) and the dry_run workflow are also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_apply_designKeynote: apply designADestructive
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 | Required | Description | Default |
|---|---|---|---|
| kit | No | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Resal") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. | executive |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| dry_run | No | 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. | |
| set_theme | No | true = also switch to the kit's theme first. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=false), and the description adds real context beyond them: text is verified unchanged, contrast is checked, and dry_run runs on a throwaway copy without touching the file. It does not contradict the destructive annotation (content is preserved, formatting is replaced). It stops short of noting reversibility or backup behaviour, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause and every sentence carries information (kit format, verification, dry_run semantics, routing). The paragraph is dense and multi-idea, which slightly hurts scannability, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-effect mutation tool with an output schema already present, the description covers what changes, how to preview safely, what is preserved, and which sibling to use instead. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: kit accepts a preset name from iwork_list_design_kits or a user-supplied fonts/colors object, and dry_run is characterized as a copy-based preview to show the user. It adds value but doesn't fully re-document every parameter's constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and scope ('restyle a whole deck from a kit') and enumerates exactly what gets changed: theme, title/body fonts, sizes, colours. It explicitly distinguishes itself from the sibling keynote_format_text ('For one text item use...'), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('restyle a whole deck'), a named alternative with its own trigger condition ('For one text item use keynote_format_text'), and a workflow prescription ('Preview with dry_run, then run keynote_review_deck'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_build_deckKeynote: build deckADestructive
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 | Required | Description | Default |
|---|---|---|---|
| kit | No | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Resal") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. | |
| path | Yes | Where to create the new .key deck; it must not exist yet. | |
| theme | No | Theme name from keynote_list_themes; the kit's theme is used when omitted. | |
| slides | Yes | The outline: [{"title": "…", "body": ["bullet", …], "notes": "…", "layout": "…", "image": "/path.png", "chart": {…}, "table": {…}}, …]; see the tool description for chart and table. | |
| transition | No | Transition for every slide, e.g. "dissolve". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the verification loop ("every slide is read back and checked"), the rollback behavior ("on any mismatch the new file is removed"), the never-overwrite guarantee, and the macOS+Keynote runtime requirement. This is exactly the context needed for a destructiveHint=true tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and safety, then examples. It is dense and semicolon-heavy, running a long way before the crucial routing sentence at the end, but almost every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is unnecessary, and the description covers safety, prerequisites, layout defaults, chart/table formats, kit usage, and next steps. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description supplies the nested chart and table object syntax that the flat schema (additionalProperties: true) leaves undocumented, plus the layout defaults and theme/transition sourcing. This is value the structured fields do not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Build a new Keynote deck from an outline") and explicitly distinguishes itself from the slide/text mutation siblings, which operate on existing decks. An agent can select it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the follow-up tool (keynote_review_deck), the design-kit sibling (iwork_list_design_kits), the theme source (keynote_list_themes), and the alternative set for editing existing decks. When-to-use and when-not-to-use are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_delete_slideKeynote: delete slideADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds context annotations cannot express: the deletion is recoverable via iwork_restore_backup, the last slide cannot be deleted, and dry_run works on a throwaway copy 'without touching the file'. These are the concrete consequences and limits an agent needs before mutating a deck.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each load-bearing: the action, the recovery path, the preview mode, and the alternative tool. Nothing is padded and the destructive action plus its guardrail are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile, a full schema, and an output schema handling return values, the description only needs to cover constraints and alternatives, which it does completely (recoverability, last-slide limit, dry_run, skip_slide escape hatch).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so path, slide, and dry_run are already documented in structured form; the description largely restates what the schema says (1-based numbering, dry_run semantics). Baseline 3 is appropriate since the schema carries the parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb and resource ('Delete slide number `slide`') and immediately scopes it with 1-based indexing. It is cleanly distinguished from sibling tools by naming keynote_skip_slide as the non-destructive alternative, so an agent never confuses removal with hiding.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: use it 'to remove a slide for good', use keynote_skip_slide 'to keep it but hide it', and use iwork_restore_backup to recover. It also routes to dry_run for risky edits, which is exactly the decision an agent must make before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_duplicate_slideKeynote: duplicate slideADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=false, so the mutating/non-idempotent profile is covered. The description adds the useful copy-placement behavior, but says nothing about permissions, what happens on an out-of-range slide number, or reversibility/undo. Adequate but not rich beyond what the annotations carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core effect and immediate placement, followed by the dry_run caveat and the sibling redirect. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering return values, the description need only explain the operation, placement, and sibling routing — all present. Minor gap: no guidance on invalid slide numbers or the effect of duplicating a skipped/hidden slide.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so path, slide (1-based), and dry_run semantics are all documented in the schema already; the description only restates the 1-based numbering and the dry_run preview. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('duplicate slide number `slide`') plus the exact effect ('the copy lands right after it'), and explicitly names the sibling it is not for ('For a blank slide use keynote_add_slide'). An agent can distinguish it from keynote_add_slide and keynote_move_slide without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Use to copy an existing slide (layout and content)') and a named alternative with its selecting condition ('For a blank slide use keynote_add_slide'). It also advises the dry_run-first workflow, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_format_textKeynote: format textADestructive
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 | Required | Description | Default |
|---|---|---|---|
| font | No | PostScript font name, e.g. "HelveticaNeue-Bold". | |
| item | No | Text item index on the slide (from keynote_inspect_style); or use match. | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| size | No | Font size in points. | |
| color | No | Text colour "#RRGGBB". | |
| match | No | A unique piece of the item's text, to pick it instead of item. | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, so the mutation risk is covered structurally. The description adds that dry_run previews on a copy without touching the file, but that behavior is already fully spelled out in the dry_run schema entry, so the added value beyond structured fields is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and parameters in the first clause, then terse notes on limits, dry_run, and the sibling alternative. Efficient overall, though the parenthetical e.g. examples make it dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations carrying the safety profile, the description covers the necessary ground for a single-item mutation tool. It names both target-selection methods and the preview escape hatch, leaving no blocking gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a little meaning by explaining the item-vs-match selection relationship, but otherwise paraphrases the schema's font/colour examples rather than adding new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: it sets font/size/colour of one text item on a slide, and immediately scopes it to a single item. It clearly distinguishes itself from keynote_apply_design, which restyles the whole deck, so an agent can route between them without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use for one text item's font, size or colour' and routes whole-deck work to keynote_apply_design. It also names exclusions ('Alignment and shape fill are not scriptable') and gives the safe-preview instruction for dry_run, which is real when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_inspect_styleKeynote: inspect styleARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered by structured data. The description adds the inspection scope and the 'read before theming' sequencing cue, but because an output schema exists, the enumerated return contents largely duplicate what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The middle clause repeats the same field list twice ('theme, layouts, and each text item's font, size and colour' vs. the earlier enumeration), which is wasted text. The front-loaded scope statement is good, but the redundancy costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering safety and an output schema covering return values, the description only needs to establish purpose, timing, and sibling routing — all of which it does. Minor gap: no note on cost or scale for large decks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'path' parameter is fully documented in the schema. The description says nothing about the path argument, so it adds no meaning beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and scope: a deck's theme, available slide layouts, and per-slide layout plus each text item's text/font/size/colour. It distinguishes itself from keynote_list_slides explicitly, though the opening fragment ('A deck's styling: ...') is grammatically loose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear directive ('Read this before theming') and a routing rule to a sibling ('For slide text and notes use keynote_list_slides'). It stops short of stating when this tool should NOT be used or its prerequisites other than sequencing before theming/formatting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_list_slidesKeynote: list slidesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so safety is covered. The description adds genuine behavioral value: it discloses exactly what is returned (text, notes, hidden flag) and establishes the dependency that slide numbers for later operations must come from this call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what is returned, then usage, then sibling routing. The second and third sentences restate the same 'see slide numbers/text/notes' idea twice, a small redundancy that keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no elaboration, and the description still covers purpose, ordering dependency, and sibling routing. Only minor redundancy and no note on filtering (e.g. hidden slides) leave a small gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'path' parameter is fully documented in the schema (absolute or ~-prefixed .key deck). The description adds nothing about the parameter, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('list slides') and enumerates the returned payload (text, presenter notes, hidden state). It also explicitly distinguishes itself from keynote_inspect_style, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use ('Use before slide operations to see slide numbers...') and names an alternative for a neighboring need (fonts/layouts via keynote_inspect_style). No explicit when-not or exclusion conditions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_list_themesKeynote: list themesARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: the list is machine-local ('on this Mac') and its values are the exact strings needed downstream. It does not discuss caching or refresh behavior, but the read-only annotation makes that low-stakes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler. The scoping constraint and the downstream tool names are front-loaded so the agent can act without reading further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be described, and annotations carry the safety profile. The description supplies exactly the missing piece — why to call it and where its output goes — making the definition complete for a zero-parameter enumerator.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the baseline is 4. The description still characterizes the semantic payload of the enumeration (theme names passable to set_theme), which goes slightly beyond a bare listing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (themes available in Keynote on this Mac), and scopes it to local availability. An agent can distinguish it from sibling listers like iwork_list_templates and iwork_list_design_kits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream consumers ('Use before keynote_set_theme or keynote_build_deck') and states the purpose of calling it ('to get valid theme names'). This is a clear when-to-use directive with the alternatives identified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_move_slideKeynote: move slideADestructive
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 | Required | Description | Default |
|---|---|---|---|
| to | Yes | Where it should end up, 1-based. | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | The slide to move, 1-based. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered structurally. The description adds genuinely new behavioral context: dry_run runs on a throwaway copy, executes every check, and returns what would change without touching the file. It does not state whether a committed move is reversible or what the returned change payload contains, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the positional contract before the dry_run preview and the sibling redirect. Every sentence carries distinct, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no exposition, and all four parameters are documented. The description covers mutation risk via dry_run and the sibling routing; the only shortfall is not noting reversibility or ordering side effects when the destination index is out of range.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description earns above that by restating both slide and to as 1-based positions and by explaining dry_run's semantics beyond the schema's own wording. It adds orientation that helps prevent off-by-one index errors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource (move slide) and defines both positional arguments including their indexing base. It clearly separates itself from the copy-oriented sibling by naming keynote_duplicate_slide as the tool for copying rather than moving.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use to reorder slides' and then names the alternative tool (keynote_duplicate_slide) for the adjacent use case of copying to a new position. The dry_run guidance ('Use it before broad or risky edits and show the user') gives concrete invocation advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_replace_textKeynote: replace textADestructive
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 | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text to find (literal unless regex=true). | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| regex | No | true = treat find as a regular expression. | |
| dry_run | No | 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. | |
| replace | Yes | Replacement text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so safety is covered. The description adds real value beyond them: formatting/structure are verified unchanged, and dry_run previews on a copy without touching the file, which tells the agent how to de-risk a destructive edit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, front-loaded with the core behavior and constraint, then the dry-run affordance, then the sibling routing. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers scope, safety-relevant behavior (verification, dry_run), and sibling differentiation, which is everything an agent needs to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented, including regex and dry_run semantics. The description's 'literal unless regex=true' largely restates the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (find/replace) plus resource and scope ('across every slide of a .key deck'), and it explicitly names the sibling it is not for one-slide edits. An agent can distinguish it from keynote_set_slide_text without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the exact use case ('change the same text everywhere in a deck (names, dates, numbers)') and routes the alternative case explicitly to keynote_set_slide_text. Both when-to-use and the alternative are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_review_deckKeynote: review deckARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds the environment prerequisite (macOS + Keynote), the error-vs-warning severity split, and the fact that the deck is rendered to PDF rather than inspected abstractly. 'The file isn't changed' largely restates readOnlyHint, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and information-dense, but it repeats itself: 'Run it after building or restyling a deck, fix the errors' and 'Use after building or restyling a deck, before saying it's done; fix every error' say the same thing, and keynote_slide_image is named twice. Roughly a third of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need no explanation, and the description covers purpose, environment needs, severity semantics, and workflow placement. Slightly thin on whether the review is limited to text/geometry (no mention of images, charts, or theme issues), but otherwise complete for a single-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (path) with 100% schema description coverage, so the schema fully documents accepted path forms (absolute or ~). The description adds nothing about the path argument itself, which is the baseline-3 case when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Design review of a deck as Keynote actually draws it') and enumerates exactly what it reports: off-slide/overflow text, overlapping boxes, small type, density. This is clearly distinguishable from siblings like keynote_slide_image (viewport rendering) and iwork_verify_render (single-word render check).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('after building or restyling a deck, before saying it's done'), the follow-up action ('fix every error'), and two named alternatives with the conditions that select them (keynote_slide_image for a flagged slide, iwork_verify_render for a word).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_set_presenter_notesKeynote: set presenter notesADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| notes | Yes | The presenter notes text (replaces existing notes). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is partly covered. The description adds genuinely new behavior: notes REPLACE existing content, dry_run operates on a throwaway copy and runs every check, and 'Arabic-safe' signals text-handling guarantees. It doesn't cover permissions or whether Keynote must be running, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the action and the slide-indexing convention. The routing sentence and dry_run sentence each earn their place. Minor cost: 'Arabic-safe' is unexplained jargon that costs a clause without conveying actionable meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the key decision points (existing slide, dry_run preview, build_deck alternative). It omits any prerequisite about the deck being open/an accessible file, which for a mutation tool with openWorldHint=false would be useful.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the dry_run parameter already documents the copy/preview behavior, so the schema is doing the heavy lifting. The description's '1-based' and dry_run sentences largely restate schema content; 'Arabic-safe' adds a small note about encoding but no syntax detail for `notes`.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Set the presenter notes of slide number `slide`') and explicitly distinguishes itself from siblings: 'Use for speaker notes on an existing slide. For a new deck, put notes in keynote_build_deck's outline instead.' An agent can route between this and keynote_set_slide_text / keynote_build_deck without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it (existing slide, speaker notes) and when to use an alternative (new deck → keynote_build_deck outline). It also gives conditional guidance on dry_run ('before broad or risky edits'), covering both the when and the how.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_set_slide_layoutKeynote: set slide layoutADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| layout | Yes | Layout (master slide) name from keynote_inspect_style. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds blast-radius context beyond them: "Other slides are verified untouched" and dry_run runs "on a throwaway copy" without touching the file. It still does not say whether content that no longer fits the new layout is lost, or how to undo the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and short overall, but the third sentence restates the first sentence's purpose ("Use to change one slide's layout") instead of only adding the exclusion, which is mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers scope, verification, naming source, alternatives, and safe-preview behavior. The only gap is recovery/undo guidance for a destructive, non-idempotent operation, though dry_run mitigates much of that risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: dry_run's preview semantics and the source of valid layout names. The "Title & Bullets" example also illustrates the layout parameter's expected value shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ("Change one slide's layout (master)") and gives a concrete example layout name. It also implicitly separates itself from deck-level and text-level tools by calling out the singular slide and the master concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says where layout names come from ("names from keynote_inspect_style") and names the exclusion with its alternative ("Not for text styling: use keynote_format_text"). It also gives a usage recommendation for dry_run ("Use it before broad or risky edits and show the user").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_set_slide_textKeynote: set slide textADestructive
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 | Required | Description | Default |
|---|---|---|---|
| body | No | New body: a string, or a list of bullets; omit to leave it. | |
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| title | No | New title text; omit to leave it. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds useful context beyond them: only title/body boxes change, other slides and text boxes are verified untouched, and dry_run previews on a copy. It stops short of describing return shape or error conditions, but it meaningfully supplements the destructive-write profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then scoping, then safety/dry_run, then alternatives. Every sentence carries distinct information with no filler or repetition of the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-slide text edit with an output schema present, the description covers scope limits, mutation impact, dry_run semantics, and sibling alternatives. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters (baseline 3). The description adds genuine meaning beyond the schema by defining what 'title' and 'body' boxes physically are (top-most text box / largest other one) and noting body accepts bullet lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('fill/rewrite one slide's title and body') and clarifies the target semantics (title = top-most text box, body = largest other one). It explicitly distinguishes itself from keynote_replace_text and keynote_set_presenter_notes, so the agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('fill or rewrite one slide') and names two alternatives with the conditions that select them (same words across deck -> keynote_replace_text; speaker notes -> keynote_set_presenter_notes). Also advises when to use dry_run for risky edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_set_themeKeynote: set themeADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| theme | Yes | Theme name from keynote_list_themes. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, so the safety profile is partly covered. The description adds real value beyond that: the atomic rollback guarantee ('Rolled back if any slide loses text') and the dry-run-copy semantics, which are genuine behavioral traits not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences that are mostly front-loaded and mostly earn their place: the scope constraint, the rollback guarantee, the dry-run behavior, and the sibling routing. Slightly verbose since the dry_run sentence partly restates the schema, but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be explained, and annotations carry the safety profile. Combined with the rollback guarantee, dry-run semantics, and sibling routing, the description covers everything an agent needs to call this mutation correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters, including dry_run. The description reinforces dry_run preview semantics but adds no format or syntax detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Apply a different Keynote theme to the whole deck') with clear scope (whole deck). It explicitly distinguishes itself from the sibling keynote_apply_design, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('to switch the deck's theme only') and a named alternative with the condition that selects it ('For a full designed look ... use keynote_apply_design, which can set the theme too'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_set_transitionKeynote: set transitionADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| delay | No | Delay before it starts, in seconds. | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| effect | Yes | Transition effect, e.g. "dissolve", "push", "magic move", or "none". | |
| dry_run | No | 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 | No | Duration in seconds. | |
| automatic | No | true = advance to the next slide on its own. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false; the description adds real behavioral context on top: dry_run previews on a throwaway copy without touching the file, and other slides are verified untouched. It does not address idempotentHint=false (repeat-call behavior), so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the effect list, then appends the dry_run and sibling-routing notes. Semicolon-heavy and slightly packed, but every clause carries information and nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. With annotations covering the safety profile and 100% schema coverage, plus the description's dry_run and sibling guidance, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: it enumerates effect values (compensating for zero enums) and clarifies the units and semantics of duration/delay ('in seconds') and automatic ('advances on its own').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Transition into a slide'), enumerates the effect values, and scopes itself to a single slide. It explicitly separates itself from keynote_build_deck, which handles deck-wide transitions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for one slide's transition' plus the explicit alternative — 'For the same transition on every slide of a new deck, pass transition= to keynote_build_deck' — gives a clear when-to-use and when-not-to-use routing rule. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_skip_slideKeynote: skip slideADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| dry_run | No | 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. | |
| skipped | No | true = hide the slide in the slideshow; false = show it again. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnly=false, and the description adds context those flags cannot: that the operation is non-destructive to content (hide vs delete), and that dry_run runs on a throwaway copy so the original file is untouched. It does not cover reversibility/re-hide idempotency or permission needs, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, followed by the safety mechanism and the sibling routing. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, annotations carry the safety profile, and the description covers intent, alternative routing, and the preview workflow. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents path, slide, dry_run and skipped thoroughly. The description restates the skipped=true/false mapping and the dry_run preview behavior, adding emphasis but little new meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair (hide/show), the resource (slide in the slideshow), and the crucial semantic that the slide is not deleted. It explicitly distinguishes itself from keynote_delete_slide, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives when-to-use ('hide or show a slide without deleting it'), names the alternative for the other intent ('To remove it use keynote_delete_slide'), and explains the dry_run preview workflow with a recommendation on when to apply it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_slide_imageKeynote: slide imageARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .key deck (absolute, or starting with ~). | |
| slide | Yes | Slide number, 1-based (keynote_list_slides lists them). | |
| width | No | Image width in pixels (320–2560). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds context beyond the annotations: skipped slides aren't exported, the file is untouched, and it requires macOS + Keynote. The 'file isn't changed' partly restates readOnlyHint, but the environment requirement and skip behavior are genuine additions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the output format, followed by constraints and the alternative. Every clause earns its place, though it is fairly dense across multiple clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With read-only/idempotent annotations, no output schema, and full param coverage, the description supplies the remaining essentials: skip behavior, environment requirement, and the routing to iwork_thumbnail. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both `path` and `slide` are already documented. The description only echoes `width` px wide, adding no syntax or format detail beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: renders one slide as a JPEG image at a given width. It distinguishes itself from the sibling iwork_thumbnail by explaining that this is the real Keynote rendering versus a quick preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to look at a slide's real rendering, e.g. one keynote_review_deck flagged') and names the alternative with its tradeoff ('For a quick preview without Keynote use iwork_thumbnail'). The condition selecting each is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_slideshowKeynote: slideshowARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| path | No | The deck to present (needed for start). | |
| action | Yes | start | stop | next | previous. | |
| from_slide | No | Slide to start from, 1-based. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive/idempotent flags, and the description reinforces non-mutation but also adds genuinely new context: the macOS + Keynote runtime requirement. The 'doesn't change the file' claim is repeated twice, which is redundant rather than additive, but the platform prerequisite is valuable beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action modes, which is good, but the sentence 'Doesn't change the file' appears twice, wasting a slot in a very short description. Without that duplication it would be tight, but the redundancy is a clear structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers action semantics, the platform prerequisite, and an alternative tool for a related task, making it largely sufficient. Pagination/state-persistence across sequential next/previous calls is unaddressed but minor for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so path, action, and from_slide are already documented in the schema. The description's notes ('needs path', 'from_slide 1-based') essentially restate what the schema properties already say, adding no new syntax or format detail beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb (Present) and enumerates the exact action modes (start | stop | next | previous), so an agent knows precisely what the tool does. It also explicitly differentiates itself from the sibling iwork_export by use case ('To share it instead use iwork_export').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the intended context ('Use to present the deck live') and names an alternative tool for a neighboring need (sharing via iwork_export). It stops short of explicit when-not-to-use conditions, e.g. what happens if Keynote isn't installed beyond 'Needs macOS + Keynote'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_add_tableNumbers: add tableADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| rows | Yes | The data, header first: [["Region", "Revenue"], ["Riyadh", 1200]]. | |
| sheet | No | Existing sheet to add it to; omit for the first sheet. | |
| dry_run | No | 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. | |
| new_sheet | No | Name of a new sheet to create for the table instead. | |
| table_name | Yes | Name of the new table (must not exist on that sheet). | |
| header_rows | No | How many rows at the top are headers (styled and kept on top). | |
| header_columns | No | How many columns on the left are headers. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag it as destructive and non-idempotent; the description adds genuinely new behavior with 'Every existing table is verified unchanged' and the guarantee that dry_run operates on a copy without touching the file. It stops short of naming what gets destroyed or any permission requirements, but the added context is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action, then verification semantics, then the routing rule. Every sentence carries distinct information with no repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the annotations cover the safety profile. The description closes the remaining gaps: placement targets, dry_run behavior, and the sibling boundary. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description echoes the sheet-vs-new_sheet choice and dry_run semantics but adds no syntax, format or constraint detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Add a table with data') plus the two placement targets, and explicitly routes the agent to the sibling 'numbers_insert' for the adjacent operation. An agent can distinguish it from numbers_insert without reading either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('a new, separate table on a sheet or a new sheet') and when-not ('To grow an existing table use numbers_insert'), and also tells the agent when to reach for dry_run. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_apply_designNumbers: apply designADestructive
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 | Required | Description | Default |
|---|---|---|---|
| kit | No | A design kit: a name from iwork_list_design_kits (preset or saved, e.g. "executive", "Resal") or your own {"fonts": {...}, "colors": {"title": "#RRGGBB", ...}}. Contrast is checked. | executive |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| banding | No | true = tint alternate body rows. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantive context the annotations cannot: values are never modified, sibling tables are verified untouched, no host app is required, and dry_run runs all checks on a throwaway copy. It does not explain reversibility or what happens to pre-existing formatting that conflicts with the kit, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core content is front-loaded, but the final two sentences restate earlier material: the parenthetical '(header band, fonts, banding, aligned numbers)' repeats the opening list, and 'Preview with dry_run' repeats the dry_run sentence verbatim in substance. Roughly a third of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers the operation, content preservation, collateral-table safety, the sibling alternative, and the dry_run preview. It stops short of describing what happens when the kit conflicts with existing formatting or whether the operation is repeatable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (kit, path, sheet, table, banding, dry_run) is already documented in the schema, including the kit's shape and the sheet/table omission rule. The description only restates kit, banding and dry_run at a high level, adding no syntax or format detail beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (style) and resource (a whole table) and enumerates the exact transformations applied: header band, body font/colour, banding, right-aligned numbers. It explicitly contrasts scope with numbers_set_cell_style, so an agent can distinguish whole-table styling from cell-level styling without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it ('to make a whole table look designed in one call') and names the alternative for the opposite case ('For a few cells use numbers_set_cell_style'), plus a preview pathway ('Preview with dry_run'). Both the selection condition and the exclusion are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_createNumbers: createADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Where to create the new .numbers file; it must not exist yet. | |
| sheets | Yes | Sheets with their tables: [{"name": "Sales", "tables": [{"name": "Q1", "rows": [["Region", "Revenue"], ["Riyadh", 1200]], "header_rows": 1}]}]. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, but the description adds non-obvious behavior: it refuses to overwrite, needs no app running, and preserves value types exactly (including Arabic text). The overwrite refusal is genuinely useful given the destructive annotation. It does not, however, say what happens on a path collision beyond refusal or whether partial writes can occur.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraints, and the routing sentence comes last where it belongs. The embedded JSON example consumes a large share of the text and duplicates the schema, which is mild redundancy rather than confusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described. The description covers creation, type fidelity, overwrite refusal, and sibling routing, leaving only edge-case failure behavior unstated. Adequate for a two-parameter create tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, and the description's inline JSON example largely repeats the schema's own sheets description. Baseline 3 is appropriate since the schema does the heavy lifting and the description adds no syntax or constraint beyond what is already there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create a new .numbers file from data') and immediately scopes it against siblings by naming numbers_import_csv and numbers_add_table as the tools for adjacent tasks. An agent can distinguish this from the other create paths without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('when you have the rows') and routes two adjacent cases to alternatives: CSV input to numbers_import_csv, adding a table to an existing file to numbers_add_table. This is the when/when-not/alternatives pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_deleteNumbers: deleteADestructive
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 | Required | Description | Default |
|---|---|---|---|
| at | Yes | 1-based position of the first one to delete. | |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| what | Yes | rows | columns. | |
| count | No | How many to delete. | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, readOnlyHint=false, and idempotentHint=false, and the description adds context the annotations cannot: remaining cells are verified, the operation is refused on tables with formulas or merged cells, undo is available via iwork_restore_backup, and dry_run acts on a throwaway copy. This is rich behavioral disclosure beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and mostly tight, but the tail is wasted: 'Refused in tables with formulas or merged cells. Undo with iwork_restore_backup.' is stated twice (once mid-sentence, once at the end). Duplicated content costs it a point or two.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers everything else an agent needs: scope, refusal conditions, reversibility, and dry-run workflow. Nothing material is missing for a destructive single-operation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are already documented; the description repeats at/what/count/dry_run rather than adding new semantics like edge-case behavior for out-of-range positions or count defaults. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (delete) plus resource (rows/columns) and the exact scoping parameters (count, what, 1-based at). It clearly separates itself from the sibling numbers_edit_cell by naming it as the tool for clearing values instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives when-not-to-use ('Not for clearing values (use numbers_edit_cell with null)') and when-to-verify ('dry_run=true previews the change... Use before broad or risky edits'). The alternative for clearing is named with the exact tool and parameter (null).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_edit_cellNumbers: edit cellADestructive
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 | Required | Description | Default |
|---|---|---|---|
| ref | Yes | One cell in A1 notation, e.g. "B2". | |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | 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. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true and idempotentHint=false; the description goes well beyond by disclosing backup, verification, atomicity, and that every other cell is checked unchanged, plus dry_run previewing on a throwaway copy. This is exactly the mutation-safety context an agent needs and does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then safety guarantees, then routing alternatives in a tight sequence. No sentence is wasted and the ordering matches how an agent evaluates the call.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers mutation semantics, safety guarantees, dry-run preview, and sibling routing; an output schema exists so return values need no explanation. Nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters including ref, value coercion, and dry_run semantics. The description largely echoes that content, so it meets the baseline without adding much beyond schema-provided meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Set one cell (e.g. ref "B2") in a .numbers file") and explicitly names the sibling tools it is not, so an agent can distinguish it from numbers_set_formula, numbers_insert, and numbers_set_number_format without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a direct usage rule ("Use to set one value") and three explicit when-to-use alternatives with the condition that selects each (formula, whole rows, display formatting). Routing is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_import_csvNumbers: import csvADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Where to create the new .numbers file; it must not exist yet. | |
| sheet | No | Name for the new sheet. | Sheet 1 |
| table | No | Name for the new table. | Table 1 |
| numbers | No | true = plain numbers become numbers; false = keep every cell as text. | |
| csv_path | Yes | The CSV or TSV file to read (UTF-8). | |
| delimiter | No | Column separator, e.g. "," or "\t"; omit to detect it. | |
| header_rows | No | How many rows at the top are headers (styled and kept on top). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by spelling out value-conversion semantics (plain numbers become numbers, dates / "$1,234" / Arabic-Indic digits stay text) and the no-overwrite guarantee. This is unusually rich for a write tool and useful for predicting results, though it doesn't cover failure modes such as malformed CSV handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four compact sentences, each carrying distinct information, with the core action and its safety constraint front-loaded before the routing advice. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations supplied, and 100% parameter coverage, the description only needs to add conversion and overwrite context, which it does. The remaining gap is minor: no mention of what happens on an invalid or non-UTF-8 source file.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it clarifies the numbers=true/false contract and that the target path must not already exist ("Refuses to overwrite"). It does not explain header_rows or delimiter behavior beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Turn a CSV/TSV into a new .numbers file") and immediately scopes it with encoding and detection behavior. It also distinguishes itself from the sibling numbers_create by routing row-based input there, so an agent can pick between the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the trigger condition explicitly ("Use when the data is in a CSV/TSV file") and names the alternative with its own condition ("When you already have the rows use numbers_create"). The overwrite exclusion is also stated as a rule rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_insertNumbers: insertADestructive
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 | Required | Description | Default |
|---|---|---|---|
| at | No | 1-based position to insert before; omit to append at the end. | |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| what | Yes | rows | columns. | |
| count | No | How many to insert. | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| values | No | Optional contents: one list per new row (or column), e.g. [["Riyadh", 1200]]. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavioral context beyond the annotations: every existing cell is verified at its new position, formula-bearing tables permit only appending, and dry_run previews on a throwaway copy without touching the file. Annotations cover the destructive/non-idempotent profile, and the description does not contradict them; it stops short of stating permission/auth needs or what the returned check report contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and semantics, and most sentences earn their place. However, the formula-table restriction is stated twice ('only appending is allowed' and 'In tables with formulas only appending works'), which is redundant padding in an otherwise tight description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return details need not be described. Combined with the 100%-covered input schema, annotations, and sibling names, the description covers the mutation constraints, the preview mechanism, and the correct alternative tool – nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description still adds value: it glosses `what` (rows | columns), `at` as 1-based with omit-to-append, and gives the nested `values` shape (one list per new row/column, e.g. [["Riyadh", 1200]]). It leaves `count` and the empty-argument cases to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Insert rows or columns ... before 1-based position `at`') with clear scope and an explicit routing contrast to numbers_add_table. An agent can distinguish it from siblings like numbers_add_table and numbers_create without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to use it ('add rows or columns to an existing table, optionally filled') and when not to ('For a separate table use numbers_add_table'), plus the formula-table fallback ('do mid-table inserts in Numbers'). Alternatives and the excluding condition are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_inspect_formatNumbers: inspect formatARead-only
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered by structured data. The description adds genuine context beyond that: it is a prerequisite read step and it enumerates the specific style attributes returned, which helps the agent understand the output scope. No output format detail is given, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the returned attribute list, which is efficient. The 'Read this before formatting' and 'Use before formatting to see current styles...' sentences restate the same instruction, a mild redundancy that costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained; within that constraint the description covers what the tool returns, when to call it, and where to go for values instead. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents path, sheet, and table. The description adds no additional parameter-level meaning (no format, defaults, or selection semantics beyond what the schema states), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (inspect) and resource (formatting of a Numbers table), then enumerates exactly what is returned: column widths, row heights, headers, merges, per-cell font/colour/fill/alignment, number format, borders. This clearly distinguishes it from the numbers_set_* sibling writers and from iwork_read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to read this before formatting, describes the condition that selects it (need current styles/sizes/headers/merges), and names an alternative for a different need ('For values use iwork_read'). When-to-use and sibling routing are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_merge_cellsNumbers: merge cellsADestructive
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 | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| cells | Yes | The range to merge, e.g. "A1:C1". Refused if it would hide values. | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, and the description adds genuinely new behavioral detail: the top-left-only data refusal rule, the header-edge refusal, and that dry_run operates on a copy without touching the file. It does not, however, describe reversibility or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, but the refusal condition is stated twice ("Refused if any cell other than the top-left holds data" and "Refused if it would hide values") and "Use to merge a range" restates the opening. Several sentences do not fully earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations carry the safety profile. The description covers the destructive-refusal rules and the dry_run workflow, leaving only minor gaps such as what happens to the merged range's formatting.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description slightly exceeds the schema by explaining the underlying rule for the cells parameter (only the top-left may hold data, otherwise refused because values would be hidden) and reinforcing dry_run's copy-based preview semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource (merge a rectangular range) with a concrete example ("A1:C1"), which is enough to distinguish it from siblings like numbers_set_borders or numbers_set_headers. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use it (merging a title across columns) and two explicit avoid/reject conditions (hiding values, crossing the header edge, merging inside sortable data). There is no named alternative tool, but no obvious sibling competes for this job, so the guidance is clear context without exclusions of a real alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_recalculateNumbers: recalculateADestructive
Make Numbers recompute every formula from the current values. Numbers keeps showing a formula's old result after edits made without it (numbers_edit_cell, numbers_insert…), so run this after those when the file has formulas — their result says so (formulas_need_recalc). Formulas and inputs are verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use only after a no-app edit returned formulas_need_recalc, so totals are current. Not needed after numbers_set_formula, which recalculates itself.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag it as non-read-only and destructive; the description adds that outputs are verified unchanged, that it requires macOS + Numbers with the file closed, and that dry_run operates on a throwaway copy. That is meaningful context beyond the annotation block.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and tightly packed with prerequisite and routing information, though the parenthetical sibling list and the dry_run sentence add length that slightly dilutes the opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained. The description nonetheless covers the trigger signal, the platform/file-state prerequisites, and the dry-run escape hatch, leaving nothing an agent needs missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both path and dry_run, including the throwaway-copy behavior. The description largely restates dry_run's contract rather than adding syntax, defaults, or edge cases the schema lacks, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: recompute every formula in a Numbers file from current values. It immediately distinguishes itself from write-oriented siblings by naming numbers_edit_cell and numbers_insert as the operations that leave stale results behind.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger condition (run only after a no-app edit returned formulas_need_recalc), an explicit exclusion (not needed after numbers_set_formula, which recalculates itself), and a preview path via dry_run. An agent can decide whether to call this without guessing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_bordersNumbers: set bordersADestructive
Cell borders on a range: sides = all | outline | inner | top | right | bottom | left; width in points; color "#RRGGBB"; style = solid | dashes | dots | none. dry_run=true previews the change on a copy without touching the file. Use for lines around or inside a range. For fills and fonts use numbers_set_cell_style.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| cells | Yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". | |
| color | No | Line colour "#RRGGBB". | #000000 |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| sides | No | all | outline | inner | top | right | bottom | left. | all |
| style | No | solid | dashes | dots | none (none removes the border). | solid |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| width | No | Line width in points. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the safety profile is covered. The description adds real value beyond them by explaining that dry_run previews on a throwaway copy and returns what would change without touching the file — a meaningful behavioral contract for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Terse and front-loaded: option values, then the dry_run safety note, then the routing hint. Dense but every clause carries information; the semicolon list is compact rather than rambling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the mutation profile, the description supplies the remaining pieces an agent needs: option vocabularies, dry-run preview semantics, and sibling routing. A brief note on permissions or reversibility would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including the sides/style enumerations which the description merely restates. The description adds no syntax, constraint, or default behavior beyond what the schema provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('cell borders on a range') and immediately scopes the alternatives that distinguish it from siblings (fills/fonts → numbers_set_cell_style). An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when ('use for lines around or inside a range') plus a named alternative for adjacent tasks, and explains when to use dry_run ('before broad or risky edits, show the user'). No explicit when-not condition is stated, so it stops short of the top mark.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_cell_styleNumbers: set cell styleADestructive
Style a range ("A1:D1"): font_name, font_size, bold, italic, underline, strikethrough, font_color / fill_color as "#RRGGBB", align (left|center|right|justify|auto), valign (top|middle|bottom), wrap. Only the attributes you pass change; every other cell is verified untouched. dry_run=true previews the change on a copy without touching the file. Use for fonts, colours, fill or alignment on a few cells. For a whole table that should look designed use numbers_apply_design; for how numbers display use numbers_set_number_format.
| Name | Required | Description | Default |
|---|---|---|---|
| bold | No | true/false; omit to leave as is. | |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| wrap | No | true = wrap text in the cell. | |
| align | No | Horizontal: left | center | right | justify | auto. | |
| cells | Yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| italic | No | true/false; omit to leave as is. | |
| valign | No | Vertical: top | middle | bottom. | |
| dry_run | No | 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_name | No | Font family, e.g. "Helvetica Neue" or "Geeza Pro". | |
| font_size | No | Font size in points. | |
| underline | No | true/false; omit to leave as is. | |
| fill_color | No | Cell fill "#RRGGBB". | |
| font_color | No | Text colour "#RRGGBB". | |
| strikethrough | No | true/false; omit to leave as is. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing partial-update semantics ("Only the attributes you pass change; every other cell is verified untouched") and the copy-based preview behavior of dry_run. It does not explain reversibility or that the write to the target file is destructive, but the annotation already flags destructiveHint=true, so the remaining gap is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the range example and the mutation semantics, then the routing guidance, so the most decision-relevant content comes first. The mid-sentence attribute list is dense and partially redundant with the schema, but each clause carries real information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter mutation tool it covers the essentials an agent needs: scope, partial-application behavior, a safe preview mode, and routing to the two nearest siblings. Return values are handled by the output schema and safety by annotations, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 16 parameters (including units like points and #RRGGBB colours) is already documented in the schema. The description's inline enumeration of attributes and allowed values largely repeats that structured data rather than adding new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (style a range in a Numbers file) plus the exact attribute surface, and explicitly distinguishes itself from numbers_apply_design and numbers_set_number_format. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit scope rule ("a few cells") and names two alternatives with the condition that selects each: numbers_apply_design for a whole designed table, numbers_set_number_format for display formatting. It also advises dry_run pre-flight before risky edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_dimensionsNumbers: set dimensionsADestructive
Set column widths and/or row heights in points, e.g. columns={"A": 160, "C": 90}, rows={"1": 32} (rows are 1-based). Nothing else changes. dry_run=true previews the change on a copy without touching the file. Use for column widths and row heights. To change which rows count as headers use numbers_set_headers.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| rows | No | Row heights in points by 1-based row number, e.g. {"1": 32}. | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| columns | No | Column widths in points by letter, e.g. {"A": 160, "C": 90}. | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is covered. The description adds real behavioral context beyond that: 'Nothing else changes' bounds the blast radius, and it explains dry_run previews on a copy without touching the file. It omits permission/auth requirements, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loads the core action with examples before the dry_run and sibling routing. The sentence 'Use for column widths and row heights' partially echoes the opening clause, a minor redundancy, but nothing is bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the dry_run behavior is described. The safety profile is carried by annotations and the effect scope by 'Nothing else changes.' Nearly complete for a 6-param mutation tool, with only permission context missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, including 1-based rows and units. The description restates the column/row examples rather than adding syntax or constraints the schema lacks, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource (set column widths and/or row heights), defines the unit (points), and gives concrete examples. It also distinguishes itself from the sibling numbers_set_headers by naming that tool, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states its purpose ('Use for column widths and row heights') and names the alternative for a nearby task ('To change which rows count as headers use numbers_set_headers'). It gives clear context but no explicit when-not-to-use or dependency conditions beyond that redirect.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_formulaNumbers: set formulaADestructive
Put a formula in one cell, e.g. ref "D10", formula "=SUM(D2:D9)"; Numbers computes it and the result is returned. Every other cell's input is verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use for a cell that calculates (=SUM…); Numbers computes the result. For a plain value use numbers_edit_cell. Needs the Numbers app.
| Name | Required | Description | Default |
|---|---|---|---|
| ref | Yes | One cell in A1 notation, e.g. "B2". | |
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| dry_run | No | 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. | |
| formula | Yes | The formula, starting with "=", e.g. "=SUM(B2:B9)". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotent=false, so the mutation profile is known; the description adds real context beyond that — the result is returned, every other cell is verified unchanged, the file must be closed and macOS+Numbers present, and dry_run previews on a copy. It does not state reversibility (e.g. no undo/backup mention), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded with the example, but it repeats itself: 'Numbers computes it and the result is returned' recurs as 'Numbers computes the result', and the Numbers-app requirement appears twice ('Needs macOS + Numbers' and 'Needs the Numbers app'). Two sentences could be cut without information loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and prerequisites (closed file, macOS+Numbers) plus dry_run semantics are covered. Minor gap: no note on what happens if the ref is invalid or already contains a value, but the essentials for correct invocation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters are documented in the schema itself. The description revisits ref and formula with examples but adds no semantics the schema lacks (sheet/table omission rules, dry_run behavior are all in the schema). Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Put a formula in one cell') with a concrete example, and explicitly contrasts itself with the sibling numbers_edit_cell for plain values. An agent can distinguish this from numbers_edit_cell and numbers_recalculate without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the when ('a cell that calculates (=SUM…)'), the when-not ('For a plain value use numbers_edit_cell'), and a conditional path for dry_run previews before risky edits. The routing to the alternative is explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_headersNumbers: set headersADestructive
Set how many header rows / header columns a table has (0–5). dry_run=true previews the change on a copy without touching the file. Use when the user wants a different number of header rows or columns, e.g. to freeze a title row on top for sorting and styling. Not for sizes (numbers_set_dimensions) or header colours (numbers_set_cell_style or numbers_apply_design).
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| dry_run | No | 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 | No | Number of header rows (0 for none). | |
| header_columns | No | Number of header columns (0 for none). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false and idempotentHint=false, so the safety profile is known. The description adds the dry_run preview semantics, but it does not say what is lost when header counts are changed (existing header formatting, merges, or content promotion), leaving the destructive behaviour under-explained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences: capability first, then the preview option, then usage and exclusions. Front-loaded and mostly waste-free, though the dry_run sentence duplicates schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers scope, range, preview mode, and sibling routing. The remaining gap is the consequence of changing header counts on existing table data.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The one genuine addition is the 0–5 bound, which the schema's '0 for none' does not state; the dry_run explanation largely restates the schema's own dry_run description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (set) plus resource (header rows / header columns on a table), with the numeric range stated. It explicitly distinguishes itself from numbers_set_dimensions and the styling tools, so an agent can route without opening sibling schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the triggering user intent ('wants a different number of header rows or columns'), a concrete example use case, and explicit exclusions naming the correct alternatives for sizes and header colours. Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_set_number_formatNumbers: set number formatADestructive
How numbers display in a range ("B2:B9"): format = number | currency | percentage | scientific | fraction | datetime | text. Options: decimal_places, thousands_separator, negative_style (minus|red|parentheses|red_parentheses), currency_code (ISO, e.g. SAR, USD), accounting, date_format (e.g. "d MMM yyyy"). Values are not changed; the result shows how each cell now displays. dry_run=true previews the change on a copy without touching the file. Use for how numbers display (currency, %, dates, decimals); the values don't change. For fonts and colours use numbers_set_cell_style.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| cells | Yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| format | Yes | number | currency | percentage | scientific | fraction | datetime | text. | |
| dry_run | No | 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. | |
| accounting | No | true = accounting style (symbol aligned left) for currency. | |
| date_format | No | Date pattern for format=datetime, e.g. "d MMM yyyy". | |
| currency_code | No | ISO currency code for format=currency, e.g. "SAR" or "USD". | |
| decimal_places | No | Digits after the decimal point. | |
| negative_style | No | minus | red | parentheses | red_parentheses. | |
| thousands_separator | No | true = group thousands (1,234). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false, and the description meaningfully adds that 'values are not changed; the result shows how each cell now displays,' plus the dry_run copy-preview semantics. That explains the nature of the destructive change in a way annotations cannot. It doesn't cover permission or file-write prerequisites, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The main action and the non-mutating-value clarification are front-loaded, and the final sentence efficiently routes to the style sibling. It does spend a sentence duplicating enum options already in the schema, costing some density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be described, and the description covers the display-vs-value distinction, the dry_run option, and format choices. It is complete enough for a 12-param mutation tool, missing only prerequisite/permission context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 12 parameters. The description restates the format enum and negative_style options, which adds little beyond the schema text; it is adequate but does not deepen parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (set the display number format for a cell range) and names the sibling it must not be confused with: 'For fonts and colours use numbers_set_cell_style.' An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context ('Use for how numbers display (currency, %, dates, decimals)') and names an alternative tool for the adjacent styling case. It stops short of saying when NOT to use it relative to numbers_inspect_format or numbers_edit_cell, but the core routing guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_sortNumbers: sortADestructive
Sort a table's body rows by a column letter (header rows stay on top). Verified as a pure reorder. A table whose formulas read other rows (e.g. =B2*0.1 below a base-figure row) is refused, because Numbers' sort would break them; for it, to_new_table=true leaves the table, its formulas and its charts as they are and puts a sorted copy of its values (no formulas) in a new table on the same sheet (named new_table_name, default " sorted"). Chart the copy with keynote_build_deck. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use to reorder body rows by one column; header rows stay on top. If it refuses because formulas read other rows, call it again with to_new_table=true for a sorted copy; never rewrite the formulas to force it. Needs the Numbers app.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .numbers file (absolute, or starting with ~). | |
| sheet | No | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). | |
| table | No | Table name on that sheet. Omit when the sheet has one table. | |
| column | Yes | Column letter to sort by, e.g. "C". | |
| dry_run | No | 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. | |
| descending | No | true = largest/last first. | |
| to_new_table | No | true = leave the table as it is and put a sorted copy of its values (no formulas) in a new table on the same sheet. Use it when the table's formulas read other rows. | |
| new_table_name | No | Name for the new table (with to_new_table); default "<table> sorted". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give destructiveHint=false and idempotentHint=false; the description adds the refusal condition (formulas that read other rows), what to_new_table preserves (table, formulas, charts) versus omits (formulas in the copy), the default copy name, environmental prerequisites (macOS + Numbers, file closed), and what dry_run actually does (runs on a throwaway copy). This is substantial context the structured fields do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and dense, but it repeats itself: 'header rows stay on top' appears in both the opening and again in 'Use to reorder body rows by one column; header rows stay on top,' and the keynote_build_deck plug is tangential. A tighter version would preserve all the guidance without the duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the risky edge case, the recovery path, prerequisites, and the dry-run preview. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds rationale the schema lacks: why to_new_table exists, that the copy contains values with no formulas, the default naming pattern, and that dry_run previews without touching the file. It reinforces rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a precise verb and resource: 'Sort a table's body rows by a column letter (header rows stay on top).' No sibling tool performs row reordering, and the scope (body rows only, headers fixed) is stated up front.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use it to reorder body rows by one column, names the fallback path (to_new_table=true) when the tool refuses, and adds a prohibition ('never rewrite the formulas to force it'). The when/when-not/alternative matrix is complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_fill_placeholdersPages: fill placeholdersADestructive
Fill template placeholders by tag, e.g. {"Name": "Sara", "Date": "3 October"}. Formatting is kept; the body is verified to change only there. Needs macOS + Pages. dry_run=true previews the change on a copy without touching the file. Use for template fields (Name, Date). It's the only write for page-layout documents like letters and flyers, which have no body text.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .pages document (absolute, or starting with ~). | |
| values | Yes | Placeholder tag → text, e.g. {"Name": "Sara", "Date": "3 October"} (tags from pages_list_placeholders). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful behavior beyond the annotations: formatting is preserved, the body is verified to change only at placeholders, macOS + Pages is required, and dry_run previews on a throwaway copy. The destructiveHint=true annotation is consistent with a write tool, and the description reinforces the safe-preview path rather than contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and its example, then layered with verification, platform, dry-run, and use-case notes. Every sentence carries information, though the example values could be trimmed since it duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return details need not be explained, and the description covers the remaining essentials: platform requirement, verification guarantee, dry-run semantics, and the document class it targets. Complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter baseline is 3. The description's example values object and dry_run explanation largely restate what the schema already documents, so it adds little parameter-level meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fill template placeholders by tag') and immediately differentiates from siblings by noting it is 'the only write for page-layout documents like letters and flyers, which have no body text.' The agent can distinguish it from pages_set_body and pages_replace_all without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear when-to-use context ('Use for template fields (Name, Date)') and a useful scoping contrast against body-text edits. It also explains the dry_run workflow. It stops short of naming specific alternative tools (e.g. pages_replace_all) for related edits, so it is strong context rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_list_placeholdersPages: list placeholdersARead-onlyIdempotent
Template placeholders in a .pages document (tag + current text), e.g. a letter's "Name" or "Date" fields. Needs macOS + Pages. Use before pages_fill_placeholders to see the template's field tags.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .pages document (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds the environment dependency ("Needs macOS + Pages") and the returned content shape, which is real context beyond the structured fields, though pagination or failure/error behavior is not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each doing work: what it returns, the environment requirement, and the sequencing with its sibling. Front-loaded with the resource and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values needn't be re-explained, and annotations carry the safety profile. The description covers the remaining gaps an agent needs: environment prerequisite, content shape, and when to call it relative to pages_fill_placeholders.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema description coverage is 100%, so the schema fully documents `path` (absolute or ~-prefixed). The description adds nothing about the parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (list) plus resource (template placeholders in a .pages document), and it even says what each entry contains (tag + current text) with a concrete example of a letter's "Name"/"Date" fields. This separates it cleanly from pages_fill_placeholders, the write-side sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: "Use before pages_fill_placeholders to see the template's field tags," which tells the agent the ordering and the alternative. It lacks any when-not condition (e.g. what to do if the document has no placeholders), so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_preflightPages: check it can answerARead-onlyIdempotent
Check Pages can answer AppleEvents. Run once before any Pages op; never loop on failure. Call once before other Pages tools. A -1712 error means a dialog in Pages needs a human; don't retry until it's dismissed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description goes further by decoding the -1712 error as a blocking human dialog and prescribing a no-retry policy, which is operational behavior neither the annotations nor the schema could convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the probe action, the once-per-session sequencing rule, and the error-handling exception. The most important instruction (call once before other Pages tools) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are not required here. Given the tool's role as a gate before other Pages calls, the description covers the prerequisite timing, the failure signature, and the retry policy - everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline for a no-parameter tool applies. Schema coverage is 100% and empty, so no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Check Pages can answer AppleEvents', which is a health/liveness probe. This is clearly distinguishable from the sibling editing and creation tools, so an agent knows this is a precondition check rather than a document operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Run once before any Pages op' and 'Call once before other Pages tools', giving both the trigger and the sequencing. It also states the negative case clearly: 'never loop on failure' and 'don't retry until it's dismissed'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_read_tablesPages: read tablesARead-onlyIdempotent
Every table in a .pages document: name, size, and each cell's value, shown text and formula. Needs macOS + Pages. Use before pages_set_table_cells to see the tables, their names and cell references.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .pages document (absolute, or starting with ~). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds the meaningful non-annotation context: the macOS/Pages runtime dependency and the fact that formula and displayed text are both returned. It does not discuss behavior on documents with no tables, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the return content, followed by the prerequisite and the alternative/sequencing hint. No filler and no redundancy with the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return formatting, and it covers purpose, prerequisite, and sibling sequencing. Only edge behavior (empty documents, missing tables, error modes) is unspecified, which is a minor gap rather than a blocking one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'path' parameter, which already documents absolute or ~-prefixed paths. The description adds nothing about the path argument, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Every table in a .pages document') and enumerates exactly what is returned: name, size, per-cell value, shown text and formula. This is clearly distinguishable from write-oriented siblings like pages_set_table_cells.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite ('Needs macOS + Pages') and an explicit sequencing rule: 'Use before pages_set_table_cells to see the tables, their names and cell references.' The agent knows both when to call it and which sibling it feeds into.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_replace_allPages: replace allADestructive
Replace every occurrence of find in a .pages body (needs Pages + GUI session). Rolled back if the readback disagrees. dry_run=true previews the change on a copy without touching the file. Use to change text everywhere while keeping formatting. To replace the whole body use pages_set_body; for template fields use pages_fill_placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| find | Yes | Text to find, exactly. | |
| path | Yes | Path to the .pages document (absolute, or starting with ~). | |
| dry_run | No | 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. | |
| replace | Yes | Replacement text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=false), the description discloses two traits not present in structured fields: the Pages + GUI session prerequisite and the readback-based rollback on disagreement. The dry_run sentence largely restates the schema's dry_run description, so it doesn't add much incremental value, keeping this at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with zero filler; the core behavior and prerequisite come first, then the safety mechanism, then routing to alternatives. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, full schema description coverage, and annotations covering the safety profile, the description supplies everything else an agent needs: environment prerequisite, rollback guarantee, preview mode, and sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so find, path, replace, and dry_run are already fully documented. The description only adds that matching is body-scoped and that find is matched "exactly", which is marginal additional meaning over the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and scope ("replace every occurrence of `find` in a .pages body") along with the required environment, and explicitly names the two sibling tools it is not (pages_set_body, pages_fill_placeholders). An agent can distinguish this from all other Pages tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive guidance ("use to change text everywhere while keeping formatting"), names the alternative for whole-body replacement, and names the alternative for template fields. It even routes risky usage to the dry_run flow, so the when-to-use decision is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_set_bodyPages: set bodyADestructive
Replace the entire body text of a .pages document (needs Pages + GUI session). Body formatting is reset. dry_run=true previews the change on a copy without touching the file. Use only to replace the entire body text; it resets body formatting, so warn the user. Prefer pages_replace_all or pages_fill_placeholders.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The new body text; paragraphs separated by newlines. Resets body formatting. | |
| path | Yes | Path to the .pages document (absolute, or starting with ~). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the mutation profile is known. The description adds genuine context beyond that: the GUI-session/Pages prerequisite, the specific loss ('Body formatting is reset'), and the dry_run preview semantics. It stops short of stating reversibility or backup behavior, which keeps it at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The destructive warning is front-loaded, which is good, but the same fact is stated three times ('Body formatting is reset', 'it resets body formatting', schema-level 'Resets body formatting') and the opening sentence is restated by 'Use only to replace the entire body text'. Meaningful trimming is possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema and full schema coverage, so return values and params need no prose. The description supplies the environment prerequisite, the destructive consequence, and the safe-preview route, which is close to sufficient. Minor gaps remain around backup/restore availability (siblings exist for it) and confirmation expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so path, body, and dry_run are all documented in the schema itself. The description's remarks about body formatting and dry_run largely repeat the schema text rather than adding syntax or constraints. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Replace the entire body text of a .pages document') with explicit scope ('entire body'). It also names the two sibling tools it is not (pages_replace_all, pages_fill_placeholders), so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Use only to replace the entire body text'), when-not (implies partial edits, routed elsewhere), and named alternatives ('Prefer pages_replace_all or pages_fill_placeholders'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_set_table_cellsPages: set table cellsADestructive
Write cells of an existing table in a .pages document. table = its name or number (from pages_read_tables); cells = {"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"} — numbers stay numbers, "=…" makes a formula, null clears. Every other cell and the body text are verified unchanged. New tables can't be created (Pages 15 doesn't script it). Needs macOS + Pages, document closed. dry_run=true previews the change on a copy without touching the file. Use to write into an existing Pages table. New tables can't be created in Pages; for text outside tables use pages_replace_all.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Path to the .pages document (absolute, or starting with ~). | |
| cells | Yes | {"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"}: numbers stay numbers, "=…" is a formula, null clears. | |
| table | Yes | The table's name or number (from pages_read_tables). | |
| dry_run | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a destructive, non-idempotent write, and the description adds real context beyond them: every other cell and the body text are verified unchanged, macOS + Pages are required, the document must be closed, and dry_run previews on a copy without touching the file. These are exactly the side-effect and precondition details an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the cells payload, but the 'new tables can't be created' constraint appears twice and 'Use to write into an existing Pages table' restates the opening sentence. Mostly efficient with minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and 100% schema coverage, the description still supplies the environment prerequisites, the non-target verification guarantee, and the dry_run workflow. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description's cell semantics (numbers stay numbers, '=…' is a formula, null clears) duplicate what the schema's cells description already says, as does the table provenance note. It adds the concrete example mapping but no syntax or format detail beyond the structured fields, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Write cells of an existing table in a .pages document') and immediately bounds the scope to existing tables, distinguishing it from table-creation and text-editing tools. An agent can tell what it does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use to write into an existing Pages table' and 'for text outside tables use pages_replace_all', plus the negative case that new tables can't be created. It also tells the agent when to reach for dry_run (before broad or risky edits).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v2.6.0- Changed
numbers_sort2 fields changed- added
Input schema / properties / new_table_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Name for the new table (with to_new_table); default \"<table> sorted\".", + "title": "New Table Name" +} - added
Input schema / properties / to_new_tableAdded value: +{ + "default": false, + "description": "true = leave the table as it is and put a sorted copy of its values (no formulas) in a new table on the same sheet. Use it when the table's formulas read other rows.", + "title": "To New Table", + "type": "boolean" +}
60 tool updates
v2.4.1- Changed
iwork_create2 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Where to create the new file (.numbers, .key or .pages); it must not exist yet." - added
Input schema / properties / template / descriptionAdded value: +"Template or theme name from iwork_list_templates; omit for Blank / Basic White."
- Changed
iwork_create_from_template2 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Where to create the new file; it must not exist yet." - added
Input schema / properties / template / descriptionAdded value: +"The user's own .numbers, .key or .pages file to copy."
- Changed
iwork_delete_design_kit1 field changed- added
Input schema / properties / name / descriptionAdded value: +"Name of the saved kit to delete (presets can't be deleted)."
- Changed
iwork_export8 fields changed- added
Input schema / properties / format / descriptionAdded value: +"Numbers: pdf | xlsx | csv. Pages: pdf | docx | epub | txt | rtf. Keynote: pdf | pptx | images | movie." - added
Input schema / properties / image_format / descriptionAdded value: +"Slide images only: jpeg | png | tiff." - added
Input schema / properties / image_quality / descriptionAdded value: +"good | better | best." - added
Input schema / properties / out / descriptionAdded value: +"Output path (a folder for images); omit to write next to the source." - added
Input schema / properties / overwrite / descriptionAdded value: +"true = replace an existing output (the old one is kept as a backup or returned). Default false." - added
Input schema / properties / password / descriptionAdded value: +"Optional password for pdf, xlsx, docx or pptx." - added
Input schema / properties / password_hint / descriptionAdded value: +"Optional hint shown with the password prompt." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_extract_design_kit6 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Name for the kit, e.g. \"Resal\" (required with save=true)." - added
Input schema / properties / overwrite / descriptionAdded value: +"true = replace a saved kit with the same name." - added
Input schema / properties / path / descriptionAdded value: +"A .key deck or .numbers table that already has the look to capture." - added
Input schema / properties / save / descriptionAdded value: +"true = save it under name for reuse; contrast must pass." - added
Input schema / properties / sheet / descriptionAdded value: +"For .numbers: the sheet holding the styled table." - added
Input schema / properties / table / descriptionAdded value: +"For .numbers: the styled table."
- Changed
iwork_find4 fields changed- added
Input schema / properties / folder / descriptionAdded value: +"Folder to search; omit to search the allowed folders, else Documents, Desktop and Downloads." - added
Input schema / properties / kind / descriptionAdded value: +"numbers | keynote | pages; omit for all three." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results (1–500)." - added
Input schema / properties / name / descriptionAdded value: +"Part of the file name to match (case-insensitive)."
- Changed
iwork_list_backups1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_list_templates1 field changed- added
Input schema / properties / app / descriptionAdded value: +"numbers | pages | keynote."
- Changed
iwork_metadata1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_read1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_restore_backup2 fields changed- added
Input schema / properties / backup / descriptionAdded value: +"Backup name from iwork_list_backups." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_save_design_kit3 fields changed- added
Input schema / properties / kit / descriptionAdded value: +"{\"fonts\": {...}, \"colors\": {...}, \"theme\": \"...\", \"background\": \"#RRGGBB\", \"base\": \"<preset>\"} or a preset name to copy." - added
Input schema / properties / name / descriptionAdded value: +"Name to save under, e.g. \"Resal\" (letters, digits, spaces, - or _; not a preset name)." - added
Input schema / properties / overwrite / descriptionAdded value: +"true = replace a saved kit with the same name."
- Changed
iwork_thumbnail2 fields changed- added
Input schema / properties / out_dir / descriptionAdded value: +"Folder for the extracted JPEG; omit for a temporary folder." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
iwork_verify_format8 fields changed- added
Input schema / properties / bold / descriptionAdded value: +"Expected bold (true) or not bold (false)." - added
Input schema / properties / color / descriptionAdded value: +"Expected text colour \"#RRGGBB\"." - added
Input schema / properties / font / descriptionAdded value: +"Expected font; matches when the drawn font name contains it, e.g. \"Avenir\"." - added
Input schema / properties / page_height / descriptionAdded value: +"Expected page height in points." - added
Input schema / properties / page_width / descriptionAdded value: +"Expected page width in points." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)." - added
Input schema / properties / size / descriptionAdded value: +"Expected size in points (±0.6)." - added
Input schema / properties / text / descriptionAdded value: +"Text that must appear in the rendered PDF; for Arabic, one word (multi-word RTL text is reordered)."
- Changed
iwork_verify_render3 fields changed- added
Input schema / properties / assert_text / descriptionAdded value: +"Text that must be visibly rendered; for Arabic, one word." - added
Input schema / properties / expected_pages / descriptionAdded value: +"Expected page (or slide) count; omit to skip that check." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers, .key or .pages file (absolute, or starting with ~)."
- Changed
keynote_add_chart8 fields changed- added
Input schema / properties / columns / descriptionAdded value: +"Column names, e.g. [\"Q1\", \"Q2\", \"Q3\"]." - added
Input schema / properties / data / descriptionAdded value: +"One list of numbers per row name, each as long as columns." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / group_by / descriptionAdded value: +"row (each row is a series) | column." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / rows / descriptionAdded value: +"Row names, e.g. [\"2025\", \"2026\"] (series when group_by=\"row\")." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)." - added
Input schema / properties / type / descriptionAdded value: +"bar | stacked_bar | horizontal_bar | stacked_horizontal_bar | line | area | stacked_area | pie | scatter (or a *_3d variant)."
- Changed
keynote_add_image7 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / image / descriptionAdded value: +"Image file to place (png, jpg, heic, pdf…)." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)." - added
Input schema / properties / width / descriptionAdded value: +"Image width in points; height keeps the aspect ratio." - added
Input schema / properties / x / descriptionAdded value: +"Left edge in points (give with y); omit to let Keynote place it." - added
Input schema / properties / y / descriptionAdded value: +"Top edge in points from the slide's top-left corner (give with x)."
- Changed
keynote_add_slide3 fields changed- added
Input schema / properties / after / descriptionAdded value: +"Insert after this slide number; 0 = make it the first slide; omit = at the end." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)."
- Changed
keynote_add_table9 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / header_rows / descriptionAdded value: +"How many rows at the top are headers (styled and kept on top)." - added
Input schema / properties / kit / descriptionAdded value: +"A design kit: a name from iwork_list_design_kits (preset or saved, e.g. \"executive\", \"Resal\") or your own {\"fonts\": {...}, \"colors\": {\"title\": \"#RRGGBB\", ...}}. Contrast is checked." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / rows / descriptionAdded value: +"The table, header first: [[\"Region\", \"Q1\"], [\"Riyadh\", 1200]]; text, numbers or null; \"=…\" is a formula." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)." - added
Input schema / properties / width / descriptionAdded value: +"Table width in points; omit for Keynote's default." - added
Input schema / properties / x / descriptionAdded value: +"Left edge in points (give with y); omit to let Keynote place it." - added
Input schema / properties / y / descriptionAdded value: +"Top edge in points (give with x)."
- Changed
keynote_apply_design4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / kit / descriptionAdded value: +"A design kit: a name from iwork_list_design_kits (preset or saved, e.g. \"executive\", \"Resal\") or your own {\"fonts\": {...}, \"colors\": {\"title\": \"#RRGGBB\", ...}}. Contrast is checked." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / set_theme / descriptionAdded value: +"true = also switch to the kit's theme first."
- Changed
keynote_build_deck5 fields changed- added
Input schema / properties / kit / descriptionAdded value: +"A design kit: a name from iwork_list_design_kits (preset or saved, e.g. \"executive\", \"Resal\") or your own {\"fonts\": {...}, \"colors\": {\"title\": \"#RRGGBB\", ...}}. Contrast is checked." - added
Input schema / properties / path / descriptionAdded value: +"Where to create the new .key deck; it must not exist yet." - added
Input schema / properties / slides / descriptionAdded value: +"The outline: [{\"title\": \"…\", \"body\": [\"bullet\", …], \"notes\": \"…\", \"layout\": \"…\", \"image\": \"/path.png\", \"chart\": {…}, \"table\": {…}}, …]; see the tool description for chart and table." - added
Input schema / properties / theme / descriptionAdded value: +"Theme name from keynote_list_themes; the kit's theme is used when omitted." - added
Input schema / properties / transition / descriptionAdded value: +"Transition for every slide, e.g. \"dissolve\"."
- Changed
keynote_delete_slide3 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_duplicate_slide3 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_format_text8 fields changed- added
Input schema / properties / color / descriptionAdded value: +"Text colour \"#RRGGBB\"." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / font / descriptionAdded value: +"PostScript font name, e.g. \"HelveticaNeue-Bold\"." - added
Input schema / properties / item / descriptionAdded value: +"Text item index on the slide (from keynote_inspect_style); or use match." - added
Input schema / properties / match / descriptionAdded value: +"A unique piece of the item's text, to pick it instead of item." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / size / descriptionAdded value: +"Font size in points." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_inspect_style1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)."
- Changed
keynote_list_slides1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)."
- Changed
keynote_move_slide4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"The slide to move, 1-based." - added
Input schema / properties / to / descriptionAdded value: +"Where it should end up, 1-based."
- Changed
keynote_replace_text5 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / find / descriptionAdded value: +"Text to find (literal unless regex=true)." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / regex / descriptionAdded value: +"true = treat find as a regular expression." - added
Input schema / properties / replace / descriptionAdded value: +"Replacement text."
- Changed
keynote_review_deck1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)."
- Changed
keynote_set_presenter_notes4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / notes / descriptionAdded value: +"The presenter notes text (replaces existing notes)." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_set_slide_layout4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / layout / descriptionAdded value: +"Layout (master slide) name from keynote_inspect_style." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_set_slide_text5 fields changed- added
Input schema / properties / body / descriptionAdded value: +"New body: a string, or a list of bullets; omit to leave it." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)." - added
Input schema / properties / title / descriptionAdded value: +"New title text; omit to leave it."
- Changed
keynote_set_theme3 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / theme / descriptionAdded value: +"Theme name from keynote_list_themes."
- Changed
keynote_set_transition7 fields changed- added
Input schema / properties / automatic / descriptionAdded value: +"true = advance to the next slide on its own." - added
Input schema / properties / delay / descriptionAdded value: +"Delay before it starts, in seconds." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / duration / descriptionAdded value: +"Duration in seconds." - added
Input schema / properties / effect / descriptionAdded value: +"Transition effect, e.g. \"dissolve\", \"push\", \"magic move\", or \"none\"." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_skip_slide4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / skipped / descriptionAdded value: +"true = hide the slide in the slideshow; false = show it again." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)."
- Changed
keynote_slide_image3 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .key deck (absolute, or starting with ~)." - added
Input schema / properties / slide / descriptionAdded value: +"Slide number, 1-based (keynote_list_slides lists them)." - added
Input schema / properties / width / descriptionAdded value: +"Image width in pixels (320–2560)."
- Changed
keynote_slideshow3 fields changed- added
Input schema / properties / action / descriptionAdded value: +"start | stop | next | previous." - added
Input schema / properties / from_slide / descriptionAdded value: +"Slide to start from, 1-based." - added
Input schema / properties / path / descriptionAdded value: +"The deck to present (needed for start)."
- Changed
numbers_add_table8 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / header_columns / descriptionAdded value: +"How many columns on the left are headers." - added
Input schema / properties / header_rows / descriptionAdded value: +"How many rows at the top are headers (styled and kept on top)." - added
Input schema / properties / new_sheet / descriptionAdded value: +"Name of a new sheet to create for the table instead." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / rows / descriptionAdded value: +"The data, header first: [[\"Region\", \"Revenue\"], [\"Riyadh\", 1200]]." - added
Input schema / properties / sheet / descriptionAdded value: +"Existing sheet to add it to; omit for the first sheet." - added
Input schema / properties / table_name / descriptionAdded value: +"Name of the new table (must not exist on that sheet)."
- Changed
numbers_apply_design6 fields changed- added
Input schema / properties / banding / descriptionAdded value: +"true = tint alternate body rows." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / kit / descriptionAdded value: +"A design kit: a name from iwork_list_design_kits (preset or saved, e.g. \"executive\", \"Resal\") or your own {\"fonts\": {...}, \"colors\": {\"title\": \"#RRGGBB\", ...}}. Contrast is checked." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_create2 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Where to create the new .numbers file; it must not exist yet." - added
Input schema / properties / sheets / descriptionAdded value: +"Sheets with their tables: [{\"name\": \"Sales\", \"tables\": [{\"name\": \"Q1\", \"rows\": [[\"Region\", \"Revenue\"], [\"Riyadh\", 1200]], \"header_rows\": 1}]}]."
- Changed
numbers_delete7 fields changed- added
Input schema / properties / at / descriptionAdded value: +"1-based position of the first one to delete." - added
Input schema / properties / count / descriptionAdded value: +"How many to delete." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / what / descriptionAdded value: +"rows | columns."
- Changed
numbers_edit_cell6 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / ref / descriptionAdded value: +"One cell in A1 notation, e.g. \"B2\"." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / value / descriptionAdded value: +"New value: a number stays a number, text stays text exactly (Arabic too); null clears. For a formula use numbers_set_formula."
- Changed
numbers_import_csv7 fields changed- added
Input schema / properties / csv_path / descriptionAdded value: +"The CSV or TSV file to read (UTF-8)." - added
Input schema / properties / delimiter / descriptionAdded value: +"Column separator, e.g. \",\" or \"\\t\"; omit to detect it." - added
Input schema / properties / header_rows / descriptionAdded value: +"How many rows at the top are headers (styled and kept on top)." - added
Input schema / properties / numbers / descriptionAdded value: +"true = plain numbers become numbers; false = keep every cell as text." - added
Input schema / properties / path / descriptionAdded value: +"Where to create the new .numbers file; it must not exist yet." - added
Input schema / properties / sheet / descriptionAdded value: +"Name for the new sheet." - added
Input schema / properties / table / descriptionAdded value: +"Name for the new table."
- Changed
numbers_insert8 fields changed- added
Input schema / properties / at / descriptionAdded value: +"1-based position to insert before; omit to append at the end." - added
Input schema / properties / count / descriptionAdded value: +"How many to insert." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / values / descriptionAdded value: +"Optional contents: one list per new row (or column), e.g. [[\"Riyadh\", 1200]]." - added
Input schema / properties / what / descriptionAdded value: +"rows | columns."
- Changed
numbers_inspect_format3 fields changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_merge_cells5 fields changed- added
Input schema / properties / cells / descriptionAdded value: +"The range to merge, e.g. \"A1:C1\". Refused if it would hide values." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_recalculate2 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)."
- Changed
numbers_set_borders9 fields changed- added
Input schema / properties / cells / descriptionAdded value: +"A cell or range in A1 notation, e.g. \"B2\" or \"A1:D1\"." - added
Input schema / properties / color / descriptionAdded value: +"Line colour \"#RRGGBB\"." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / sides / descriptionAdded value: +"all | outline | inner | top | right | bottom | left." - added
Input schema / properties / style / descriptionAdded value: +"solid | dashes | dots | none (none removes the border)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / width / descriptionAdded value: +"Line width in points."
- Changed
numbers_set_cell_style16 fields changed- added
Input schema / properties / align / descriptionAdded value: +"Horizontal: left | center | right | justify | auto." - added
Input schema / properties / bold / descriptionAdded value: +"true/false; omit to leave as is." - added
Input schema / properties / cells / descriptionAdded value: +"A cell or range in A1 notation, e.g. \"B2\" or \"A1:D1\"." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / fill_color / descriptionAdded value: +"Cell fill \"#RRGGBB\"." - added
Input schema / properties / font_color / descriptionAdded value: +"Text colour \"#RRGGBB\"." - added
Input schema / properties / font_name / descriptionAdded value: +"Font family, e.g. \"Helvetica Neue\" or \"Geeza Pro\"." - added
Input schema / properties / font_size / descriptionAdded value: +"Font size in points." - added
Input schema / properties / italic / descriptionAdded value: +"true/false; omit to leave as is." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / strikethrough / descriptionAdded value: +"true/false; omit to leave as is." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / underline / descriptionAdded value: +"true/false; omit to leave as is." - added
Input schema / properties / valign / descriptionAdded value: +"Vertical: top | middle | bottom." - added
Input schema / properties / wrap / descriptionAdded value: +"true = wrap text in the cell."
- Changed
numbers_set_dimensions6 fields changed- added
Input schema / properties / columns / descriptionAdded value: +"Column widths in points by letter, e.g. {\"A\": 160, \"C\": 90}." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / rows / descriptionAdded value: +"Row heights in points by 1-based row number, e.g. {\"1\": 32}." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_set_formula6 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / formula / descriptionAdded value: +"The formula, starting with \"=\", e.g. \"=SUM(B2:B9)\"." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / ref / descriptionAdded value: +"One cell in A1 notation, e.g. \"B2\"." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_set_headers6 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / header_columns / descriptionAdded value: +"Number of header columns (0 for none)." - added
Input schema / properties / header_rows / descriptionAdded value: +"Number of header rows (0 for none)." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
numbers_set_number_format12 fields changed- added
Input schema / properties / accounting / descriptionAdded value: +"true = accounting style (symbol aligned left) for currency." - added
Input schema / properties / cells / descriptionAdded value: +"A cell or range in A1 notation, e.g. \"B2\" or \"A1:D1\"." - added
Input schema / properties / currency_code / descriptionAdded value: +"ISO currency code for format=currency, e.g. \"SAR\" or \"USD\"." - added
Input schema / properties / date_format / descriptionAdded value: +"Date pattern for format=datetime, e.g. \"d MMM yyyy\"." - added
Input schema / properties / decimal_places / descriptionAdded value: +"Digits after the decimal point." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / format / descriptionAdded value: +"number | currency | percentage | scientific | fraction | datetime | text." - added
Input schema / properties / negative_style / descriptionAdded value: +"minus | red | parentheses | red_parentheses." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table." - added
Input schema / properties / thousands_separator / descriptionAdded value: +"true = group thousands (1,234)."
- Changed
numbers_sort6 fields changed- added
Input schema / properties / column / descriptionAdded value: +"Column letter to sort by, e.g. \"C\"." - added
Input schema / properties / descending / descriptionAdded value: +"true = largest/last first." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .numbers file (absolute, or starting with ~)." - added
Input schema / properties / sheet / descriptionAdded value: +"Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables)." - added
Input schema / properties / table / descriptionAdded value: +"Table name on that sheet. Omit when the sheet has one table."
- Changed
pages_fill_placeholders3 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)." - added
Input schema / properties / values / descriptionAdded value: +"Placeholder tag → text, e.g. {\"Name\": \"Sara\", \"Date\": \"3 October\"} (tags from pages_list_placeholders)."
- Changed
pages_list_placeholders1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)."
- Changed
pages_read_tables1 field changed- added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)."
- Changed
pages_replace_all4 fields changed- added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / find / descriptionAdded value: +"Text to find, exactly." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)." - added
Input schema / properties / replace / descriptionAdded value: +"Replacement text."
- Changed
pages_set_body3 fields changed- added
Input schema / properties / body / descriptionAdded value: +"The new body text; paragraphs separated by newlines. Resets body formatting." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)."
- Changed
pages_set_table_cells4 fields changed- added
Input schema / properties / cells / descriptionAdded value: +"{\"B2\": 1200, \"C3\": \"تم\", \"D9\": \"=SUM(D2:D8)\"}: numbers stay numbers, \"=…\" is a formula, null clears." - added
Input schema / properties / dry_run / descriptionAdded value: +"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." - added
Input schema / properties / path / descriptionAdded value: +"Path to the .pages document (absolute, or starting with ~)." - added
Input schema / properties / table / descriptionAdded value: +"The table's name or number (from pages_read_tables)."
64 tool updates
v2.4.0- First observed
iwork_capabilities - First observed
iwork_create - First observed
iwork_create_from_template - First observed
iwork_delete_design_kit - First observed
iwork_export - First observed
iwork_extract_design_kit - First observed
iwork_find - First observed
iwork_list_backups - First observed
iwork_list_design_kits - First observed
iwork_list_templates - First observed
iwork_metadata - First observed
iwork_read - First observed
iwork_restore_backup - First observed
iwork_save_design_kit - First observed
iwork_thumbnail - First observed
iwork_verify_format - First observed
iwork_verify_render - First observed
keynote_add_chart - First observed
keynote_add_image - First observed
keynote_add_slide - First observed
keynote_add_table - First observed
keynote_apply_design - First observed
keynote_build_deck - First observed
keynote_delete_slide - First observed
keynote_duplicate_slide - First observed
keynote_format_text - First observed
keynote_inspect_style - First observed
keynote_list_slides - First observed
keynote_list_themes - First observed
keynote_move_slide - First observed
keynote_replace_text - First observed
keynote_review_deck - First observed
keynote_set_presenter_notes - First observed
keynote_set_slide_layout - First observed
keynote_set_slide_text - First observed
keynote_set_theme - First observed
keynote_set_transition - First observed
keynote_skip_slide - First observed
keynote_slide_image - First observed
keynote_slideshow - First observed
numbers_add_table - First observed
numbers_apply_design - First observed
numbers_create - First observed
numbers_delete - First observed
numbers_edit_cell - First observed
numbers_import_csv - First observed
numbers_insert - First observed
numbers_inspect_format - First observed
numbers_merge_cells - First observed
numbers_recalculate - First observed
numbers_set_borders - First observed
numbers_set_cell_style - First observed
numbers_set_dimensions - First observed
numbers_set_formula - First observed
numbers_set_headers - First observed
numbers_set_number_format - First observed
numbers_sort - First observed
pages_fill_placeholders - First observed
pages_list_placeholders - First observed
pages_preflight - First observed
pages_read_tables - First observed
pages_replace_all - First observed
pages_set_body - First observed
pages_set_table_cells
TDQS
Scored across 64 tools
Tools are extensively documented with cross-references and explicit 'use X instead' guidance, but the sheer number (64) and overlapping categories (e.g., multiple create, verify, and design tools) create some risk of misselection. Most tools have distinct purposes, but a few pairs (e.g., iwork_verify_format vs iwork_verify_render, numbers_apply_design vs numbers_set_cell_style) require careful reading to distinguish.
Consistent snake_case with clear app prefixes (iwork_, numbers_, pages_, keynote_) and mostly verb_noun patterns (list_*, set_*, add_*, delete_*). No mixing of conventions. Minor deviations like iwork_capabilities (noun) are acceptable given its special role.
64 tools is excessive for a single MCP server. While the domain (three iWork apps plus design, backup, and verification) is broad, many highly specific tools (e.g., numbers_set_borders, numbers_merge_cells) could be consolidated with parameters, making the set unwieldy for an agent. This exceeds the 25+ threshold for 'too many'.
The surface is remarkably complete for iWork automation: CRUD for Numbers/Keynote/Pages, formatting, verification, backup/restore, design kit management, and export. Minor gaps (e.g., no Numbers chart creation, no Pages image insertion) are either app limitations or out of scope, but core workflows are fully covered.
Maintenance
Related MCP Connectors
Create and manage documents, spreadsheets, and presentations from your AI assistant.
Docs, decks, forms, apps you build and deploy, automations, and AI images, video and voice.
Give your AI agents a design superpower. Generate, edit, and publish publication-grade decks, reports, landing pages, resumes, and marketing visuals directly within your agent workflow. Delivering frontier-level design quality at 3× the speed and 53× lower cost -from conversational prompt to live link or vector PDF in minutes.
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Related MCP Servers
- AlicenseBqualityAmaintenanceAn MCP server that provides 113 tools for automating Apple iWork apps (Numbers, Pages, Keynote) via JavaScript for Automation, enabling AI assistants to create, edit, and export documents, spreadsheets, and presentations.165 npm37MIT
- AlicenseBqualityCmaintenanceEnables complete Office document lifecycle management for AI agents, including creation, editing, conversion, and templating of DOCX, XLSX, PPTX, PDF, and EML files.4029 PyPIMIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to create and manipulate Microsoft Office documents (PowerPoint, Word, Excel) on macOS via AppleScript automation.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to read, create, edit Word/Excel/PPT files and manage the filesystem on the user's computer via natural language.MIT