apple-mcp
Provides tools for interacting with Apple Calendar and Reminders (and eventually Mail) through native macOS frameworks, enabling management of events, reminders, and mail.
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-mcpshow my upcoming calendar events"
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.
mac-mcp
One consolidated MCP server for native macOS apps — Calendar & Reminders read/write, Messages & Notes content search over the native stores, id-first Mail with draft-and-open replies, plus read-only context and a few actions across Contacts, Photos, Safari, and Shortcuts. Python + FastMCP 2.0, managed with uv.
Replaces the pile of Apple MCP servers a life-cockpit otherwise juggles with a single modular adapter layer you own. Every read returns pointers (id + one-line summary + open-in-app deeplink), never full bodies — so it structurally avoids the context-bloat bug of the archived flagship server; bodies are a separate, bounded, opt-in fetch.
macOS only. See DESIGN.md for the rationale and CHANGELOG.md for what's landed.
Install
Requires macOS and Python ≥ 3.11.
From source (works today):
git clone https://github.com/elfensky/mac-mcp && cd mac-mcp
uv syncThen point your MCP client at the project's own venv python — deterministic, and it carries the locked PyObjC wheels:
{
"mcpServers": {
"mac-mcp": {
"command": "/absolute/path/to/mac-mcp/.venv/bin/python",
"args": ["-m", "mac_mcp"]
}
}
}From PyPI (once published — see the CHANGELOG): uvx mac-mcp runs the server with no clone,
and the MCP config becomes "command": "uvx", "args": ["mac-mcp"].
Permissions (macOS TCC)
Grant access when macOS prompts — the first call to each app triggers its dialog:
EventKit — Calendar + Reminders (read/write).
Automation (per app) — Mail, Notes, Contacts, Photos, Safari, Messages actions/reads.
Full Disk Access — required for Messages content (
chat.db) and the fast Notes path (NoteStore.sqlite). Notes degrades to Automation without it; Messages content raises a clear, typed error telling you to grant it. Run thedoctortool to see what's granted.
Related MCP server: nucleus-apple-mcp
Tools
Reads return pointers; results are capped per adapter. Bodies/content are a separate bounded
fetch. Writes/actions are skipped entirely when MAC_MCP_READ_ONLY is set (see below).
Calendar & Reminders — read/write (EventKit)
Tool | Args | Notes |
|
| list events as pointers |
|
| list reminders as pointers |
| — | containers (id + name) to target writes |
| title, start, end (ISO), calendar, location, notes, |
|
| id, |
|
| title, due, list_name, notes, |
|
| id | marks complete |
A write targets its container by name or Pointer.id; an ambiguous name raises rather than
guessing. Recurrence is an RFC 5545 RRULE (FREQ/INTERVAL/COUNT/UNTIL subset, e.g.
FREQ=WEEKLY;INTERVAL=2;COUNT=10); a recurring reminder needs a due date; unsupported parts
(BYDAY, …) are rejected, not ignored.
Mail — id-first read + draft-and-open (Automation)
Nothing here ever sends — replies and drafts open a compose window for you to review.
Tool | Args | Notes |
| subject-OR-sender substring | inbox matches; id = stable RFC822 message-id, |
| id | one message's plaintext, bounded + truncation-marked |
| mailbox ( | attachment name/size/downloaded per message; works on Drafts |
| to, subject, body | opens a draft for review — never sends; returns a locator |
| message_id, reply_body, | native threaded reply (sets In-Reply-To/References), quoted original, opens for review — never sends |
Messages — content via chat.db (read-only; Full Disk Access)
Tool | Args | Notes |
| — | conversation list (id + name); no content, no FDA needed |
| query, | search message text (decodes |
| contact (phone/email), | recent messages with one person; |
| id | full text of one message by guid |
Notes — NoteStore.sqlite reads + opt-in bodies
Tool | Args | Notes |
| title/snippet substring | matching notes (id + snippet); diacritic- & smart-punctuation-insensitive |
| — | every live note (id + "Account / Folder" + snippet), Recently Deleted excluded |
| ids (≤ 50) | opt-in plaintext hydration → |
| id, | moves to Recently Deleted; |
Other read-only context
Tool | Args | Returns |
| name substring | cards (name, org, first phone + email) |
| search string | media (filename); matches the Photos search field |
| — | every open tab (url + title) |
| name substring (empty = all) | the user's Shortcuts; id = stable UUID, |
| — | health check / time / permission diagnostics |
Actions (writes)
Tool | Args | Notes |
| given_name, family_name, organization | |
| name or id, optional | runs a Shortcut; returns a bounded output snippet |
| url | opens in a new tab; bare host → |
Read-only mode
Set MAC_MCP_READ_ONLY=1 (or true / yes) to register reads only — every write and action
tool is skipped, a safe-deploy guard. (Reads may still open apps / read local stores.)
Develop
uv sync
uv run pytest # unit tests (mock at the adapter boundary)
uv run pytest -m integration # real macOS / EventKit / TCC — run manually, never in CI
uv run ruff check . # lint (config in pyproject.toml)
uv run ruff format . # format
uv run mac-mcp # run the server (stdio)ruff (lint + format, line-length 88) and pytest gate CI — full workflow in CONTRIBUTING.md.
Prior art & credits
mac-mcp builds on prior work — the Apple Mail MCP it draws from, the EventKit/Photos servers it references, the project that pioneered the unified-Apple-MCP pattern, and FastMCP / PyObjC / the MCP spec it depends on. See CREDITS.md.
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.
Latest Blog Posts
- 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/elfensky/mac-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server