A side-by-side look at the Agent Email and Email 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 Email 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.MCP_EMAIL_ADDRESS, MCP_EMAIL_PASSWORD, MCP_EMAIL_IMAP_HOST, MCP_EMAIL_SMTP_HOST, EMAIL_ACCOUNTS.list_accounts, list_mailboxes, list_emails.Rows where the two servers differ are marked.
| Spec | ||
|---|---|---|
| Category | Communication | Communication |
| Quality signal | 63/100 · Good | 69/100 · Great |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | Not declared | other |
| Pricing | Not declared | Free |
| Required env vars | None listed | MCP_EMAIL_ADDRESSMCP_EMAIL_PASSWORDMCP_EMAIL_IMAP_HOSTMCP_EMAIL_SMTP_HOSTEMAIL_ACCOUNTS |
| Verified owner | Community listing | Community listing |
| GitHub stars | 6 | 133 |
| Directory activity | 1 views 0 installs 0 upvotes | 5 views 0 installs 0 upvotes |
| Tools | 27 | 52 |
| Full listing | View Agent Email | View Email 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_accountsList all configured email accountslist_mailboxesList folders with unread counts and special-use flagslist_emailsPaginated email listing with date, sender, subject, and flag filters; marks bulk mail; optional body previewget_emailRead full email content with attachment metadata and bulk-mail classification (HTML converted to readable text by default)get_emailsFetch full content of multiple emails in a single call (max 20); same bulk markersget_email_statusGet read/flag/label state of an email without fetching the bodysearch_emailsSearch by keyword across subject, sender, and body; same bulk markers and optional preview as `list_emailsdownload_attachmentDownload an email attachment by filename or MIME part id, base64-encoded or (if configured) saved to the server's attachment download directoryfind_email_folderDiscover the real folder(s) an email resides in (resolves virtual folders)extract_contactsExtract unique contacts from recent email headersget_threadReconstruct a conversation thread via References/In-Reply-To; same bulk markerslist_templatesList available email templatesPaste 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": {
"codefuturist-email-mcp": {
"command": "npx",
"args": [
"-y",
"@codefuturist/email-mcp"
],
"env": {
"MCP_EMAIL_ADDRESS": "YOUR_MCP_EMAIL_ADDRESS_HERE",
"MCP_EMAIL_PASSWORD": "YOUR_MCP_EMAIL_PASSWORD_HERE",
"MCP_EMAIL_IMAP_HOST": "YOUR_MCP_EMAIL_IMAP_HOST_HERE",
"MCP_EMAIL_SMTP_HOST": "YOUR_MCP_EMAIL_SMTP_HOST_HERE",
"EMAIL_ACCOUNTS": "YOUR_EMAIL_ACCOUNTS_HERE"
}
}
}
}