apple-mcp
A unified MCP server for macOS native apps, currently supporting Calendar and Reminders via EventKit with bidirectional sync, and Mail planned.
README
mac-mcp
One consolidated MCP server for native macOS apps — Calendar & Reminders read/write, plus read-only context and a few actions across Mail, Notes, Contacts, Photos, Safari, Messages, and Shortcuts. Python + FastMCP 2.0, managed with uv.
Replaces the two Apple MCP servers a life-cockpit otherwise juggles (apple-events + a forked
Apple Mail MCP) 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.
See DESIGN.md for the rationale and CHANGELOG.md for what's landed.
Tools
Reads return pointers; results are capped per adapter. Writes/actions are skipped entirely when
MAC_MCP_READ_ONLY is set (see below).
Calendar & Reminders — read/write (EventKit)
| Tool | Args | Notes |
|---|---|---|
events |
when = today | week | YYYY-MM-DD |
list events as pointers |
reminders |
due = today | overdue | this-week | a list name |
list reminders as pointers |
calendars |
— | calendars (id + name) to target writes |
reminder_lists |
— | reminder lists (id + name) to target writes |
create_event / update_event |
title, start, end (ISO), calendar, location, notes, all_day, recurrence |
update is a full replace by id |
delete_event |
id | |
create_reminder / update_reminder |
title, due, list_name, notes, priority (0–9), start, recurrence |
update is a full replace by id |
complete_reminder |
id | marks complete |
Recurrence is an RFC 5545 RRULE string — the FREQ / INTERVAL / COUNT / UNTIL
subset (e.g. FREQ=WEEKLY;INTERVAL=2;COUNT=10). A recurring reminder requires a due date;
unsupported parts (BYDAY, …) are rejected rather than silently ignored.
Read-only context (AppleScript / CLI)
| Tool | Args | Returns |
|---|---|---|
mail |
subject substring | inbox matches (subject + sender) |
notes |
title substring | matching notes (id + title) |
contacts |
name substring | cards (name, org, first phone + email) |
photos |
search string | media (filename); matches the Photos search field |
safari_tabs |
— | every open tab (url + title) |
messages_chats |
— | conversation list (id + name; no message content) |
shortcuts |
name substring (empty = all) | the user's Shortcuts (name) |
ping |
— | health check |
Actions (writes)
| Tool | Args | Notes |
|---|---|---|
create_contact |
given_name, family_name, organization | |
run_shortcut |
name, optional input_text |
runs a Shortcut; returns a bounded output snippet |
safari_open |
url | opens in a new tab; bare host → https://; only http/https allowed |
Read-only mode
Set MAC_MCP_READ_ONLY=1 (or true / yes) to register reads only — every write and action
tool above is skipped, a safe-deploy guard.
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.
Use as an MCP server
Launch off the project's own venv python — deterministic, and it carries the locked PyObjC wheels:
{
"mcpServers": {
"mac-mcp": {
"command": "/Users/you/Developer/mac-mcp/.venv/bin/python",
"args": ["-m", "mac_mcp"]
}
}
}
macOS only. Calendar/Reminders use EventKit; the other adapters script their apps via Automation. Grant access when macOS prompts (TCC) — the first call to each app triggers its permission dialog.
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. </content>
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.