Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
jayvee6 avatar

Apple Mail MCP

  • 1 repo stars
  • Updated July 16, 2026
  • jayvee6/apple-mail-mcp

Apple Mail MCP is an MCP server that lets agents read, search, compose, reply, flag, and delete mail in Apple Mail via AppleScript.

About

Apple Mail MCP gives developers on macOS a stdio MCP bridge so Claude Code, Cursor, or other clients manipulate the native Mail app through AppleScript instead of fragile IMAP hacks. During Build, it fits the integrations shelf: you are extending an agent product or personal automation with inbox search, message reading, outbound compose, replies, flagging, and deletion. That is valuable for support triage prototypes, founder inbox zero rituals, or demos where the agent acts as a mail copilot on the same machine as the user. It is inherently Mac-only and requires Mail.app permissions; it is not a hosted SaaS inbox. Complexity sits at beginner-to-intermediate because npm install and MCP config are straightforward, but macOS privacy prompts and AppleScript edge cases demand care. Pair it with human review before bulk sends or deletes—this is operational power, not a marketing automation platform.

  • Read, search, compose, reply, flag, and delete via Apple Mail and iCloud accounts on Mac
  • stdio npm package @jdot6/apple-mail-mcp (v0.1.0) for standard MCP clients
  • AppleScript-backed control—no separate cloud API key for iCloud mail on device
  • Open-source GitHub repository jayvee6/apple-mail-mcp for local inspection

Apple Mail MCP by the numbers

  • Data as of Aug 10, 2026 (Skillselion catalog sync)
terminal
claude mcp add apple-mail-mcp -- npx -y @jdot6/apple-mail-mcp

Add your badge

Show developers this MCP server is listed on Skillselion. Paste this into your README.

Listed on Skillselion
repo stars1
Package@jdot6/apple-mail-mcp
TransportSTDIO
AuthNone
Last updatedJuly 16, 2026
Repositoryjayvee6/apple-mail-mcp

What it does

Wire Apple Mail on macOS into your agent so it can search, read, compose, reply, flag, and delete without leaving the terminal.

Who is it for?

Best when you're on macOS and live in Apple Mail/iCloud and want Claude Code or Cursor to draft and triage from the same machine.

Skip if: Windows/Linux developers, Gmail-only teams wanting OAuth APIs, or anyone who needs bulk unsupervised sending without human review.

What you get

After npm install and stdio registration, your agent can perform mail actions locally through Mail.app with tools instead of copy-paste.

  • Agent-driven mail search, read, compose, reply, flag, and delete actions in Mail.app
  • Repeatable local MCP config for personal or demo mail workflows

By the numbers

  • npm package @jdot6/apple-mail-mcp version 0.1.0
  • Transport: stdio
  • Documented mail actions: read, search, compose, reply, flag, delete
README.md

apple-mail-mcp

The only way to give Claude (or any LLM) access to Apple Mail and iCloud.

Gmail and Outlook have APIs. iCloud doesn't. If you're a Mac user whose email lives in Apple Mail — iCloud, iCloud+, or any account synced through it — there's no web API an LLM can call. This server bridges that gap using AppleScript on your local machine.

It gives Claude full control over Apple Mail: read, search, compose, reply, move, flag, and delete messages using natural language, against your real inbox, with no cloud intermediary.

Built on AppleScript via osascript, with an optional MailKit extension for real-time new-mail events.


Tools

Tool Description
list_folders List all accounts and their mailboxes
list_emails Paginate messages in a mailbox (newest-first)
get_email Read a message's full headers and body
search_emails Filter by sender, subject, date range across mailboxes
compose_email Create a draft or send a new message immediately
reply_email Reply to a message, open as draft or send immediately
move_email Move a message to any mailbox
archive_email Move to Archive (iCloud) or All Mail (Gmail)
move_to_junk Move to Junk (iCloud) or Spam (Gmail)
flag_email Set or clear the flag on a message
mark_read Mark a message as read or unread
delete_email Move to Deleted Messages (iCloud) or Trash (Gmail)
get_pending_events Drain real-time new-mail events from the MailKit bridge
summarize_email Summarize a message in 2-3 sentences via local AI
classify_email Classify by category, priority, and action-required via local AI
draft_reply Draft a reply body via local AI (review before sending)
triage_inbox Bulk-classify up to 20 messages, sorted by priority

Requirements

  • macOS (tested on Sonoma / Sequoia / macOS 26)
  • Apple Mail open and configured with at least one account
  • Node.js 18+
  • LM Studio (optional) — for local AI tools; any OpenAI-compatible server works

Installation

npx (recommended)

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "apple-mail": {
      "command": "npx",
      "args": ["-y", "@jdot6/apple-mail-mcp"]
    }
  }
}

Restart Claude Desktop, then ask: "What folders do I have in my mail?"

Bootstrap script

Clones the repo, builds it, and patches the Claude config automatically:

curl -fsSL https://raw.githubusercontent.com/jayvee6/apple-mail-mcp/master/install.sh | bash

Manual

git clone https://github.com/jayvee6/apple-mail-mcp.git
cd apple-mail-mcp
npm install && npm run build

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "apple-mail": {
      "command": "/opt/homebrew/bin/node",
      "args": ["/path/to/apple-mail-mcp/dist/index.js"]
    }
  }
}

Use which node to get the full path to your Node binary. Restart Claude Desktop.

Automation Permission

The first time you use a mail tool, macOS will ask whether to allow node to control Mail. Click Allow. If you accidentally deny it, go to System Settings → Privacy & Security → Automation and re-enable it for your terminal or Node.js runtime.


