Proton Mail MCP logo

Proton Mail MCP

Unclaimed

by sethbang

Unofficial MCP server for Proton Mail (not affiliated with Proton AG) — send, read, search & organize email over SMTP/IMAP

Set up this server

01 / Choose your client

02 / Before you connect

Authentication is not specified. Check the project instructions before connecting.

Install the runtime required by the project and make it available to your client.

Project instructions

Use names from the project instructions, separated by commas. Enter names only, never secret values.

03 / Add the configuration

Source: generated from public install instructions

claude mcp add --transport stdio 'proton-mail-mcp' -- 'npx' '-y' 'proton-mail-mcp'

Run in your terminal after replacing any placeholders.

04 / Check it in your client

Open your client’s MCP settings and confirm the server connects and lists its tools. A copied configuration does not confirm a working connection.

emailemail-mcpemail-mcp-serverimapmcpmcp-servermodel-context-protocolnodemailerprotonproton-mail

More in Search & Web

Browse the full directory

Unclaimed listing

Is this your MCP server?

This listing was auto-indexed from the public record. Claim it to edit the page, set compatibility and unlock growth tools. Takes under two minutes.

Claim this server

Security profile

Claimed and verified servers get a weekly static scan that shows what the code can reach: external services, environment variables, shell commands, agent configuration folders, plus any dependencies with known advisories. Claim this listing to get one. How the security profile works

32 of 32 tools

Documented tools (32)

From project documentation. A server handshake does not verify each tool’s description or behavior.

bulk_delete

Delete many messages in a single IMAP operation. Same XOR uids/match input and dryRun support as bulkmove. Defaults to soft-delete via the resolved Trash path. A subject/body match appends a staleness warning — Proton's content SEARCH lags ~30–60s, so recent mail can be silently missed; prefer from:

bulk_move

Move many messages in a single IMAP operation. Accepts either an explicit uids array or match criteria (XOR, not both). Supports dryRun: true to preview which UIDs would be affected without making changes — match-based dry-runs run the SEARCH results through a FETCH-based existence pass so the previ

bulk_update_flags

