apple-suite-mcp
Provides tools for interacting with Apple's suite of applications (Calendar, Reminders, Contacts, Notes, Mail, Messages, Maps, Photos, Music) with an opt-in capability model and confirmation gates.
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., "@apple-suite-mcpWhat's on my calendar for tomorrow?"
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.
apple-suite-mcp
Secure, modular, opt-in MCP connector for the Apple app suite — Calendar, Reminders, Contacts, Notes, Mail, Messages, Maps, Photos, Music, Shortcuts.
A security-focused fork and rewrite of supermemoryai/apple-mcp (MIT).
Status: 1.0.0 — all ten modules implemented, everything disabled by
default. See DESIGN.md for the architecture and
CLAUDE.md for development guidance.
Modules
Module | Backend | macOS permission | Writes |
Calendar | Swift · EventKit | Calendars | create / update / delete (delete confirmed) |
Reminders | Swift · EventKit | Reminders | create / complete / delete (delete confirmed) |
Contacts | Swift · Contacts.framework | Contacts | create |
Notes | fixed JXA template | Automation | create |
fixed JXA template | Automation | send (always confirmed) | |
Messages | sqlite child (reads) + JXA (send) | Full Disk Access | send (always confirmed) |
Maps | Swift · MapKit | none | — |
Photos | Swift · PhotosKit | Photos | — (metadata only) |
Music | fixed JXA template | Automation | playback controls |
Shortcuts |
| per shortcut | run (always confirmed) |
Mail, Messages, and Shortcuts are never exposed over the remote transport.
Related MCP server: AirMCP
Why another Apple MCP?
The popular upstream is convenient but risky: it interpolates untrusted strings
into AppleScript (injection → RCE), grabs broad permissions at once, auto-updates
from @latest, and has no confirmation gates. This project keeps the same
feature surface with a much smaller attack surface:
upstream | this project | |
Backend | AppleScript string concat | structured native helper (no script text) |
Permissions | all at once | disabled by default, opt-in per module |
Full Disk Access | required together | isolated to the Messages read child process |
Updates |
| pinned versions + provenance + SBOM |
Side-effects | none | elicitation confirmation |
MCP spec | — | 2025-11-25 (Streamable HTTP + OAuth 2.1) |
Design highlights
Capability model. A module that isn't enabled contributes zero tools/ resources and never triggers a macOS permission prompt.
Activate what you use.
apple-mcp enable calendar/enable reminders --write. Changes apply on restart (deliberately, to prevent runtime coercion).No injection by construction. Untrusted data is passed as structured args to a Swift/JXA helper, never concatenated into executable script text. Enforced by
tests/injection/and a CI static guard.
Install
Do not use
@latestor--no-cache. Pin a version.
git clone https://github.com/HanlunWang/apple-suite-mcp.git
cd apple-suite-mcp
npm ci
npm run build # compiles TypeScript + builds and signs the Swift helpersThen point your MCP client at the built server (absolute path, no auto-update):
{
"mcpServers": {
"apple-suite": {
"command": "node",
"args": ["/absolute/path/to/apple-suite-mcp/dist/src/server.js"]
}
}
}Nothing is exposed until you enable a module — see below. Building the Swift helpers requires the Xcode command line tools; the JXA-backed modules (notes, mail, messages send, music) need no build step.
Capability control
apple-mcp status # module matrix + config path
apple-mcp enable calendar # read-only
apple-mcp enable reminders --write
apple-mcp enable messages --yes # FDA module: requires explicit acknowledgement
apple-mcp disable mailChanges apply on server restart (deliberate — a running session cannot be
coerced into enabling capabilities). Config lives at ~/.apple-mcp/config.json,
created locked-down (everything disabled) on first run.
The model can queue an enable request via the capabilities_request_enable
tool, but it only becomes real when you approve it:
apple-mcp pending # see what the model asked for
apple-mcp approve calendar # apply it (FDA modules re-prompt for acknowledgement)
apple-mcp reject calendar # or discard itRemote access (optional)
The default transport is stdio (no network exposure). To serve Claude over
HTTP, switch transport in the config to Streamable HTTP:
// ~/.apple-mcp/config.json
"transport": {
"type": "http",
"auth": "oauth2.1", // or "apikey" (key auto-generated, 0600)
"bind": "127.0.0.1", // expose further only behind your own TLS proxy
"port": 8765,
"allowRemoteWrite": false, // remote sessions are read-only by default
"oauth": {
"issuer": "https://your-authorization-server.example",
"audience": "https://your-host.example/mcp" // tokens for anything else are rejected
}
}Remote sessions always get a reduced surface: Mail and Messages are never
registered over HTTP, write tools require allowRemoteWrite: true, and every
request must carry a bearer token (JWT verified against the authorization
server's JWKS with strict issuer + audience checks, per RFC 8414/9728).
Develop
Requires Node ≥ 22.6 to run TS directly (CI uses 24); the built dist/ runs on ≥ 20.
npm ci
npm run build # compile TS + build the Swift eventkit-helper
npm run lint # static injection guard
npm test # node:test — includes the injection regression suite
npm run dev # stdio serverIntegration tests against the real EventKit stores (they trigger a macOS permission prompt and touch your default calendar/reminder list) are opt-in:
APPLE_MCP_INTEGRATION=1 npm testSecurity
See SECURITY.md. Report vulnerabilities privately.
License
MIT. Retains upstream attribution — see NOTICE.
This server cannot be installed
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 Servers
- Alicense-qualityBmaintenanceA local MCP server that provides a secure bridge for automating macOS applications like Notes, Calendar, and Mail through AppleScript. It uses template-based execution and policy-based allowlists to enable safe, structured interaction with system tools.Last updatedMIT
- AlicenseAqualityAmaintenanceMCP server for the entire Apple ecosystem — 150+ tools across 17 modules including Notes, Reminders, Calendar, Mail, Messages, Music, Maps, Screen Capture, and Apple Intelligence. macOS only.Last updated2883715MIT
- AlicenseBqualityBmaintenanceA macOS MCP server that provides AI agents with secure access to Calendar, Reminders, Notes, and Health data via native Apple APIs.Last updated3018MIT
- Alicense-qualityAmaintenanceMCP server for Apple Calendar, Mail, Reminders, and Files on macOS using native frameworks.Last updated6611MIT
Related MCP Connectors
MCP connector for Apple Reminders — search, create, complete, and edit via your own Mac.
MCP connector that lets ChatGPT list, search, and run your Apple Shortcuts via a local Mac agent
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
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/HanlunWang/apple-suite-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server