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 "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., "@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: local-apple-data
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 deployed
Maintenance
Related MCP Connectors
MCP connector for Apple Reminders — search, create, complete, and edit via your own Mac.
Authenticated, user-scoped MCP connectors for 30+ business systems.
An MCP connector that lets your AI agents ask you questions, request permission approvals, and send alerts as push notifications to your phone and mac notch, so you can unblock and approve your agents from anywhere.
Your Gmail, Calendar, Drive, GitHub, Oura, wallet and confirmed profile facts in any MCP client.
Related MCP Servers
- AlicenseBqualityCmaintenanceA macOS MCP server that provides AI agents with secure access to Calendar, Reminders, Notes, and Health data via native Apple APIs.3022MIT
- AlicenseAqualityDmaintenanceMCP server for privacy-gated local Apple data access including Mail, Messages, Notes, Calendar, Contacts, Photos, Reminders, Voice Memos, and iCloud Drive.301MIT
- AlicenseNot gradedqualityDmaintenanceEnables Claude or any MCP client to read Apple Mail, Calendar, Photos, and create Apple Notes locally on macOS, without any data leaving the machine.MIT
- AlicenseNot gradedqualityBmaintenanceProvides MCP servers to interact with Apple's Mail, Notes, Reminders, and Calendar apps on macOS, enabling search, read, and write operations with configurable permissions and a single Full Disk Access grant.4MIT