Apple Mail MCP Server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| USER_EMAIL_PREFERENCES | No | Personal email preferences that will be provided to the AI assistant when using email tools. This helps Claude understand your preferred email accounts, defaults, and workflow. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": true
} |
| resources | {
"subscribe": false,
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_inbox_emailsA | List all emails from inbox across all accounts or a specific account. Replaces the former get_recent_emails tool — use account + max_emails to get recent emails from a single account. |
| get_mailbox_unread_countsA | Get unread counts per mailbox for one account or all accounts. When summary_only=True, returns only per-account inbox unread totals (replaces the former get_unread_count tool). |
| list_accountsB | List all available Mail accounts. |
| list_account_addressesA | List all configured email addresses for each Mail account. Useful for mapping a Mail.app account name (e.g. "Gmail", "Work") to the actual email address(es) it receives mail at — handy when an integration needs to know which inbox a message landed in by address rather than by Mail.app's display name. |
| list_mailboxesA | List all mailboxes (folders) for a specific account or all accounts. |
| get_inbox_overviewB | Get a comprehensive overview of your email inbox status across all accounts. |
| search_emailsA | Unified search tool with JSON output, pagination, and real date filtering. Consolidates subject search, sender search, body content search, and cross-account search into a single tool. |
| get_email_threadA | Get an email conversation thread - messages linked by Message-ID, not just by subject. Candidates are found by subject (fast, filtered inside Mail), then linked through their Message-ID / In-Reply-To / References headers. Messages that merely share the subject but belong to a different conversation are listed separately instead of being mixed into the thread. |
| get_email_sourceA | Return the raw RFC 822 source of a single message. The MCP's other body-extraction paths return Mail.app's rendered content (HTML collapsed to display text, hrefs dropped, embedded objects replaced with U+FFFC). This tool returns the raw source instead — all headers, all MIME parts, all hrefs intact. Implementation note:Wraps the Identifier resolution: Output sizing: messages can be large (a plain note is ~200 KB; with
attachments far larger). |
| create_rich_email_draftA | Create a rich-text email draft by generating an unsent This is the preferred path for HTML or richly formatted emails because Mail reliably renders |
| reply_to_emailC | Reply to an email matching a subject keyword. |
| compose_emailC | Compose and send a new email from a specific account. |
| forward_emailC | Forward an email to one or more recipients. |
| manage_draftsB | Manage draft emails - list, create, send, open, or delete drafts. |
| move_emailA | Move email(s) matching filters from one mailbox to another. Supports subject, sender, and date filters. Use dry_run=True to preview matches without moving. Set only_read=True to skip unread emails (useful for archiving). For archiving to "Archive", just set to_mailbox="Archive". Pass message_ids to move specific messages by exact id (ignores other filters; same fast path as update_email_status). |
| save_email_attachmentC | Save a specific attachment from an email to disk. |
| update_email_statusA | Update email status - mark as read/unread or flag/unflag emails. When message_ids is provided, uses exact ID matching (ignores other filters). Otherwise filters by subject, sender, and/or age. |
| manage_trashA | Manage trash operations - delete emails or empty trash. When dry_run=True (default) and action is "move_to_trash", previews what would be deleted without acting. Set dry_run=False to actually move to trash. Mail's AppleScript interface has no command that erases a message: |
| create_mailboxA | Create a new mailbox (folder) in the specified account. Supports nested paths via the parent_mailbox parameter (e.g., parent_mailbox="Projects" + name="2024" creates Projects/2024). You can also pass a full slash-separated path as name (e.g., "Projects/2024/ClientName") and omit parent_mailbox. |
| synchronize_accountA | Force Mail.app to synchronize an account (or every account) with its IMAP / Exchange server right now. Equivalent to clicking the refresh button next to the account or selecting Mailbox → Synchronize. Use after Implementation note:Uses the Mail.app's synchronize is potentially long-running. We wrap each
invocation in |
| list_email_attachmentsB | List attachments for emails matching a subject keyword. |
| get_statisticsC | Get comprehensive email statistics and analytics. |
| export_emailsC | Export emails to files for backup or analysis. |
| inbox_dashboardA | Get an interactive dashboard view of your email inbox. Returns an interactive UI dashboard resource that displays:
This tool returns a UIResource that can be rendered by compatible MCP clients (like Claude Desktop with MCP Apps support) to provide an interactive dashboard experience. Note: Requires mcp-ui-server package and a compatible MCP client. |
| get_awaiting_replyA | Find sent emails that haven't received a reply yet. Scans the Sent mailbox for outgoing emails and cross-references with the Inbox to see if a reply (matching subject) was received from the same recipient. Useful for follow-up tracking. |
| get_needs_responseA | Identify unread emails that likely need a response from you. Filters out newsletters, automated emails, and noreply senders. Prioritises direct emails (To: you) with question marks as likely needing a reply. |
| get_top_sendersB | Analyse a mailbox to find the most frequent senders. Useful for identifying key contacts, high-volume senders to filter, or newsletter sources to unsubscribe from. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 27 tools
Most tools have clearly distinct purposes (e.g., search vs. thread vs. source, send vs. reply vs. forward), but several analytics/overview tools—get_inbox_overview, inbox_dashboard, get_statistics, get_top_senders—overlap in the 'summarize my inbox' space. The detailed descriptions help clarify differences, so ambiguity is limited to a few related tools.
Names are consistently snake_case with action-first verbs (list_, get_, create_, manage_, move_, update_), which is highly readable. Minor deviations exist, such as the noun-only inbox_dashboard and the less predictable get_awaiting_reply/get_needs_response phrasing.
27 tools is above the typical 3–15 range and crosses the 'too many' threshold; several analytics/insight tools could be consolidated into fewer endpoints. However, each tool does map to a distinct operation, so the set is heavy rather than chaotic.
The surface covers core email workflows well: listing accounts/mailboxes, searching/reading, sending/replying/forwarding, moving, flagging, trash, attachments, and sync. Gaps include no delete/rename mailbox operation and no explicit single-email rendered-body fetch, though raw source is available as a workaround.