Apple Mail, Calendar and Notes on macOS for any MCP client. Local, no dependencies.
Most AI mail connectors live in the cloud and only work with Gmail or Outlook. If your mail lives in Apple Mail — a self-hosted IMAP server, iCloud, a company account — there was no clean way to give an assistant access.
This MCP server talks to the apps on your Mac directly. That means:
read tool and a write tool. Approve read once and forget about it."true", "3 days ago", folder instead of mailbox), and every mistake comes back with a plain "how to fix" line instead of a dead end.Ask in plain words — "what's waiting for my reply?", "forward the printer invoice to accounting", "put a call with Sam on Tuesday at 1pm", "save the PDFs from the contract email". Under the hood:
| Needs response | Emails from real people you haven't answered yet. Ignores no-reply senders and notifications. |
| Awaiting reply | Emails you sent that none of the recipients has answered. Great for follow-ups. |
| Conversation view | A whole thread in order — their messages and your replies — from every folder, including Sent. Messages count as one conversation only when the subject and the people match. |
| Replied / forwarded / flagged | Every message in a list shows whether you already replied, so the assistant doesn't nag you twice. |
| Inbox and folders | Latest messages in any folder, unread counts, all accounts. |
| Search | By subject, sender or message text; by date range; unread, flagged or with attachments; in one folder or everywhere. |
| Read a message | Headers, recipients, plain-text body (long ones in pages) and a list of attachments. |
| Attachments | See names, sizes and types — and save them into your attachments folder. |
| Send | New emails with To / Cc / Bcc, from any of your addresses, with files attached. |
| Reply / reply all | With the original quoted below. Opens as a draft you check and send. |
| Forward | With attachments and an optional note on top. Opens as a draft too. |
| Draft mode | Replies and forwards open in Mail by default, because Mail itself picks their recipients and quote. New emails can open as drafts as well. |
| Folders | Create folders, including nested ones (Alerts/Kubernetes). |
| Move & delete | Move messages between folders or to the account's Trash — with a dry run that shows what would change first. |
| Flags & read status | Flag in any colour, mark read or unread — one message or a batch. |
| Rules | Create, list, enable, disable and delete Mail rules, so new mail sorts itself. |
| Events | See what's on for any date range across all calendars, repeating events included; create and delete events. A date alone makes an all-day event. |
| Browse & search | Folders, recent notes, search by title or text. Recently Deleted stays hidden unless you ask. |
| Write | Create notes, append to them or rewrite them; delete to Recently Deleted. |
You need macOS 14 or later (older versions will likely work but aren't tested) and an MCP client.
Get the code — git clone https://github.com/ipsupport-llc/apple-mail-mcp, or unzip the .mcpb from the latest release — and add the server to your client's config. It runs on the Mac's own osascript:
{
"mcpServers": {
"apple-mail": {
"command": "/usr/bin/osascript",
"args": ["-l", "JavaScript", "/path/to/apple-mail-mcp/server/apple-mail-mcp.js"]
}
}
}
./install.sh --print prints this block with the right path. The server is also listed in the MCP Registry as io.github.ipsupport-llc/apple-mail-mcp.
The first time the assistant touches Mail, Calendar or Notes, macOS asks whether your client may control them — click Allow.
apple-mail-mcp.mcpb from the latest release.Updates, settings and removal live in Settings → Extensions.
As environment variables in the server's env (Claude Desktop: Settings → Extensions → Apple Mail, Calendar & Notes → Configure):
| Variable | What it does |
|---|---|
APPLE_MAIL_READ_ONLY=true | Removes the write tool entirely. The assistant can read and search, but can't send, move, delete or create anything. A good default for a shared or work machine. |
APPLE_MAIL_DEFAULT_ACCOUNT | Used when the assistant doesn't name an account, e.g. Work. |
APPLE_MAIL_SAVE_DIR | Where saved attachments go. Defaults to ~/Downloads; ~ and ${HOME} are expanded. |
APPLE_MAIL_TIMEOUT | Seconds one call may take before it is stopped (default 25). |
Most clients ask before using a tool. We recommend allowing read once and approving write each time, so you always see what gets sent, moved or deleted.
dry_run: true shows exactly what would go out — recipients (Reply-To and reply-all included), subject and the full text — and a reply is not sent if Mail would address it differently. Results of a send list what Mail actually sent.ping and tools/list always answer, and a cancelled call really stops. A write that timed out is not repeated blindly. Each call is logged to stderr with its app and duration.whole_series: true.(1), (2)… appended. Files attached to outgoing mail also come only from that folder, so "attach ~/.ssh/id_rsa" is refused; files from other tools (say, a Seafile download) go there first.write on manual approval, or turn on read-only mode, if that worries you.server/apple-mail-mcp.js, with no dependencies and no network calls.Do Mail rules run when my Mac is asleep? No. Apple Mail rules only run while Mail is open, and only on new mail. To sort old mail, ask the assistant to move it. If your mail server supports Sieve, server-side filters are more reliable across devices.
The assistant can't read a note. It's probably locked. Unlock it in Notes first; locked notes stay private.
Search is slow. Apple Mail's scripting is slow on very large folders, and searching message text is the slowest. Narrow it to an account, a folder or a date range.
The tools don't show up.
Check that the server is enabled in your client, then restart the client. ./test.sh talks to the server directly, without any client. (Claude Desktop: Settings → Extensions; logs in ~/Library/Logs/Claude/.)
"Not authorized to send Apple events". Open System Settings → Privacy & Security → Automation and allow your MCP client (the app that starts the server) to control Mail, Calendar and Notes.
Two tools, each taking { "action": "...", "args": { ... } }. The full list of arguments is in each tool's description.
read — never changes anything
| Action | Purpose |
|---|---|
needs_response | Emails from people that wait for your answer |
awaiting_reply | Your sent emails with no answer |
get_thread | Whole conversation, oldest first |
list_messages | Latest messages in a folder, with replied / forwarded / flagged |
search_messages | Text (subject, sender, body), dates, unread, flagged, attachments, all folders |
read_message | One full message |
list_attachments | Attachments of a message |
list_accounts | Mail accounts and addresses |
list_mailboxes | Folders with unread counts |
list_rules | Mail rules with conditions and actions |
list_calendars | Calendars |
list_events | Events in a date range, repeating events expanded |
list_note_folders | Notes accounts and folders |
list_notes | Recent notes |
search_notes | Search notes |
read_note | One full note |
write — changes things (hidden in read-only mode)
| Action | Purpose |
|---|---|
send_email | New email, attachments from the attachments folder (draft: true opens it instead) |
reply_message | Reply / reply all — opens as a draft in Mail by default, draft: false sends |
forward_message | Forward with attachments — draft by default, draft: false sends |
set_read | Mark read / unread, one or many |
set_flag | Flag / unflag with colour |
move_messages | Move to another folder (dry_run available) |
delete_messages | Move to the account's Trash (dry_run available) |
save_attachments | Save attachments into the attachments folder |
create_mailbox | New folder |
create_rule · set_rule_enabled · delete_rule | Mail rules (a deleted rule comes back as a copy) |
create_event · delete_event | Calendar events (whole_series: true to delete a repeating one; a deleted event comes back as a copy) |
create_note · update_note · delete_note | Notes |
Message ids come from list and search results; pass account and mailbox from the same row. If the folder is wrong, the message is found by its id anyway.
Small models get help: argument names are matched loosely (folder → mailbox, messageId → id), values are converted ("false", "1,2,3", "tomorrow"), short action names work (reply, search), and every result explains in notes how the call was read. Anything that sends, deletes or creates is never guessed: there, unclear input is an error with a hint.
Run the server straight from a checkout instead of the .mcpb:
git clone https://github.com/ipsupport-llc/apple-mail-mcp.git ~/code/apple-mail-mcp
cd ~/code/apple-mail-mcp
./install.sh --print # any client: prints the config block to paste
./install.sh # Claude Desktop: adds an "apple-mail" entry to claude_desktop_config.json (backs it up first)
./test.sh # talks to the server directly and prints your accounts and calendars
./uninstall.sh # removes the entry
install.sh takes the same settings as the extension: --read-only / --no-read-only, --account Work, --save-dir ~/Documents/Attachments. Running it again keeps earlier settings unless you change them (--reset forgets them).
Restart Claude Desktop after install.sh. Don't use the manual install and the .mcpb at the same time.
Tests never touch your mail: unit tests run the server against fake Mail, Calendar and Notes apps, protocol tests only speak JSON-RPC. CI runs both on macOS for every pull request.
/usr/bin/osascript -l JavaScript tests/unit.js server/apple-mail-mcp.js
python3 tests/protocol.py
Releasing: push a tag and GitHub Actions runs the tests, builds the .mcpb, attaches it to a release and lists it in the MCP Registry.
git tag v1.4.0 && git push origin v1.4.0
MIT © IPSupport LLC. Some feature ideas were inspired by patrickfreyer/apple-mail-mcp (MIT).
This listing does not have a supported local package template. Use the maintainer’s documentation for its hosted endpoint, authentication, and client-specific setup. No install command has been inferred.
https://github.com/ipsupport-llc/apple-mail-mcp/releases/download/v1.6.1/apple-mail-mcp.mcpbotherApple Mail, Calendar & Notes works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.