Add or remove flags on many messages in a single IMAP operation. Same XOR uids/match input and dryRun support. Reports notApplied: string[] for flags the server silently dropped across every affected UID (e.g. Proton's user-keyword drop).

bulk_update_labels

Add or remove Proton labels on many messages in a single IMAP operation. Same XOR uids/match input and dryRun support as the other bulk tools. Adds are batched (one COPY of the joined UID range per label); removes walk each label mailbox by Message-ID. Reports notApplied: string[] for labels with no

count_messages

Return a count of messages matching optional criteria, backed by IMAP SEARCH. No envelope fetch — just a number.

create_folder

Create a new mailbox folder. Idempotent — succeeds silently if the folder already exists. Restricted to the Folders/ namespace (e.g. Folders/Receipts); root-level paths are rejected with an actionable error. Labels/... paths are rejected with a redirect to the dedicated createlabel tool. . and .. pa

create_label

Create a new Proton label. Pass the bare label name; the Labels/ prefix is added internally. Idempotent. The response returns the full Labels/X path — copy that into updatemessagelabels.labelsToAdd (which requires the full path, not the bare name).

delete_folder

Delete a folder or label container. Restricted to the Folders/ and Labels/ namespaces so system mailboxes (INBOX, Sent, Trash, etc.) cannot be removed.

delete_message

Delete a message. By default moves to Trash for safety (resolved via special-use annotation); set permanent=true to permanently expunge. Returns the new UID in Trash when available. Soft-deleting a message that is already in Trash is a no-op on the server; the tool detects this and returns an action

delete_thread

Delete all messages in a thread. Per-folder by default; set acrossFolders: true for cross-folder walk.

download_attachment

Download an attachment by MIME part number. Use listattachments or readmessage first to see available parts. By default returns base64-encoded content inline. Bad part numbers produce an actionable error listing known parts.

empty_folder

Permanently empty a folder via atomic UID EXPUNGE (client.messageDelete). Requires confirm: true. By default restricted to Trash and Junk to prevent accidents; set allowAnyFolder: true to target any folder. Pass dryRun: true to preview the count that would be deleted without touching any mail (no co

flag_thread

Add or remove flags on all messages in a thread. Per-folder by default; set acrossFolders: true for cross-folder walk.

folder_stats

Return total/unread counts plus scanned-envelope aggregations: oldest message date, newest message date, and total message bytes. Response includes scanned and truncated fields for transparency.

forward_email

Forward a message to new recipients. Original attachments are carried forward by default. Unlike reply, a forward does not set In-Reply-To/References — it starts its own conversation and leaves the original message's \Answered flag untouched.

get_thread

Get all messages in a conversation thread by walking In-Reply-To and References headers. Returns messages sorted chronologically (oldest first).

list_attachments

List attachment metadata (part numbers, filenames, types, sizes) for a message without downloading the body. Composes with downloadattachment for bulk extraction. The reported size is the decoded file size (roughly what you get on save), estimated from the IMAP-encoded octet count — base64 parts are

list_folders

List all mailbox folders with message and unread counts. No parameters. Counts come from a cached IMAP STATUS that Proton Bridge can serve stale — for an exact count (e.g. before deleting or emptying a folder), use countmessages or folderstats, which query the live mailbox. The output includes a foo

list_messages

List recent messages from a folder. Supports UID-based pagination.

mark_all_read

Mark 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_message

Move a message to a different folder. Returns the new UID in the destination folder when available (requires UIDPLUS server support).

move_thread

Move all messages in a thread to a destination folder. Identified by Message-ID. Per-folder by default; set acrossFolders: true to walk INBOX + Sent + All Mail. When the walk surfaces a thread member only via All Mail (e.g. the message actually lives in Folders/Archive), the server expands the searc

read_message

Read a specific message by UID. Returns full headers, body, and attachment metadata. Prefers plain text; strips HTML tags from HTML-only messages. Body-part selection skips parts marked Content-Disposition: attachment, so a text/plain attachment sitting next to an HTML body is never returned as the

rename_folder

Rename an existing folder or label. Restricted to the Folders/ and Labels/ namespaces on both from and to so system mailboxes (INBOX, Sent, Trash, etc.) can't be renamed — without this guard, renamefolder(from: "INBOX", to: ...) would succeed against Proton Mail Bridge and relocate INBOX's contents.

reply_all_email

Reply to all original recipients (sender + TO + CC), excluding the authenticated user. Same threading + quoting semantics as replyemail. Use this instead of replyemail + replyAll: true for clarity. Self-exclusion covers the whole recipient set including the primary To: replying-all to a message you

reply_email

Reply to a message with proper threading headers (In-Reply-To, References). Includes the quoted original message with attribution by default.

save_draft

Save 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). Returns the draft UID when available.

search_messages

Search messages by various criteria. Date filters use IMAP semantics: since is inclusive, before is exclusive.

send_email

Send an email using Proton Mail SMTP.

top_senders

Return a sender frequency table over a configurable date range, sorted by message count descending. Collapses display-name variants of the same address. Each row carries a direction: "self""received" tag so callers scanning All Mail (which spans Sent) can tell outbound from inbound.

update_message_flags

Add or remove flags on a message. RFC 3501 system flags: \Seen (read), \Flagged (starred), \Answered, \Draft, \Deleted, \Recent. User-defined keywords without a backslash prefix are also accepted (alphanumeric + underscore, e.g. Important, CustomTag). Unknown \-prefixed names are rejected.

update_message_labels

Add 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.

Tool change history

Compared across complete checks of the same configuration. Tools were listed, not invoked. Input-schema changes are not measured here.

No complete tool checks yet.

FAQ

Questions about Proton Mail MCP Server

How do I connect Proton Mail MCP Server to Claude?
Run `claude mcp add proton-mail-mcp -- npx -y proton-mail-mcp` in Claude Code, or add the same command and arguments under mcpServers in Cursor's mcp.json or Claude Desktop's claude_desktop_config.json, then restart the client. The blocks above are ready to paste.
Is Proton Mail MCP Server free?
The listed licence is MIT. Check the upstream terms for permitted use and commercial requirements; a public repository does not by itself mean the software is free or open source. Connected APIs and hosted services may have separate charges.
What can Proton Mail MCP Server do?
Proton Mail MCP Server documents 32 tools to the agent, including bulk_delete, bulk_move, bulk_update_flags. The descriptions above come from project documentation. A live handshake does not test individual tool behavior.