Proton Mail (unofficial) MCP server
Unofficial Proton Mail MCP — send, read, search & organize email over SMTP and IMAP
6 stars113 downloads/wk
Reviews
Write oneNobody has reviewed Proton Mail (unofficial) yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Proton Mail (unofficial) tools (32, 14 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
bulk_deletewrite actionDelete multiple messages in one operation. Provide EITHER `uids` OR `match`. By default soft-deletes to Trash; pass `permanent: true` to expunge. `permanent: true` ALSO requires `confirm: true` (the expunge is irreversible — there is no Trash to recover from). `dryRun: true` previews without deleting and needs no confirmation.
bulk_moveMove multiple messages to a different folder in one operation. Provide EITHER `uids` (an explicit list) OR `match` (search criteria — same shape as search_messages), not both. Set `dryRun: true` to preview what would be moved without making changes. Note: moved messages get new UIDs in the destination folder.
bulk_update_flagswrite actionAdd or remove flags on multiple messages in one operation. Provide EITHER `uids` OR `match`, plus at least one of `flagsToAdd` / `flagsToRemove`. Same flag whitelist as update_message_flags.
bulk_update_labelswrite actionAdd or remove Proton labels on many messages in one operation. Provide EITHER `uids` OR `match` (XOR), plus at least one of `labelsToAdd` / `labelsToRemove`. Same label-path rules as `update_message_labels` (must start with "Labels/"). Supports `dryRun: true` for safe preview.
count_messagesCount messages in a folder matching optional search criteria. Returns just a number (no envelopes fetched). The attachment filters (`hasAttachment`, `attachmentName`, `attachmentType`) are rejected here — they require an envelope scan that defeats the count's speed promise. Use search_messages for attachment-based filtering. A non-selectable namespace container (e.g. `Folders`/`Labels`) is rejecte
create_folderwrite actionCreate a new mailbox folder. Returns gracefully if the folder already exists. On Proton Mail, folders must be created under the "Folders/" namespace (e.g. "Folders/Receipts") — root-level paths are rejected by the server with an actionable error.
create_labelwrite actionCreate a new Proton label. Pass the bare label name (e.g. "Important") — the tool prepends the "Labels/" namespace internally. Labels are non-exclusive tags: a message can carry many labels in addition to living in one folder. Apply or remove labels on messages with `update_message_labels`. Idempotent — succeeds silently if the label already exists.
delete_folderwrite actiondelete_messagewrite actionDelete an email message. By default moves to Trash for safety; set permanent=true to permanently expunge. Note: moving to Trash assigns a new UID in the Trash folder — the original UID is no longer valid. **UID + folder pair caveat**: IMAP UIDs are per-folder. Always pair a UID with the folder it came from; the same integer can refer to different messages in INBOX, Sent, Trash, and All Mail.
delete_threadwrite actionDelete every message in a thread. Default soft-deletes to Trash; permanent:true expunges. acrossFolders:false by default for safety. dryRun:true previews.
download_attachmentDownload an email attachment by part number. Use read_message or list_attachments first to see available attachments and their part numbers. By default returns base64-encoded content inline (read-only). When `saveTo` is provided AND the ALLOW_FILE_DOWNLOAD_DIR env var is set, this tool WRITES the decoded bytes to that path inside the allowlist root and returns the file path + size instead of base6
empty_folderPermanently delete ALL messages in a folder (atomic UID EXPUNGE via messageDelete). Requires `confirm: true` (skipped for `dryRun`). By default restricted to Trash/Junk; pass `allowAnyFolder: true` to empty other folders. THIS IS NOT REVERSIBLE. Pass `dryRun: true` to preview the count that would be deleted without touching any mail. Disabled unless ALLOW_EMPTY_FOLDER=true is set in the environmen
flag_threadAdd or remove flags on every message in a thread, identified by Message-ID. Use this instead of update_message_flags when you want the change applied to a whole conversation, or bulk_update_flags when you have a flat set of UIDs rather than a thread. At least one of flagsToAdd/flagsToRemove must be non-empty. acrossFolders:false by default. dryRun:true previews.
folder_statsReturn aggregate stats for a folder: total/unread (free), plus scanned-envelope aggregations (oldest/newest/total bytes). Default scanLimit 5000, max 20000. Response always includes scanned/truncated so callers can detect partial results. A non-selectable namespace container (e.g. `Folders`/`Labels`) is rejected with an actionable error rather than reporting empty stats.
forward_emailwrite actionget_threadGet all messages in a conversation thread by walking In-Reply-To and References headers. Returns messages sorted chronologically (oldest first).
list_attachmentsList attachment metadata for a message without downloading the body. Returns part numbers, filenames, content types, and sizes — use these with download_attachment to fetch the content.
list_foldersList available email folders/mailboxes with message counts. The per-folder counts come from a cached IMAP STATUS that Proton Mail Bridge can serve stale — do NOT treat them as authoritative for decisions like "is this folder empty before deleting". Use `count_messages` or `folder_stats` (both SELECT+SEARCH the live mailbox) when you need an exact count.
list_messagesList recent messages from an email folder, sorted by date (newest first). Returns subject, sender, date, and flags for each message. A non-selectable namespace container (e.g. `Folders`/`Labels`) is rejected with an actionable error rather than returning an empty list. **Pagination note:** the default date sort is paginated by a UID cursor (`beforeUid`). In folders where UID order disagrees with d
mark_all_readMark all unread messages in a folder as read. Optionally limit to messages older than a given date. Pass `dryRun: true` to preview the affected count without flipping any flags.
move_messageMove an email message to a different folder. Note: the message gets a new UID in the destination folder — the original UID is no longer valid after the move. **UID + folder pair caveat**: IMAP UIDs are per-folder, so UID 42 in INBOX and UID 42 in Sent identify different messages. Always carry the folder a UID came from; never reuse a UID across folders. For thread-level operations on messages you
move_threadMove every message in a thread to a destination folder. By default acts only in the seed message's folder; pass acrossFolders:true to walk INBOX/Sent/All Mail. dryRun:true previews the affected per-folder UIDs without moving.
read_messagerename_folderRename a mailbox folder or label. Errors if the source path does not exist. Works for both "Folders/" and "Labels/" paths.
reply_all_emailwrite actionReply to all recipients of an email (sender + original TO + original CC), excluding the authenticated user. Sends with proper threading headers. Equivalent to `reply_email` with `replyAll: true`, exposed as a dedicated tool for discoverability. Response leads with `[sent-copy:verified|unverified]`; like `reply_email`, the `[reply-to:*]` tokens do not apply because there's no `replyTo` parameter to
reply_emailwrite actionReply to an email message. Reads the original message and sends a reply with proper threading headers (In-Reply-To, References). Response leads with a `[sent-copy:verified|unverified]` token; the `[reply-to:*]` family of tokens does NOT apply here because this tool doesn't accept a `replyTo` parameter — there's no requested Reply-To to verify against. If you need Reply-To control or rewriting dete
save_draftSave an email as a draft without sending it. The draft is placed in the user's `\Drafts` special-use folder (resolved at runtime; falls back to literal `Drafts` if no annotation). The destination is intentionally not caller-controlled — prior versions accepted an arbitrary `folder` parameter that allowed planting `\Draft`-flagged messages in INBOX or other paths, which was confusing to anyone scan
search_messagesSearch for messages in a folder by various criteria (sender, subject, date, flags). Returns matching message summaries sorted by date (newest first). Note: recently sent or received messages may take a few seconds to become searchable by subject or body due to server-side indexing delays; searching by 'from' is typically immediate. A non-selectable namespace container (e.g. `Folders`/`Labels`) is
send_emailwrite actionSend an email using Proton Mail SMTP. HTML bodies are sanitized through a conservative allowlist by default (v1.0.0: `sanitizeHtml` defaults to true) — scripts, event handlers, inline styles, and remote `<img>` beacons are stripped. Pass `sanitizeHtml: false` to send full-fidelity HTML in trusted-content workflows. Plain-text bodies pass through unchanged.
top_sendersReturn a frequency table of top senders for a folder, optionally filtered by date range. Buckets are keyed by lowercased email address. Default limit 20, scanLimit 5000 (max 20000). Each row carries a `direction` of "self" or "received" so callers can distinguish messages from the authenticated user (typical when scanning "All Mail", which spans Sent). **v1.0.0 default change**: `excludeSelf` now
update_message_flagswrite actionAdd or remove flags on an email message. System flags (RFC 3501): \\Seen (read), \\Flagged (starred), \\Answered, \\Draft, \\Deleted, \\Recent. User-defined keywords without a backslash prefix are also accepted (alphanumeric + underscore, e.g. "Important", "Custom_Tag"), but Proton Mail Bridge has been observed to silently drop user keywords — any flags the server did not actually apply are report
update_message_labelswrite actionAdd or remove Proton labels on a message. Labels live under the "Labels/" namespace and are additive — the message stays in its source folder while gaining or losing label tags. Pass full paths in `labelsToAdd` / `labelsToRemove` (e.g. ["Labels/Important", "Labels/Work"]). Adds are strict: copying to a missing label throws "Label not found" (create it first with `create_label`). Removes are idempo
Public scan report
scanner v0.1.9 · 2026-09-27 · same rubric, same numbers if you re-run it
- Code scan6 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 3 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
What the publisher says
From the Proton Mail (unofficial) repository's README, as published. We do not edit it. Read it on GitHub
Proton Mail MCP Server
A Model Context Protocol (MCP) server that gives AI assistants full access to your Proton Mail account -- send, read, search, and organize email over SMTP and IMAP.
⚠️ Unofficial — not affiliated with Proton. This is an independent, community-built project. It is not developed, endorsed, sponsored, or supported by Proton AG. "Proton", "Proton Mail", and "Proton Mail Bridge" are trademarks of Proton AG, used here only to describe interoperability. It talks to Proton Mail over the standard SMTP submission endpoint and the locally-run Proton Mail Bridge; no Proton private API is used. Use at your own risk.
Demo
Features
- Send, reply, and forward email via Proton Mail SMTP with threading headers; dedicated replyallemail tool
- Markdown bodies -- pass markdownBody to sendemail / replyemail / replyallemail / forward_email; rendered to HTML with a plain-text fallback
- Read email via IMAP through Proton Mail Bridge
- Attachments -- send files (base64), download to memory or to disk (saveTo + ALLOWFILEDOWNLOAD_DIR), forward a subset by part number
- Search messages by sender, recipient, subject, body, date, flags, size, List-ID, attachment presence, attachment name (substring), and attachment MIME type
- Organize -- move, delete, and flag/unflag messages individually or in bulk; bulk-update labels too
- Bulk operations -- bulkmove, bulkdelete, bulkupdateflags, bulkupdatelabels with dryRun preview and XOR uid/match input
- Folder & label management -- createfolder, createlabel, renamefolder, deletefolder (non-destructive on Proton); emptyfolder (opt-in via ALLOWEMPTY_FOLDER=true; not recommended)
- Labeling -- updatemessagelabels adds and removes Proton labels on a message (additive — message stays in its source folder)
- Aggregations -- countmessages, folderstats, top_senders (with excludeSelf + per-row direction) for inbox analytics
- Thread mutations -- movethread, deletethread, flagthread with optional cross-folder walk; getthread dedupes by Message-ID across mailbox copies
- Snippets -- optional includeSnippet on listmessages and searchmessages for at-a-glance previews
Prerequisites
- Node.js v24+
- A Proton Mail account with an SMTP password (how to get one)
- Proton Mail Bridge running locally (required for IMAP/read tools)
Quick Start
Add to your MCP client
Add the following to your client's MCP server configuration (Claude Desktop, Claude Code, Cursor, etc.):
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y proton-mail-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add proton-mail-mcp -- npx -y proton-mail-mcp
Proton Mail (unofficial): common questions
- Is Proton Mail (unofficial) MCP server safe?
- Mostly: it is graded B (83/100). Read the Proton Mail (unofficial) safety report
- How do I install Proton Mail (unofficial)?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does Proton Mail (unofficial) need an API key?
- Yes. The registry entry asks for
PROTONMAIL_PASSWORD,IMAP_PASSWORD. - Is Proton Mail (unofficial) maintained?
- The last commit was 3 days ago (2026-09-24). The latest release is v1.0.2.
- What can I use instead of Proton Mail (unofficial)?
- Servers from other publishers that do the same job: Email MCP server, Imap MCP server and MCP Emails MCP server. Compare all Proton Mail (unofficial) alternatives.
Alternatives to Proton Mail (unofficial)
Same job from other publishers: the closest match first, then the best rated.
- EmailIMAP/SMTP email MCP server — 52 tools, stdio + HTTP, IMAP IDLE push, multi-account, AI triage.not reviewedEstablishedB
- ImapIMAP/SMTP MCP server to search, read, organize, send, reply & forward email for AI assistantsnot reviewedEstablishedA
- MCP EmailsNever-stored live email: read, send, organize, schedule and auto-triage Gmail or any IMAP mailbox.not reviewedGrowingA
FluxmailRead, search, draft, send, and organize email through Gmail, Outlook, and IMAP/SMTP mailboxes.not reviewedGrowingB- Agent EmailLocal email connectivity for AI agents — read, draft, send, and organize Outlook mail via MCPnot reviewedGrowingA