Mmcp.market

Proton Mail (unofficial) MCP server

by sethbang·io.github.sethbang/proton-mail-mcp·v1.0.2

Unofficial Proton Mail MCP — send, read, search & organize email over SMTP and IMAP

B83/100grade B
What users say
No reviews yet
Be the first
Safety scan
B83/100

full report

Adoption
Growing

6 stars113 downloads/wk

Reviews

Write one

Nobody 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 posts

Read from the package source without running it. The installed server may list more.

  • bulk_deletewrite action

    Delete 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_move

    Move 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 action

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

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

    Count 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 action

    Create 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 action

    Create 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 action
  • delete_messagewrite action

    Delete 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 action

    Delete every message in a thread. Default soft-deletes to Trash; permanent:true expunges. acrossFolders:false by default for safety. dryRun:true previews.

  • download_attachment

    Download 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_folder

    Permanently 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_thread

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

    Return 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 action
  • 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 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_folders

    List 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_messages

    List 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_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 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_thread

    Move 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_message
  • rename_folder

    Rename a mailbox folder or label. Errors if the source path does not exist. Works for both "Folders/" and "Labels/" paths.

  • reply_all_emailwrite action

    Reply 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 action

    Reply 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_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). 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_messages

    Search 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 action

    Send 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_senders

    Return 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 action

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

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

no findings
  • 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
Overall 83/100. Components that don't apply are left out of the denominator. Any critical finding is an F.RubricAppeal a findingJSON

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
Add to Cursor

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.

All Proton Mail (unofficial) alternatives →
  • Email
    IMAP/SMTP email MCP server — 52 tools, stdio + HTTP, IMAP IDLE push, multi-account, AI triage.
    B
  • Imap
    IMAP/SMTP MCP server to search, read, organize, send, reply & forward email for AI assistants
    A
  • MCP Emails
    Never-stored live email: read, send, organize, schedule and auto-triage Gmail or any IMAP mailbox.
    A
  • Fluxmail
    Read, search, draft, send, and organize email through Gmail, Outlook, and IMAP/SMTP mailboxes.
    B
  • Agent Email
    Local email connectivity for AI agents — read, draft, send, and organize Outlook mail via MCP
    A

More from sethbang →