A side-by-side look at the Agent Email and Apple Mail MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Agent Email for communication work as a local process; choose Apple Mail MCP for communication as a local process. You can also run both side by side in one mcpServers block.
list_emails, read_email, search_emails.list_folders, list_emails, get_email.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Communication | Communication |
| Quality signal | 63/100 · Good | 63/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | None listed |
| Verified owner | Community listing | Community listing |
| GitHub stars | 6 | 2 |
| Directory activity | 1 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 27 | 13 |
| Full listing | View Agent Email | View Apple Mail MCP |
list_emailsList recent emails with filtering by unread status, folder, sender, and limit. Use offset for pagination. A row with `isDraft: true` is an unsent draft — it has NOT been sent, and its `receivedAt` is provider-supplied metadata, not evidence of delivery. Never describe such a row as a sent, delivered, or received email.read_emailRead the full content of an email by ID, transformed to token-efficient markdown. When the response has `isDraft: true` the message is an unsent draft — it has NOT been sent, and `receivedAt` is provider-supplied metadata, not evidence of delivery; never describe it as a sent, delivered, or received email. Set format to 'html' to get the raw body HTML instead of markdown — use this when you need to preserve inline styling (colour, background-colour, underline, strikethrough) that the markdown conversion discards, e.g. to change one sentence of a formatted body and leave the rest alone. Raw HTML costs far more tokens than markdown, so leave the default alone unless you need the styling; check `bodyFormat` (`text` means the message had no HTML part, so do not send it as HTML) before writing a body back, and never write one back with `bodyTruncated: true` — you do not have the whole body. strip_quoted_history and strip_signatures are markdown-shaped text transforms and are NOT applied when format is 'html'; the HTML is returned verbatim. To write it back, call create_draft/update_draft with format: 'html' AND force_black: false — force_black defaults to true and wraps your HTML in a force-black div, so leaving it on nests another wrapper on every round trip. Set strip_quoted_history to true to drop the terminal "On … wrote:" / Outlook-header / `>`-prefix reply chain and replace it with a short marker. Set strip_signatures to true to remove detected signatures and legal disclaimers; it defaults to false here for MCP compatibility even though the core action defaults to true.search_emailsSearch emails using full-text query across one or all mailboxes. Use offset for pagination. Results include unsent drafts: a row with `isDraft: true` has NOT been sent — its `receivedAt` is provider-supplied metadata, not evidence of delivery. Never describe such a row as a sent, delivered, or received email.get_mailbox_statusGet mailbox connection status, unread count, and warningslist_mailboxesList every configured mailbox: its logical `name` (pass this as the `mailbox` argument to other tools), its `emailAddress`, provider, connection status, and which one is the default. Reports mailboxes that failed to authenticate too, so it stays useful for diagnosing a broken setup.get_threadRetrieve all messages in a conversation thread by message ID. A thread can end with an unsent draft reply: a message with `isDraft: true` has NOT been sent, so it is not a sent reply — though earlier sent replies from the same author may exist elsewhere in the thread. Never describe such a message as a sent, delivered, or received email.send_emailCompose and send a new email. Gated by send allowlist. Draft mode bypasses allowlist. If a send fails with SEND_STATUS_UNKNOWN, the message may already have been delivered; do not resend without checking Sent Items. An identical send repeated within the duplicate window is refused with a DUPLICATE_SEND_* code instead of delivering twice; pass allow_duplicate: true only when a human has decided to send the same message again.reply_to_emailReply to an email within an existing thread. Default reply_all=true cc's the original thread; pass reply_all=false to reply only to the sender. Send path validates all effective recipients against the send allowlist; draft path bypasses. If a send fails with SEND_STATUS_UNKNOWN, the message may already have been delivered; do not resend without checking Sent Items. An identical reply repeated within the duplicate window is refused with a DUPLICATE_SEND_* code instead of delivering twice; pass allow_duplicate: true only when a human has decided to send the same reply again.create_draftCreate an email draft with to/cc/bcc recipients. Supports body_file with YAML frontmatter (to, cc, bcc, subject, reply_to, format). Use reply_to for threaded reply drafts, where to and subject are derived from the parent message and may be omitted; pass reply_all=false with reply_to to draft a sender-only reply.send_draftSend a previously created draft. Enforces send allowlist before sending. Rate-limited. If a send fails with SEND_STATUS_UNKNOWN, the message may already have been delivered; do not resend without checking Sent Items. Sending the same draft id twice within the duplicate window is refused with a DUPLICATE_SEND_* code instead of delivering twice; pass allow_duplicate: true only when a human has decided to send it again.update_draftUpdate a draft email. Body edits are refused for reply drafts; non-reply body edits require replace_body=true and replace the body wholesale. Subject, recipients (to/cc/bcc), and attachments remain editable. Allowlist is enforced at send_draft time, not here.cancel_scheduled_sendCancel a pending provider-held scheduled send. Only verified scheduled drafts can be cancelled.list_foldersList all mail accounts and their folders/mailboxes. Returns a tree of account → [mailbox names]. Use this to discover exact mailbox names before calling list_emails or search_emails.list_emailsList emails in a specific mailbox with pagination. Returns message summaries including a message_ref that can be passed to get_email, reply_email, move_email, etc. Messages are returned newest-first (index 1 = most recent).get_emailRead the full content of a specific email including headers and body. The message_ref comes from list_emails or search_emails results.search_emailsSearch for emails matching criteria across one or all mailboxes. Returns message summaries with message_ref fields for use with other tools. At least one filter (from_filter, subject_filter, after_date, before_date) should be provided.compose_emailCompose a new email. If send is false (default), opens the compose window with a draft. If send is true, sends immediately without confirmation.reply_emailReply to an existing email. If send is false (default), opens the reply in a compose window. If send is true, sends immediately without confirmation.move_emailMove an email to a different mailbox. Use list_folders to see available mailbox names.archive_emailMove an email to the Archive mailbox of its account. Uses 'Archive' for iCloud, 'All Mail' for Gmail.flag_emailSet or clear the flag on an email.mark_readMark an email as read or unread.move_to_junkMove an email to the Junk/Spam mailbox of its account. Uses 'Junk' for iCloud, 'Spam' for Gmail.delete_emailMove an email to the Trash (Deleted Messages for iCloud, Trash for Gmail).Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"agent-email": {
"command": "npx",
"args": [
"-y",
"email-agent-mcp"
]
}
}
}
{
"mcpServers": {
"apple-mail-mcp": {
"command": "npx",
"args": [
"-y",
"@jdot6/apple-mail-mcp"
]
}
}
}