Local AI (optional)

The AI tools run against any local LLM via LM Studio or any OpenAI-compatible server. Email data never leaves your machine with the default config.

Configure via environment variables in claude_desktop_config.json:

{
  "mcpServers": {
    "apple-mail": {
      "command": "npx",
      "args": ["-y", "@jdot6/apple-mail-mcp"],
      "env": {
        "APPLE_MAIL_AI_PROVIDER": "lmstudio",
        "APPLE_MAIL_AI_ENDPOINT": "http://localhost:1234",
        "APPLE_MAIL_AI_MODEL": "gemma-4-it"
      }
    }
  }
}
Variable Default Description
APPLE_MAIL_AI_PROVIDER lmstudio lmstudio | openai | foundation | none
APPLE_MAIL_AI_ENDPOINT http://localhost:1234 Base URL for the AI server
APPLE_MAIL_AI_MODEL gemma-4-it Model identifier
APPLE_MAIL_AI_API_KEY (none) Bearer token for remote providers
APPLE_MAIL_AI_ENRICH_EVENTS (off) Set to 1 to auto-classify new mail events
APPLE_MAIL_AI_ALLOW_REMOTE (off) Set to 1 to allow a non-localhost AI endpoint

Privacy note: If you point APPLE_MAIL_AI_ENDPOINT at a remote server (e.g. OpenAI), full email content will be sent to that server. The server blocks this by default — you must set APPLE_MAIL_AI_ALLOW_REMOTE=1 to acknowledge and enable it.


Companion Skill — Email Compose Review

The skill/SKILL.md file in this repo is a Claude skill that adds a multi-agent review pipeline to every email Claude drafts. Before opening a compose window, Claude runs the draft through five parallel reviewers:

Reviewer Checks
Slop detector AI writing tells, filler phrases, corporate buzzwords
Copy editor Spelling, grammar, punctuation
Active voice Passive → active constructions
Correctness Names, dates, facts match the context
Logic & clarity Clear ask, logical structure, appropriate length

An arbiter synthesizes the reviews into a revised draft and changelog. Claude shows you the result and waits for your approval before opening the draft in Mail. send: true is never used for LLM-drafted email — you send from Mail yourself.

To install the skill in Claude Code:

/skill install /path/to/apple-mail-mcp/skill/SKILL.md

How It Works

Claude ──stdio──▶ MCP server (Node.js)
                      │
                      ├── runScript("list_messages", [...args])
                      │        │
                      │        └── osascript scripts/applescript/list_messages.applescript
                      │                 │
                      │                 └── Apple Mail (AppleScript dictionary)
                      │
                      └── HTTP bridge  ◀── MailKit extension (optional)
                          localhost:27182

Message references are composite keys that uniquely identify a message without a fragile integer index:

{account}::{mailbox}::{RFC 2822 Message-ID}

e.g.  iCloud::INBOX::<CABx3f...@mail.gmail.com>

Every list/search result includes a message_ref. Tools that operate on individual messages (get_email, reply_email, move_email, etc.) take this ref as input. The account and mailbox components scope the AppleScript lookup to the right mailbox; the RFC 2822 ID is the stable identifier. Mail's whose predicate makes the per-message lookup O(1).


MailKit Bridge (optional)

The MailKitBridge/ directory contains an Xcode project for a Mail extension that fires a local HTTP POST to localhost:27182/event when new messages arrive. This populates get_pending_events in real time rather than requiring a manual poll.

The MCP server starts the HTTP listener on startup regardless — it's a no-op if the extension isn't installed.

To build and install the extension: open MailKitBridge/MailKitBridge.xcodeproj in Xcode, build the MailKitBridgeApp scheme, run the app once to register the extension, then enable it in Mail → Settings → Extensions.


Development

npm run dev          # run with tsx (no build step)
npm run build        # compile TypeScript → dist/
npm run typecheck    # type-check without emitting

AppleScript files live in scripts/applescript/ and are invoked directly via osascript — no compilation needed. You can test them standalone:

osascript scripts/applescript/list_folders.applescript
osascript scripts/applescript/list_messages.applescript "iCloud" "INBOX" "1" "5"

Security Notes

  • The HTTP bridge binds to 127.0.0.1 only — not reachable from outside the machine.
  • Script names are validated against path.basename() before use to prevent path traversal.
  • Arguments are passed to osascript via execFile (not a shell), so there is no shell-injection surface.
  • AppleScript calls time out after 30 seconds to prevent hangs if Mail is frozen or showing a permission prompt.
  • Email content in AI prompts is enclosed in XML delimiters (<email>…</email>) to guard against prompt-injection attacks in message bodies.
  • Remote AI endpoints are blocked by default — set APPLE_MAIL_AI_ALLOW_REMOTE=1 to explicitly opt in to sending email data off-device.

License

MIT

Recommended MCP Servers

How it compares

Local AppleScript mail MCP—not Gmail API integration or a hosted shared inbox product.

FAQ

Who is Apple Mail MCP for?

Developers on macOS using Apple Mail or iCloud who want coding agents to search and act on real messages via MCP stdio.

When should I use Apple Mail MCP?

Use it while building personal or product integrations that need on-device mail automation—not for cross-platform production email pipelines.

How do I add Apple Mail MCP to my agent?

Install @jdot6/apple-mail-mcp from npm, add a stdio MCP server entry in your client, and grant macOS Automation permissions to Mail when prompted.

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.