iwork-mcp
This server automates Apple iWork apps (Pages, Numbers, Keynote) on macOS to create, modify, read, and export documents, spreadsheets, and presentations using the native apps for real layout, formatting, and calculation.
Status/diagnostics:
iwork_statusreports running iWork apps and versions.Pages: create structured documents with heading hierarchy; read
.pagestext; export to PDF, Word, EPUB, plain text, RTF; replace placeholders while preserving styles; append text inheriting styles; list installed templates.Numbers: create spreadsheets from tabular data with real formulas, fitted column widths, header rows, merged cells; read computed values; set/update cells via A1 notation and trigger recalculation; sort data while preserving header/footer rows; export to PDF, Excel, CSV.
Keynote: list localized slide layouts/themes; create presentations with slides, bullets, presenter notes; add images and charts at specified coordinates; get slide size; export to PDF (with/without notes), PowerPoint, or PNG slide images.
General: preserves existing document formatting; uses real iWork features rather than filling file formats; handles localized number formats, formulas, and layout names; never overwrites files.
Provides tools for creating, reading, and editing Apple iWork documents, spreadsheets, and presentations (Pages, Numbers, Keynote), including exporting to PDF/Word/EPUB and recalculating formulas in Numbers.
Click on "Install 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-mcpCreate a meeting agenda in Pages and export to PDF"
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.
iwork-mcp
An MCP server that drives Pages, Numbers and Keynote from Claude Code (or any MCP client): it generates documents, spreadsheets and presentations, and exports them to PDF, Word, Excel, CSV, PowerPoint, RTF, plain text or PNG slide images.
The model writes the content; the Apple apps do the layout, the arithmetic and the
exporting. There is no proprietary format to reconstruct — .pages, .numbers and
.key are compressed Protobuf inside a ZIP, and reading them by hand is a dead end.
Here they are written by the people who invented them.
Output is laid out, not merely filled in: fitted column widths, real header rows, merged spanning headers, a heading hierarchy in documents, and any of the 53 Keynote themes or 111 Pages templates installed on the machine. A generated file should look like someone made it, not like a data dump that happens to open in Numbers.
Requirements
macOS with iWork installed, and Python 3.11+.
Related MCP server: iwork-mcp
Install
git clone https://github.com/atipicguy/iwork-mcp.git
cd iwork-mcp
uv sync
uv run pytest # 96 tests, no app windows openedRegister it in ~/.claude.json, under mcpServers:
"iwork": {
"command": "/absolute/path/to/iwork-mcp/.venv/bin/python",
"args": ["-m", "iwork.server_mcp"],
"cwd": "/absolute/path/to/iwork-mcp"
}Local models
The server is a plain stdio MCP server and talks to any MCP host, not only
Claude Code — verified by driving it from a raw JSON-RPC client: initialize,
tools/list, tools/call, no Claude anywhere.
LM Studio hosts MCP servers directly. Add it to ~/.lmstudio/mcp.json:
{
"mcpServers": {
"iwork": {
"command": "/absolute/path/to/iwork-mcp/.venv/bin/python",
"args": ["-m", "iwork.server_mcp"],
"cwd": "/absolute/path/to/iwork-mcp",
"env": { "IWORK_PROFILE": "lean" }
}
}
}Ollama is a model runner, not an MCP host: it has no way to load this by
itself. It needs a client in between — an MCP-aware front end, or thirty lines
that call tools/list, hand the result to /api/chat as tools, and post the
model's choice back as tools/call. The server side needs nothing.
IWORK_PROFILE=lean
Set it and the server publishes 12 tools with one-line descriptions instead of 20 with full ones. Which of the two you want depends on the model, and the numbers below are measured on this machine rather than guessed — with the same three prompts in Italian, asking for a spreadsheet, an Excel export and a sort.
model | 12 tools ( | 20 tools ( |
qwen3-8b | works, except the hardest task | no tool call at all, 4247 tokens |
qwen3.6-35b-a3b (MoE) | 4/5 — picked the wrong tool for one | 5/5 |
Two conclusions, both against the obvious guess.
A 30B-class model does not need a reduced set — it needs the full one. The
35B scored worse on lean, because the task needed numbers_sort and the
profile did not offer it, so the model reached for the nearest thing it had.
Trimming past what the work requires is its own failure mode. Padded out with
plausible extra tools, the same model stayed correct at 40, 70 and even 117
tools; the cost was latency (14s → 30s) and context (4.5k → 13.5k tokens), not
accuracy. So "too many tools for a local model" is only true of small ones.
For an 8B, the tool count is not the only wall — the argument schema is.
Flat-string tools (numbers_export, numbers_sort, numbers_read) are
reliable. numbers_create, which takes an array of arrays plus a formats
object, succeeded once in five runs at 9 tools and zero in five at 12: both
effectively unreliable, and the difference between them is noise. It is the
most complex schema in the set by a wide margin, and it is the one that fails.
So lean buys an 8B the ability to call anything. It does not buy reliable
grid-building, and no amount of trimming will — that needs a simpler input
shape, not a shorter list.
The server cannot pick the profile for you: MCP's initialize carries the
client name, not which model is behind it. It has to be set in the config.
On first use macOS asks for automation permission for each app: grant it, or every
call fails. iwork_status is the tool to call first when something is wrong — it
separates a missing app from a denied permission from a broken script.
Tools
Tool | What it does |
| which apps respond, and with what version |
| documents, with a real heading hierarchy |
| the 111 installed templates, by name |
| PDF, Word, EPUB, plain text, RTF |
| edit an existing document without wrecking its styles |
| spreadsheets, with real formulas; read them back as text or as results |
| write specific cells in an existing sheet; the app recalculates |
| sort by a column, header left in place |
| PDF, Excel, CSV |
| the 53 installed themes and their layouts |
| presentations, with presenter notes |
| put an image or one of 6 chart types on a slide |
| the theme's slide dimensions, before choosing coordinates |
| PDF (optionally with notes), PowerPoint, PNG slide images |
Filling in a document you already have — a contract, a letter — is a sequence of
pages_replace calls on its placeholders. Updating a quote is numbers_set on three
cells: the formulas that depend on them recalculate by themselves, because Numbers does
it, not us.
Formulas are written as in the app: =SUM(B2:B3) is inserted and computed. Reading
the cell back gives the result, not the formula text. That is the difference between
driving a spreadsheet and producing a CSV that looks like one.
Design comes from the app, not from us
The apps ship a lot of design, and none of it is reachable by writing a file by hand.
keynote_themes and pages_templates list what is installed — 53 and 111 respectively
on a stock Mac — and keynote_create(theme=...) / pages_create(template=...) build on
one. This is the single biggest difference in how the result looks: the default blank
theme is what makes a generated deck read as generated.
With a Pages template the heading face is left alone deliberately. Forcing Helvetica headings onto a serif letterhead looks like two documents glued together, so only the sizes are imposed and the typeface stays the template's.
Spreadsheets that look like the one you were copying
header_rows=2 plus merge=["H1:I1"] gives the two-tier header real bookkeeping uses:
one CASSA spanning ENTRATE and USCITE. Column widths are fitted to the content and
wrapping is switched off wherever the content already fits, so a notes column stops
dragging every row to three lines tall.
numbers_sort leaves the header in place — and takes footer_rows, which matters more
than it sounds: a TOTAL row is by value the largest in its column, so a descending sort
lifts it to the top and its formula then points at the wrong rows.
numbers_create(
rows=[["Guest", "Nights", "CASH", "", "TOTAL"],
["", "", "IN", "OUT", ""],
["Maja Miletic", "7", "1.360,00", "", "=C3-D3"],
["Martin Richardson", "5", "1.220,00", "", "=C4-D4"],
["TOTAL", "=SUM(B3:B4)", "=SUM(C3:C4)", "", "=SUM(E3:E4)"]],
save_in="~/Desktop/bookings.numbers",
header_rows=2, # two-tier header
merge=["C1:D1"], # one CASH spanning IN and OUT
column_formats={"C": "currency", "D": "currency", "E": "currency"},
)Slides that carry more than bullets
Each slide accepts notes, which become the presenter notes;
keynote_export(fmt="pdf", notes=True) then produces the handout with the notes printed
under each slide, which is the form people actually rehearse from. keynote_add_chart
places one of six chart types, keynote_add_image an image. Both take coordinates —
worth passing, because left to itself Keynote centres the object on top of the bullets —
and anything that would hang off the edge is nudged back inside.
What it deliberately does not do
It does not close documents it did not open. Launching an iWork app reopens the ones you had on screen: two real ones came back during development. An indiscriminate
closewould throw away someone else's work.It does not overwrite existing files. That is irreversible and invisible in the reply: whoever reads "done" has no way to know what was there before.
It never concatenates text into the script. See below: that would be injection.
The traps, all paid for
AppleScript injection. Interpolating user text into the script source is the same
vulnerability as in SQL: a quote breaks it, a carefully crafted line executes. Here
everything goes through osascript - arg1 arg2 and on run argv. Verified with text
containing tell application "Finder" to beep: it landed in the document as text and
was not executed.
text items of inside a tell application block. It is sent to the app instead
of being evaluated by AppleScript, and the app answers -1728 can't get. Cost one
debugging session on Numbers and a second one avoided on Keynote. All text splitting
stays in Python; the apps receive values already separated, one per argument.
Numbers parses what it is handed according to the system locale. Measured on an
Italian Mac: "1360.5" lands in the cell as text, "1360,5" becomes the number
1360.5. A canonical decimal therefore produces a column that cannot be summed — and
nothing in the reply says so. Values are parsed in Python (accepting 1360.5,
1360,5, 1.360,00 and 1,360.00) and re-emitted with this Mac's separator.
set bold of paragraph 1 of body text to true replaces the paragraph's text with the
word "true". No error. Pages exposes only size, font and color as usable text
properties — paragraph style, alignment, space before and line spacing are not
settable at all. Weight comes from a bold face instead. The lesson generalises: with
these apps, checking that a command did not raise is not evidence that it did what you
meant. Read the value back.
Rewriting body text wholesale flattens the formatting. The worst of the lot,
because the first test hides it: replace one word and rewrite the whole body, and the
text comes out right and looks done — but a 9pt paragraph came back at 28pt, having
inherited the first one's style. On a contract template that means shipping a file that
reads correctly and is laid out wrong. Edits are therefore targeted: only the
affected paragraph N of body text is reassigned, and the others stay intact (verified:
26 stays 26, 8 stays 8 after a replacement of a different length).
A closed iWork app is not launched by tell application. The script fails with a
flat -600, the application is not running, and so does the first call of every
session. AppleScript's own launch and activate do not fix it — measured on Keynote,
both still returned -600. Only LaunchServices does: open -g -a, with -g so the app
does not steal focus mid-task.
Writing outside the grid does not widen the table. In Numbers a cell beyond
row count is not created: it is a flat -10006. The table has to be widened first,
which means translating AA12 into row 12, column 27.
Empty cells are missing value, which coerced to a string becomes the text
"missing value" — and would land in the data as if someone had typed it.
Numbers infers types, and gets it wrong silently. Writing Giugno into a cell reads
back lunedì 1 giugno 2026 alle ore 00:00:00. No error: just wrong data. The format
must be imposed before the value (set format of cell … to text), and only on what
is neither a number nor a formula — forcing numbers too would make them unsummable and
break the formulas using them.
Keynote layout names are localized. "Title & Bullets" does not exist on an Italian
Mac: it is called "Titolo ed elenco". keynote_layouts asks the app instead of listing
them hard-coded, and the missing-layout error hands back the real ones. One of them even
contains an invisible soft hyphen (Dichiarazione) — one more reason to copy them from
the app rather than type them.
Numbers read back are localized. 1250.5 comes back as 1250,5. Anyone converting
to float needs to know.
ref and descending cannot be used as variable names. ref is short for
a reference to, so a script using it does not compile — and the parse error
points at the following statement, not the guilty one. descending is worse:
it is also the sort-direction enumerator, so the script compiles fine and fails
at run time trying to coerce a constant to a boolean. mod is a third one, the
modulo operator. The test suite runs osacompile over every script in the
package, which catches the whole first family in milliseconds without opening an
app; the second kind only surfaces when the script actually runs.
Formulas can be read back, and come back localized. The cell class has a
read-only formula property, so numbers_read(formulas=True) returns
=SOMMA(B2:B4) for a cell written as =SUM(B2:B4). Both halves matter: it is
worth knowing that reading is possible at all, and worth knowing that a
round-trip which rewrites what it reads produces formulas that work in one
language only.
A CSV export is not comma-separated. Numbers writes it with the system list
separator — ; here — and with the formatted values, so a currency column
comes out as 100,00 €.
Pages cannot insert images. make new image fails on the document
(Non so come creare TMAScriptImageInfoProxy) and on its images element (an
AppleEvent handler error). Keynote accepts them without complaint. Similarly
Numbers cannot create sheets: make new sheet fails, though a second
table inside an existing sheet works.
The slide size comes from the theme, not from Keynote. "Bianco di base" is
1920x1080 and "Bianco" is 1024x768, so coordinates that centre an image in one
put it off the edge of the other. keynote_slide_size asks, and anything placed
too close to an edge is nudged back inside — the object's own width is only
knowable after it exists.
There is no decimal-places property. Column format (number, currency, percent,
text) is settable; the number of decimals is not. A column left on auto shows 1360
next to 2349,5. column_formats={"C": "currency"} is the way to get consistent
decimals.
The apps are not named what they seem. On this machine they are
Pages Creator Studio.app, bundle id com.apple.Pages — not Pages.app nor
com.apple.iWork.Pages. Searching for the historical names returns nothing and leads
to the wrong conclusion that iWork is not installed.
Boundaries
No writing outside the paths given explicitly in the calls.
No commits, no pushes.
License
MIT — see LICENSE.
Available Tools
12 toolsiwork_statusA
Report which iWork apps respond and with what version.
Call this first when something fails: it separates a missing app from a denied automation permission from a wrong script.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It adds meaningful behavioral context beyond the tool name by explaining what failure modes it can distinguish. However, it doesn't describe the actual mechanism or whether the tool itself may prompt for permissions, so a perfect score isn't warranted.
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, front-loaded with the core purpose, and no filler. Every clause adds useful information about what the tool reports and when to invoke 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?
Given the tool's simplicity (0 params) and the presence of an output schema, the description provides sufficient context for an agent to know when to call it and what to expect. It fully covers the diagnostic role without needing extra details.
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 has 0 parameters, so the baseline is 4. The description correctly focuses on behavior rather than parameters, and there is no missing parameter information to compensate for.
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 ('Report') and resource ('which iWork apps respond') plus the version info. It clearly distinguishes this diagnostic tool from the sibling operation tools like pages_create or numbers_set.
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 'Call this first when something fails' and explains the diagnostic value: separating a missing app, denied automation permission, and wrong script. This gives clear when-to-use guidance, even though it doesn't name alternative tools because none exist as diagnostic alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_createA
Generate a Keynote presentation and open it on screen.
Args:
slides: list of {"title": "...", "bullets": ["...", "..."]}. Bullets
are optional: without them the slide is title-only.
layout: localized layout name (see keynote_layouts). If empty, the
first one offering a bullet list is used.
save_in: path to a .key file to save to. If empty it is only opened.
| Name | Required | Description | Default |
|---|---|---|---|
| layout | No | ||
| slides | Yes | ||
| save_in | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full behavioral burden. It discloses the side effect of opening the presentation on screen, explains that an empty save_in means 'only opened,' and specifies the default layout fallback. It does not cover permissions, error handling, or overwrite behavior, but covers the core actions well for a create 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?
The description is compact and well-structured with a one-sentence summary followed by a labeled Args block. Every sentence adds necessary information without redundancy. It is easy to parse and front-loads the most important behavioral detail.
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?
Given the tool's moderate complexity (3 params, one being a list of objects) and the presence of an output schema, the description provides complete coverage of invocation details, defaults, and behavior. It also correctly points to a sibling tool for layout names, closing the loop for the agent.
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 0%, so the description must fully explain each parameter. It does: slides format with optional bullets, layout as a localized name with default behavior, and save_in as a .key file path with the 'empty means only opened' nuance. This adds substantial meaning beyond the bare 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 description opens with a clear and specific verb+resource statement: 'Generate a Keynote presentation and open it on screen.' This distinguishes it from sibling tools for other iWork apps (Pages, Numbers) and from related Keynote tools (keynote_layouts, keynote_export_pdf).
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 provides clear usage context, telling how to structure slides, how layout defaults work, and how save_in affects behavior. It also references the keynote_layouts tool for valid layout names, which is an indirect alternative. However, it does not explicitly state when to use this tool versus other create tools or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_export_pdfC
Export the frontmost Keynote presentation to PDF.
Args: destination: path of the PDF to write.
| Name | Required | Description | Default |
|---|---|---|---|
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It mentions 'frontmost' indicating it acts on a specific presentation, but it does not disclose potential side effects (e.g., overwriting an existing PDF, needing permissions, behavior if Keynote is not running). The description is minimal.
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 very short and front-loaded with the main action. Both sentences earn their place, but the overall under-specification prevents a perfect score; it is concise but somewhat too sparse.
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 simple one-parameter export tool, the description is minimal. It does not explain failure modes, prerequisites, or what happens if the destination exists. Although an output schema exists, the description omits critical behavioral context, making it incomplete for an agent to use reliably.
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 0%, and the description only restates the parameter as 'destination: path of the PDF to write.' This adds minimal extra meaning beyond the schema's 'Destination' title, but does not compensate for the lack of schema-level description or clarify constraints like file extension or permissions.
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 clearly states a specific action: 'Export the frontmost Keynote presentation to PDF.' It identifies the verb ('Export'), the resource ('frontmost Keynote presentation'), and the output format ('PDF'), which distinguishes it from sibling tools like pages_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?
There is no explicit guidance on when to use this tool versus alternatives. It does not mention prerequisites (e.g., Keynote running, having a presentation open) or contrast with sibling tools like pages_export. The only implicit clue is the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keynote_layoutsA
List the slide layouts available on this Mac.
Call this BEFORE keynote_create if a specific layout is needed: the names
are localized and the English ones fail on a non-English system.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing behavioral traits. It reveals key behavior: the tool lists layouts, and that the names are localized (a potential failure mode if using English on non-English systems). It does not explicitly state 'no side effects,' but the verb 'List' implies a read-only operation. The localization caveat adds real value beyond the obvious 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?
The description is two short paragraphs, front-loaded with the primary purpose and followed by a precise usage note. Every sentence earns its place, and there is no redundancy or 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 zero-parameter, read-only list tool with an output schema, the description is complete: it states what is listed, where from, when to use it, and the critical localization caveat. No additional context is needed for an agent to select and invoke this tool 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 has zero parameters, so no parameter documentation is needed in the description. Per the rubric, the baseline for 0 params is 4; the description does not miss any required parameter 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 uses a specific verb ('List') and resource ('slide layouts available on this Mac'), making the tool's purpose immediately clear. It also implicitly distinguishes from sibling tools like keynote_create and keynote_export_pdf, which are the only Keynote-related siblings.
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 call this tool BEFORE keynote_create when a specific layout is needed, explaining that names are localized and English names fail on non-English systems. This provides clear when-to-use guidance and a direct connection to the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_createA
Create a Numbers sheet from a grid of values. First row = headers.
A cell starting with = is inserted as a REAL formula and computed by the
app: =SUM(B2:B10) works. That is the reason to use this instead of writing
a CSV.
The result is laid out, not merely filled: one header row, no phantom header
column, and column widths fitted to the content. Numbers written in any
common convention (1360.5, 1360,5, 1.360,00, 1,360.00) go in as real
numbers you can sum over.
Args:
rows: grid of values; every row must have the same length.
save_in: path to a .numbers file to save to. If empty it is only opened.
table_name: name for the table and the sheet. Defaults to the file name.
| Name | Required | Description | Default |
|---|---|---|---|
| rows | Yes | ||
| save_in | No | ||
| table_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it excels: it discloses that `=`-prefixed cells become real computed formulas, that the result is laid out (not just filled), that localized number formats are parsed into numeric values, and that an empty save_in only opens the document. No annotation contradiction 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?
The description is compact yet information-dense, front-loading the core purpose and using a clear Args section for parameter details. Every sentence contributes value, and the structure makes it easily scannable.
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?
Given the tool's moderate complexity and the presence of an output schema, the description is complete. It covers purpose, parameter semantics, behavioral nuances, and usage alternatives, leaving no major gap for an agent to resolve before invoking the 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 0%, but the description fully compensates by explaining each parameter: rows must be equal-length arrays, save_in is a `.numbers` path and empty means no save, and table_name defaults to the file name. This provides essential meaning beyond the raw 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 description clearly states the verb and resource: 'Create a Numbers sheet from a grid of values.' It distinguishes itself from sibling tools by emphasizing creation, and it explicitly mentions an alternative (writing a CSV), making the tool's purpose unambiguous.
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 provides explicit guidance on when to use this tool: 'That is the reason to use this instead of writing a CSV.' It also describes the specific benefits (real formulas, proper layout, localized number parsing) that justify choosing this tool over simpler alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_readA
Read back the first table of a Numbers sheet, computed values included.
Formulas come back with their result, not with the formula text. Numbers are localized: on an Italian Mac decimals use a comma.
Args:
path: path to the .numbers file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden, and it does: it discloses that computed values are included, formulas return results rather than text, and numbers are localized (with a comma for decimals on Italian systems). These are non-obvious behavioral traits that help the agent set expectations.
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 succinct and front-loaded: the main purpose is in the first sentence, followed by two relevant behavioral notes, then the parameter. Every sentence adds value without redundancy, and the structure is clean.
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 simple read tool with one parameter and an output schema, the description covers the key aspects: what is returned (first table, computed values), formula behavior, localization, and the required path. There is no missing critical information, and the output schema handles return value details.
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 schema has only one parameter, path, with no description (coverage 0%). The description compensates fully by explaining 'path: path to the `.numbers` file.' This provides the meaning and file-type expectation that the schema lacks.
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 starts with 'Read back the first table of a Numbers sheet', which clearly states the action (read) and resource (Numbers sheet) with a specific scope (first table). This distinguishes it from siblings like numbers_set (write) and numbers_create (create), and from pages_read for Pages files.
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 clearly implies use for reading Numbers data with the verb 'Read back'. It does not explicitly mention when not to use it or suggest alternatives like numbers_set for writing, but the context is clear, and the 'first table' limitation is stated upfront.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
numbers_setA
Write specific cells in an existing Numbers sheet, and save it.
Cells are addressed as in the app: {"B7": "1200", "C7": "=B7*0.22"}. The
rest of the sheet is left intact, and Numbers recalculates every formula
that depends on the touched cells — that is the reason this goes through the
app instead of rewriting the file. An empty value empties the cell.
Args:
path: the .numbers file to modify.
cells: A1-notation reference → value. A value starting with = is
inserted as a formula.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| cells | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and fully delivers. It discloses that untouched cells remain intact, that formulas are recalculated, that empty values clear cells, and that values starting with '=' are inserted as formulas. These are critical behavioral traits for a mutation 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?
The description is concise and well-structured: a one-sentence purpose, then a practical example, then essential behavioral details. Every sentence adds value, and the code block makes the parameter format immediately clear.
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?
Given the tool's moderate complexity and the presence of an output schema, the description covers all essential aspects: purpose, parameter syntax, side effects (formula recalculation, cell clearing), and non-destructive behavior. 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 0%, so the description must compensate. It explains both parameters: 'path' as the .numbers file to modify, and 'cells' as A1-notation reference → value, with a concrete example and the special '=' formula rule. This goes far beyond the bare 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 description states a specific action ('Write specific cells in an existing Numbers sheet, and save it') with a clear resource and scope. It distinguishes numbers_set from siblings like numbers_create (creating) and numbers_read (reading) by emphasizing 'existing sheet' and modification.
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 provides clear context for use: it modifies an existing .numbers file and explains why this goes through the app (to recalculate formulas). However, it does not explicitly name alternatives or state when-not-to-use, such as pointing to numbers_create for new files.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_appendA
Append text at the end of an existing Pages document, and save it.
The added text inherits the last paragraph's style. The rest of the document is not touched.
Args:
path: the .pages file to modify.
text: the text to append; line breaks become new paragraphs.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| text | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses important behavior: the text inherits the last paragraph's style, line breaks become new paragraphs, and the rest of the document is untouched. It does not mention failure modes or permissions, but for a simple append operation, this is adequate 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?
The description is compact and well-structured: a one-sentence purpose, two behavioral notes, and a clear Args list. Every sentence earns its place with no fluff 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?
The tool is simple (2 required params, no nested objects) and output schema is present, so return values need not be explained. The description covers purpose, prerequisites (existing document), and behavioral details, making it fully complete for the tool's complexity.
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 0%, so the description must compensate. It does so fully by explaining that 'path' is the .pages file to modify and 'text' is the text to append with line-break semantics. This adds significant meaning beyond the bare 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 description clearly states the action: 'Append text at the end of an existing Pages document, and save it.' This uses a specific verb and resource, and distinguishes itself from sibling tools like pages_create (new document) and pages_replace (replace content).
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 clearly indicates this tool is for an existing document and appends without touching the rest, implying use cases where content should be added rather than created or replaced. However, it does not explicitly name alternatives or state when not to use this tool, 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.
pages_createA
Create a Pages document with this text and open it on screen.
The document comes out structured rather than flat: the first line becomes
the title, and lines starting with # or ## become headings (the marker
is removed). Everything else is body text.
Args:
text: the document content, with the line breaks it should have.
save_in: path to a .pages file to save to. If empty the document is
only opened, not written to disk. Never overwrites: if the file
exists, the call fails.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| save_in | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It thoroughly discloses behaviors: the document is opened on screen, the text is structured with title/headings, markers are removed, save_in can be empty (only opened, not saved), and it never overwrites existing files (fails if the file exists). This is rich, specific behavioral context beyond the basic 'create' 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?
The description is efficient and well-structured. It opens with a clear one-sentence summary, then explains the structured format, and finally details each parameter. Every sentence adds value; there is no filler or 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?
For a two-parameter tool with no annotations, the description is highly complete. It covers the main behavior, parameter semantics, and an important edge case (no overwrite). The output schema is noted to exist, so return values are documented separately; the description provides all necessary usage 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?
The input schema has 0% description coverage, so the description must fully explain the parameters. It does: 'text' is defined as document content with line breaks, and 'save_in' is described as a path to a .pages file, including default behavior and failure mode. This adds significant meaning beyond the bare schema types.
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 clearly states the tool's core function: 'Create a Pages document with this text and open it on screen.' The verb 'Create' and the resource 'Pages document' are specific, and the description distinguishes it from sibling tools like pages_replace and pages_append by focusing on creation rather than modification.
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 implies the tool is for creating new Pages documents, but it does not explicitly state when to use this tool vs. alternatives like pages_append or pages_replace. There are no exclusions or alternative mentions, so the usage context is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_exportA
Export a Pages document to PDF, Word or EPUB.
Args:
path: the source .pages file.
destination: where to write the exported file.
fmt: pdf, word or epub.
| Name | Required | Description | Default |
|---|---|---|---|
| fmt | No | ||
| path | Yes | ||
| destination | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It explains the export operation but does not mention possible overwriting of the destination, required permissions, whether the operation is synchronous, or any side effects beyond creating the exported file. This is minimal transparency for a tool that writes to the filesystem.
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 extremely concise, opening with a clear one-sentence summary followed by a compact parameter list. Every line adds value and there is no fluff or redundant schema 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?
For a simple export tool, the description covers the essential aspects: source file, destination, and format. The output schema likely defines the return value, so that is not a gap. However, it could be more complete by noting overwrite behavior or permissions, but given the low complexity this is adequate.
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 0%, but the description compensates by explaining each parameter: path as the source .pages file, destination as where to write, and fmt as the format with allowed values. This goes beyond the bare property names in the schema, though it omits noting the default value of pdf.
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 begins with 'Export a Pages document to PDF, Word or EPUB,' which uses a specific verb and resource. This clearly distinguishes it from sibling tools like pages_create, pages_read, and keynote_export_pdf by specifying both the app (Pages) and the action (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?
The purpose is evident, so an agent can infer when to use this tool: when exporting a Pages document to one of the listed formats. However, it does not explicitly mention when not to use it or point to alternatives such as keynote_export_pdf for Keynote documents, leaving usage guidance implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_readA
Extract the text of an existing Pages document.
This is the only practical way to read a .pages file: the format is
compressed Protobuf and no text tool opens it.
Args:
path: path to the .pages file.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It adds useful context about the file format (compressed Protobuf) and why this tool is necessary, which goes beyond a simple 'read' statement. It does not disclose error handling or non-destructiveness explicitly, but the read-only nature is implied and the format explanation provides meaningful behavioral insight.
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 concise and well-structured. It leads with the main purpose, provides necessary context in one additional sentence, and lists the argument clearly. Every sentence contributes value without 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?
This is a simple one-parameter read tool, and the description covers purpose, usage rationale, and parameter semantics. An output schema exists, so return values are already documented. The description is complete for the tool's complexity.
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 input schema only provides a title 'Path' with no description. The description compensates fully by explaining 'path: path to the `.pages` file.' This adds clear meaning beyond the schema, completely covering the single parameter and its expected format.
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 clearly states that it extracts text from an existing Pages document with a specific verb and resource. It also distinguishes itself from siblings by explaining that it is the only practical way to read a .pages file, which differentiates it from pages_create, pages_export, and other 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?
The description explicitly explains when to use this tool: to read the text of a .pages file, because the format is compressed Protobuf and no text tool opens it. This provides a clear context for use, though it does not explicitly mention when not to use it or list alternative tools beyond the implication that export might be for other purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pages_replaceA
Replace text in an existing Pages document, and save it.
Preserves formatting: only the paragraphs containing the searched string are touched, and the others keep their size, colour and style. This is the tool for filling in a template — a contract, a letter — by replacing placeholders.
If the string does not appear, the document is left untouched and the call fails: better an error than a "done" on a file that stayed the same.
Args:
path: the .pages file to modify.
search: the text to find. Does not cross line breaks: look for something
that sits inside a single paragraph.
replacement: the text that takes its place.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | ||
| search | Yes | ||
| replacement | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that formatting is preserved (only paragraphs with the match are touched), that the document is left unchanged if the string is absent, and that the call fails rather than returning a false success. This is exemplary behavioral 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?
The description is well-structured: a one-sentence summary, a paragraph on formatting preservation, a paragraph on failure behavior, and a concise Args list. Every sentence adds value, and the length is appropriate for the tool's complexity.
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 description covers the tool's operation, use case, parameter semantics, failure mode, and side effects (saving the document). An output schema is present, so return values don't need elaboration. It is complete for an agent to invoke 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 0%, so the description must explain all parameters. It does: path is '.pages file to modify', search is 'text to find' with a note about not crossing line breaks, and replacement is 'the text that takes its place'. This fully compensates for the bare 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 description opens with 'Replace text in an existing Pages document, and save it,' which is a specific verb-resource pair. It distinctly identifies this as the find-and-replace tool for Pages, separating it from siblings like pages_create, pages_append, and pages_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?
It clearly states this is 'the tool for filling in a template — a contract, a letter — by replacing placeholders,' giving a strong use case. It does not explicitly mention alternatives or when not to use, but the template context provides clear guidance for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct app and action: numbers_set modifies cells, pages_replace replaces text, pages_append appends text, and keynote_create builds slides. Even similar operations (export in pages_export vs keynote_export_pdf) are separated by app, leaving no ambiguity.
The naming mostly follows an app_verb pattern (pages_create, numbers_read, keynote_create). Minor deviations: keynote_export_pdf embeds the format, iwork_status uses a prefix instead of an app name, and keynote_layouts uses a noun rather than a verb like list_layouts, but these are still recognizable and consistent in style.
12 tools is well-scoped for the iWork suite, covering Pages (5 tools), Numbers (3), Keynote (3), and a status tool. This is neither too sparse nor overwhelming, each tool earning its place.
The set covers the core workflows: Pages has create/read/update/append/export, Numbers has create/read/set, and Keynote has create/export/layouts. Minor gaps exist, like no direct Keynote editing beyond creation and no delete operations, but these are workable and not critical for typical usage.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Generate PDF, Word (.docx) and PowerPoint (.pptx) documents from Markdown over MCP.
Generate, edit, merge, translate and PDF-convert PowerPoint (.pptx) over MCP. 8 tools.
MCP server for the PDFGate API. Generate PDFs, manage documents and handle e-signatures.
Related MCP Servers
- FlicenseAqualityCmaintenanceLocal macOS MCP server that reads, edits, and exports Apple Keynote presentations via JXA. Enables Claude to visually analyze slides, apply design changes, and iterate on presentations directly.19
- 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.17831MIT
- FlicenseAqualityCmaintenanceMCP server for Microsoft Office file operations. Read, write, and create Excel, Word, and PowerPoint files directly from your local filesystem.12
- AlicenseNot gradedqualityCmaintenanceAn MCP server that lets Claude control Microsoft Word and Excel on macOS via AppleScript, providing 98 tools for document and spreadsheet automation.601MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/atipicguy/iwork-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server