protonmail-rs
✉️ Unofficial, pure-Rust Proton Mail client — library, CLI, and MCP server with end-to-end OpenPGP encryption.
Install / Use
claude mcp add filippofinke -- npx -y github:filippofinke/protonmail-rsIf the server publishes to npm under a different name, use that package instead — check the repo README.
MCP Server
Model Context Protocol server
Quality Score
Category
CommunicationSupported Platforms
Our assessment of protonmail-rs
protonmail-rs scores 80/100 on our quality scale, 375th of 410 Communication skills we index.
Its MCP Server is 13 KB long, well organised into 21 sections with 5 code examples: a thorough specification that gives an agent plenty to work with.
It has 3 GitHub stars, so there is little community track record yet; judge it on its content.
Maintenance, license and trust
- The repository was last updated 27 days ago, so protonmail-rs is actively maintained.
- Our last check on 2026-09-12 found the source still online.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 92/100, with 1 caution from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful.
AI review by kimi-k2.7-code on 2026-10-09. Automated pattern scan on 2026-10-09. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
protonmail-rs compared with similar skills
All 4 of these similar skills score higher than protonmail-rs; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| protonmail-rs (this skill)by filippofinke | 80 | 3 | 27d ago | MCP Server |
| Agent-Reachby Panniantong | 100 | 105.0k | 3d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 78.1k | today | CLAUDE.md |
| CowAgentby zhayujie | 100 | 47.6k | today | CLAUDE.md |
| Scraplingby D4Vinci | 100 | 90.1k | today | MCP Server |
Frequently asked questions
- How do I install protonmail-rs?
- Run
claude mcp add filippofinke -- npx -y github:filippofinke/protonmail-rs. The install tabs above show the steps for each supported agent. - Which AI agents does protonmail-rs work with?
- It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
- Is protonmail-rs safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. An AI review of the same text found nothing harmful. It is MIT-licensed and scores 92/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is protonmail-rs still maintained?
- The repository was last updated 27 days ago, so protonmail-rs is actively maintained.
Skill content
View source on GitHubAn unofficial, pure-Rust Proton Mail client — library, CLI, and MCP server.
An unofficial, pure-Rust Proton Mail client: a library (proton-core), a
command-line tool (protonmail-cli), and an MCP server (proton-mcp). End-to-end
OpenPGP encryption and SRP authentication are byte-compatible with the official
Proton clients, built on Proton's own Rust crates
(proton-crypto, proton-srp).
Unofficial, not affiliated with Proton AG. Use at your own risk.
Validated against a live account: SRP login (incl. CAPTCHA), session resume, key unlock, send (E2E), list, read + decrypt + signature verify all work.
Workspace
| Crate (crates.io) | Binary | Role |
|---|---|---|
| proton-core | — | The SDK — transport, auth, crypto, models, API, mail services |
| protonmail-cli | protonmail-cli | Command-line front-end (clap) |
| proton-mcp | proton-mcp | MCP server exposing mail tools to LLM agents (rmcp) |
Requires Rust ≥ 1.96.
# Install from crates.io:
cargo install protonmail-cli # -> protonmail-cli binary
cargo install proton-mcp # -> proton-mcp
# Or build from source:
cargo build --release # -> target/release/{protonmail-cli, proton-mcp}
Feature list — proton-core (the SDK)
Authentication
- SRP login (SRP-6a) via
proton-srp— server-signed modulus verified, client/server proof exchange, hash versions V0–V4. - Two-factor (TOTP).
- Two-password accounts — reads
PasswordMode; separate mailbox password supported. - Human verification / CAPTCHA — pluggable resolver on API code 9001 (retries with
x-pm-human-verification-token). - Session persistence — per-profile, multi-profile; non-secret metadata on disk (0600), secrets (tokens + key passphrase) in the OS keychain (
keyring). - Session resume — re-open + unlock keys from a saved session without re-entering the password.
- Token refresh — automatic on 401 (rotating tokens persisted), single retry.
- Logout — server-side session revoke + local clear.
- Client masquerade — configurable
x-pm-appversion+User-Agent(web/iOS/Android presets).
Cryptography (pure Rust, no cgo)
- Key hierarchy unlock — user keys (bcrypt mailbox-password KDF → key passphrase) and address keys (per-key token decrypted + signature verified against user keys; bad tokens skipped).
- Mailbox-password KDF — bcrypt, last-31-byte convention, salt matched to the primary user key.
- Message body decryption with signature verdict (
Verified/Unsigned/Unverified/Invalid); non-fatal signature failures. - MIME extraction —
multipart/*bodies parsed (mail-parser) to the displayable text/html part. - Attachment decryption — key packet → session key → data packet.
- Outbound encryption — fresh AES-256 session key, encrypt+sign body; per-recipient session-key wrapping; self-encrypted stored draft.
- Attachment encryption — session key + data packet + detached signature; re-keying for forwards.
Transport
reqwest(rustls TLS, cookie store); base URL + app-version configurable.- Proton envelope handling (
Code1000/1001 = success). - Auto-retry: 401 → refresh, 429 → Retry-After backoff, 9001 → human verification.
- Typed errors with CLI exit-code mapping.
Mail features
- Read: list messages, list conversations (threads), read message (decrypt + verdict), read full thread (lazy-loads + decrypts each), counts.
- Search (server-side): keyword, from, to, subject, date range, folder, unread.
- Send: compose, reply / reply-all / forward (forward re-keys original attachments), scheduled send, expiring/self-destruct, cancel scheduled send. Internal = full E2E (Type 1); external with a PGP/WKD key = PGP-inline (Type 8); keyless external = cleartext (Type 4, warned).
- Attachments: list, download (decrypt) single/all, upload (encrypt) on send.
- Organize: move to folder, trash, permanent delete, mark read/unread, star/unstar, apply/remove label — for messages and conversations.
- Labels / folders: list, create, delete.
- Drafts: save / edit / list / delete (without sending).
- Sieve filters: list / create (raw Sieve) / validate / delete / enable / disable.
- Contacts (read): list contacts + contact emails; addresses listing.
- Local cache + sync: SQLite cache fed by the Proton event stream (
sync); offline cached reads (list --cached). - Encrypted full-text search: build a local FTS5 index over decrypted bodies (
index) and search them privately/offline (search) — the server never sees the query.
Observability
- Verbose logging (
tracing) —init_tracing(verbose); logs every login stage, key-unlock step, encrypt/decrypt op, send-pipeline stage, and HTTP request/response. Secrets and plaintext are never logged.
protonmail-cli — commands
Every command and flag is documented in docs/CLI.md (generated
from --help). Cheat-sheet of the full surface:
protonmail-cli [GLOBALS] <command>
GLOBALS: --profile --json -v/-vv/-vvv --api-url --app-version --client web|ios|android
--user-agent --totp --mailbox-password --captcha-token --captcha-chrome
ENV: PROTON_USER PROTON_PASSWORD PROTON_TOTP PROTON_MAILBOX_PASSWORD PROTON_HV_TOKEN RUST_LOG
COMPOSE (send/reply/forward/drafts save|edit): --to --cc --bcc --from --subject
--body <text|-> --html --attach <file> --send-at <ts> --expires <secs>
--eo-password --eo-hint # send only: encrypted-outside for keyless recipients
login | logout | whoami
messages list [--folder inbox] [--page --page-size --unread --cached] | search [filters] |
read <REF> [--format text|html|raw] [--body-only] [--output <file>] |
send <COMPOSE> | reply <REF> [--all] | forward <REF> --to | cancel-send <REF> |
spam <REF…> | ham <REF…> | unsubscribe <REF> | empty <folder> | undelete <ID…> |
receipt <REF> | label <add|rm> <LABEL_ID> <REF…> |
move <REF…> --dest | trash <REF…> | delete <REF…> |
mark <read|unread> <REF…> | star <REF…> | unstar <REF…>
conversations list | search | read <ID> | move <ID…> --dest | trash <ID…> |
mark <read|unread> <ID…> | star | unstar |
snooze <ID…> (--until <ts> | --in 30m|2h|1d) | unsnooze <ID…>
attachments list <MSG> [--include-inline] | download <MSG> [<ATT>] [--output-dir|--all|--include-inline]
drafts list | save <COMPOSE> | edit <ID> <COMPOSE> | delete <ID…>
filters list | create --name --sieve <-|text> | check --sieve | delete|enable|disable <ID>
labels list [--folders] | create --name [--color --folder --parent] | delete <ID…> |
update <ID> [--name --color --parent]
contacts list | emails [--email]
addresses list | update <ID> [--display-name --signature]
settings get | sign <on|off> | attach-public-key <on|off>
counts [--conversations]
export --out <dir> [--folder all] [--max 100] # write messages to .eml files
watch [--interval 30] [--folder <f>] # continuous cache sync until ^C
sync [--backfill <folder>] # one-shot event-stream sync
index [--folder all] [--max-pages --page-size] # build local encrypted FTS index
search <query> [--limit 25] # query the local FTS index (offline)
<REF> = exact message ID or free text (unique search match); <ID> = exact id. --json on any
command for machine output. CAPTCHA: login auto-opens it; solve via console snippet / bookmarklet,
or pass --captcha-token, or --captcha-chrome (isolated, auto-closing window).
proton-mcp — MCP server (for LLM agents)
Reuses a protonmail-cli login session (the agent never sees the password). Transports: stdio (default) and Streamable HTTP (--http <addr>). Verbose via -v. Source is one file per tool under src/tools/.
56 tools — full parity with the CLI (auth/watch/export aside):
- Messages — read:
list_messages,search_messages,read_message,list_attachments,download_attachment,list_labels,counts. - Messages — write:
send_message,reply_message,forward_message,cancel_scheduled_send,move_message,trash_message,delete_messages,undelete_messages,empty_folder,report_spam,report_ham,unsubscribe,send_read_receipt,mark_read,star_message,apply_label,remove_label. - Conversations:
list_conversations,read_conversation,search_conversations,move_conversation,trash_conversation,mark_conversation,star_conversation,snooze_conversation,unsnooze_conversation. - Drafts:
list_drafts,save_draft,update_draft,delete_draft. - Filters (Sieve):
list_filters,create_filter,check_filter,delete_filter,enable_filter,disable_filter. - Labels/folders:
create_label,delete_label,update_label. - Settings / addresses / contacts:
get_settings,set_sign,set_attach_public_key,list_addresses,update_address,list_contacts,list_contact_emails. - Local cache / search:
sync_cache,index_cache,search_local.
Safety: destructive/structural tools (send, move, trash, delete, empty_folder, drafts, filters, labels, settings, …) take confirm and return a dry-run preview unless confirm: true (or the server is started with --allow-writes); empty_folder/delete_messages previews carry an explicit irreversibility warning. Benign toggles (mark_*, star_*, snooze_*) and all reads execute directly. Sending defaults to your primary address (first alias by Order) — pass from to pick another alias. Reads return the signature verdict; CAPTCHA is never auto-solved (returns "run protonmail-cli login").
Claude Desktop config:
{ "mcpServers": { "proton-mail": {
"command": "/abs/path/protonmail-rs/target/release/proton-mcp",
"args": ["--profile","default"] } } }
Verbose / debugging
protonmail-cli -vv whoami # login/resume + key unlock, step by step
protonmail-cli -vv messages read <ID> # + decryption + signature verdict
protonmail-cli -vv messages send … # + full send pipeline
RUST_LOG=proton_core::http=debug … # just HTTP
proton-mcp -vv --profile default # MCP verbose (to stderr)
Testing
cargo test --workspace # offline: crypto round-trips, transport, HV, api, cli, mcp
# live (real account; opt-in):
PROTON_TEST_USER=… PROTON_TEST_PASSWORD=… [PROTON_TEST_TOTP=…] [PROTON_TEST_SEND=1] \
cargo test -p proton-core --test live -- --nocapture --test-threads=1
Security
- Mailbox password never written to disk in cleartext; key passphrase + tokens in the OS keychain.
- Address-key token signatures verified on unlock; SRP server proof + signed modulus verified on login.
- TLS via rustls. Verbose logs exclude all secrets and plaintext.
Scope / deferred
Implemented: full mail (read/threads, search, send/reply/forward incl. PGP-external and encrypted-outside, attachments, organize), drafts, Sieve filters, mail settings (read) + spam/ham/unsubscribe/empty-folder/snooze, contacts (read) + addresses, event-sync + SQLite cache, local encrypted full-text search, HTML sanitization of message bodies, CLI, MCP, CAPTCHA, verbose logging.
Not implemented (deliberately, to avoid shipping untested code):
- Key Transparency (epoch / VRF / certificate-transparen
Truncated for display — read the full file on GitHub.
Related Skills
Agent-Reach
105.0kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
78.1kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
CowAgent
47.6kOpen-source personal AI assistant & Agent Harness. Plans tasks, runs tools and skills, self-evolves with memory and knowledge. Multi-agent, multi-model, multi-channel. Lightweight, extensible, one-line install.
Scrapling
90.1k🕷️ The BEST Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
