iwork-mcp
The iwork-mcp server automates Apple Numbers, Pages, and Keynote on macOS via MCP, exposing 117 tools (the provided schema lists only iwork_status).
iwork_status: Check iwork-mcp availability on this platform.Numbers: Create spreadsheets, read/write cells and ranges, use formulas, format tables, add charts, export PDF/spreadsheet/CSV.
Pages: Create/format documents, edit paragraphs, insert images and tables, export PDF/document/EPUB/text.
Keynote: Create/edit presentations, lay out slide items, add presenter notes and transitions, export PDF/presentation/HTML/images.
Transports: Local stdio or authenticated Streamable HTTP with OAuth 2.1, dynamic client registration, PKCE, and refresh tokens.
Allows control of Apple iWork applications (Numbers, Pages, Keynote) for automating document creation, editing, formatting, and export.
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-mcpCreate a monthly budget spreadsheet in Numbers with income and expenses"
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 agent-neutral MCP server for automating Numbers, Pages, and Keynote on macOS. It exposes 117 tools over local stdio or authenticated Streamable HTTP.

Capabilities
Numbers: create spreadsheets, read and write cells and ranges, use formulas, format tables, add charts, and export to PDF, spreadsheet, or CSV formats.
Pages: create and format documents, edit paragraphs, insert images and tables, and export to PDF, document, EPUB, or text formats.
Keynote: create and edit presentations, lay out slide items, add presenter notes and transitions, and export to PDF, presentation, HTML, or image formats.
Requirements: macOS 13 or newer, current iWork applications, and Node.js 18 or newer. macOS asks for Automation permission on first use.
Related MCP server: ppt-mcp
Local stdio setup
stdio is the default transport. Each client starts its own server process.
Grok Bot
Add an MCP command server named iwork with command npx and arguments -y, iwork-mcp.
Cursor
Use the included plugin listing, or add this to the client's MCP configuration:
{
"mcpServers": {
"iwork": {
"command": "npx",
"args": ["-y", "iwork-mcp"]
}
}
}Claude
For Claude Desktop:
npx iwork-mcp installFor Claude Code:
claude mcp add iwork -- npx -y iwork-mcpCodex
codex mcp add iwork -- npx -y iwork-mcpRemote HTTP setup
Runs on your own Mac. iWork (Pages, Numbers, Keynote) is macOS-only, so this server must run on the Mac that has iWork installed. The Cloudflare Tunnel only exposes that Mac's server to remote clients; it cannot run in the cloud.
First configure an owner passphrase and start the server. It binds only to loopback by default:
iwork-mcp --setup-passphrase
IWORK_MCP_PUBLIC_URL=https://YOUR-TUNNEL-HOST iwork-mcp --http --port 8787The endpoint is https://YOUR-TUNNEL-HOST/mcp. It uses OAuth 2.1 dynamic client registration, authorization code with required PKCE S256, rotating refresh tokens, and short-lived opaque access tokens. Every MCP request requires a bearer token.
Optionally set IWORK_MCP_REDIRECT_HOST_ALLOWLIST to a comma-separated list of permitted OAuth callback hosts, host:port pairs, or origins.
For a free named Cloudflare Tunnel and the optional launch-at-login template, follow Remote connector setup.
Grok Bot, Cursor, Claude, and Codex
For any client that accepts a remote MCP URL, add:
{
"mcpServers": {
"iwork": {
"url": "https://YOUR-TUNNEL-HOST/mcp"
}
}
}The client discovers the OAuth metadata, registers itself, opens the local consent page, and obtains tokens. If a client uses a different configuration shape, enter the same URL in its remote connector UI.
Example requests
Build a monthly budget in Numbers with planned and actual income, categorized expenses, variance formulas, and a net savings row.
Create a concise Keynote review deck with six slides, a consistent layout, and presenter notes.
Draft a formatted Pages project brief with objectives, milestones, risks, and next steps.
How it works
For local use, an MCP client communicates with the server over stdio. For remote use, the official SDK's Streamable HTTP transport serves /mcp behind OAuth. Tool registration is shared, so both transports expose the same tool set. Tool calls run JavaScript for Automation through the system scripting process and control the installed iWork applications.
Development
npm install
npm run build
npm testnpm test runs unit and remote OAuth/HTTP tests without opening iWork applications. The HTTP suite skips with a clear reason when a sandbox prohibits socket binding. Integration tests require the applications and skip when they are unavailable:
npm run test:integration
npm run test:allReviewer HTTP and OAuth test
Use temporary per-user directories or remove them after testing. Start the server:
IWORK_MCP_PASSPHRASE='YOUR-LONG-TEST-PASSPHRASE' \
IWORK_MCP_PUBLIC_URL=http://127.0.0.1:8787 \
iwork-mcp --http --host 127.0.0.1 --port 8787In a second terminal, inspect metadata and register a loopback client:
curl http://127.0.0.1:8787/.well-known/oauth-protected-resource
curl http://127.0.0.1:8787/.well-known/oauth-authorization-server
curl -sS -X POST http://127.0.0.1:8787/register \
-H 'content-type: application/json' \
-d '{"redirect_uris":["http://127.0.0.1/callback"],"client_name":"Review Client","token_endpoint_auth_method":"none"}'Create a PKCE verifier and challenge, replacing YOUR-CLIENT-ID with the registration result:
VERIFIER='review-verifier-0123456789012345678901234567890123456789'
CHALLENGE=$(printf %s "$VERIFIER" | openssl dgst -sha256 -binary | openssl base64 -A | tr '+/' '-_' | tr -d '=')
open "http://127.0.0.1:8787/authorize?response_type=code&client_id=YOUR-CLIENT-ID&redirect_uri=http%3A%2F%2F127.0.0.1%2Fcallback&code_challenge=$CHALLENGE&code_challenge_method=S256&state=review"Enter the owner passphrase. The browser redirects to the loopback callback; copy the code query value from its address. Exchange it and then initialize MCP:
curl -sS -X POST http://127.0.0.1:8787/token \
-d grant_type=authorization_code \
-d client_id=YOUR-CLIENT-ID \
-d redirect_uri=http://127.0.0.1/callback \
-d code=YOUR-AUTHORIZATION-CODE \
-d code_verifier="$VERIFIER"
curl -i -X POST http://127.0.0.1:8787/mcp \
-H 'authorization: Bearer YOUR-ACCESS-TOKEN' \
-H 'content-type: application/json' \
-H 'accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"review","version":"1"}}}'Copy the mcp-session-id response header, send an notifications/initialized notification, then call tools/list with the same bearer token and session header. The automated test performs this complete sequence and verifies that HTTP returns the same 117 tools as stdio.
Security and limitations
/registerallows 20 attempts per client per minute, with a global cap of 200 attempts per minute. Requests rejected by the per-client limit do not consume the global budget. IPv6 clients share a bucket for their /64 prefix, and IPv4-mapped IPv6 addresses use the corresponding IPv4 address. Client buckets are capped at 1,000 entries, evicting expired or oldest entries as needed.When the socket peer is loopback, the limiter uses the first
CF-Connecting-IPvalue if it is a valid IP address; otherwise it uses the socket address. Trust this header only when usingcloudflared, because Cloudflare overwrites it. With other loopback tunnels (ngrok,ssh -R, Tailscale Funnel), the header is client-controlled, so only the global cap is meaningful. A distributed attacker can still exhaust the global cap, even withcloudflared, temporarily blocking new client setup (existing tokens are unaffected).
The HTTP server defaults to 127.0.0.1. Keep it on loopback behind an HTTPS tunnel, set IWORK_MCP_PUBLIC_URL to the exact external origin, use a strong owner passphrase, and never store secrets in the repository. OAuth state is stored in the current user's data directory with mode 0600; the passphrase hash is stored separately in the current user's configuration directory.
iWork's scripting dictionaries determine what can be automated. Some application features are unavailable or require macOS Accessibility permission.
Available Tools
1 tooliwork_statusB
Check iwork-mcp availability on this platform
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description should disclose behavioral traits. It only states the action, but does not mention that it is read-only, has no side effects, or requires no authentication. The information is insufficient.
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 a single, concise sentence that immediately states the purpose. No extraneous words.
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, no-output-schema tool, the description is adequate but fails to specify what 'availability' means in terms of return value or format. Slightly incomplete.
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 are no parameters, so the description does not need to add parameter details. Baseline for 0 parameters is 4.
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 checks availability of 'iwork-mcp' on the platform. It uses a specific verb and resource. No siblings exist to require differentiation.
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?
No guidance is provided on when to use this tool versus alternatives. There is no mention of context or exclusions.
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
v0.8.8- First observed
iwork_status
TDQS
Scored across 1 tool
With only one tool, there is no possibility of confusion or overlap.
A single tool with a clear, descriptive name; no consistency issues arise.
The tool count of 1 is far too few for a server presumably covering iWork functionality, which requires document creation, editing, and management tools.
The tool covers only a health check, leaving all core iWork operations absent, resulting in a severely incomplete surface.
Maintenance
Related MCP Connectors
Presentations.AI MCP server — create designed slide decks from a topic, text, or document.
MCP server for your apps' tools and custom tools, plus hosted AI agents and approval-gated workflows
Automate 1,000+ services from any MCP-compatible AI agent: build Applets, run actions and queries.
An agent-first office suite Claude & ChatGPT read and write over one MCP URL.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server for macOS Automator that enables AI to control Mac computers by executing AppleScript/JXA, running automation workflows, and performing system-level tasks like sending emails and organizing files.65 npm4MIT
- AlicenseNot gradedqualityAmaintenanceAn MCP server that provides real-time control of Microsoft PowerPoint via COM automation, enabling AI agents to create and edit presentations with 155 tools across 26 categories.1,502 PyPI100MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server that lets Claude control Microsoft Word and Excel on macOS via AppleScript, providing 98 tools for document and spreadsheet automation.54 npm1MIT
- AlicenseNot gradedqualityAmaintenanceA local MCP server that lets Claude, Cursor, Codex, or any MCP client work with Office documents on your Mac: evaluate spreadsheet formulas, read/write XLSX and PPTX, extract structured DOCX content, and merge/split/protect PDFs. 100% local, no network calls, no account. 14 tools.MIT