# Proton Bridge MCP (mcpb · proton-bridge-mcp-1.2.2.mcpb)

Read, organise and carefully-gated send for Proton Mail, without your mail leaving this machine.

- Trust score: 43/100 (low)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-22

## Components

- mcpb · `proton-bridge-mcp-1.2.2.mcpb`: 43/100 (this document), [markdown](https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid.md), [page](https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid)

## Channel facts

- Registry: `mcpb`
- Package: `https://github.com/Considus/proton-bridge-mcp/releases/download/v1.2.2/proton-bridge-mcp-1.2.2.mcpb`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-22.

- **Supply Chain Security**: 13/100
  - Malware scan not yet available for this package.
  - Known CVEs could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
  - No install/post-install scripts declared.
  - Dependency health could not be checked: this artifact ships no SBOM, so there is no dependency list to read. Publishing one would let us assess it.
- **Provenance & Transparency**: 23/100
  - Repository check failed: the declared repository URL redirects; it must resolve directly.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (Apache-2.0).
  - Actively maintained (last published 10 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 77/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4116 tokens (~121/item across 34 items; 34 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 37/100
  - Stability observed for 11 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 89/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 66% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

- Download bundle: `https://github.com/Considus/proton-bridge-mcp/releases/download/v1.2.2/proton-bridge-mcp-1.2.2.mcpb`

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-21 (score 43, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-19 (score 42, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-18 (score 41, −2)

- [security regression] Source repository: pass → fail
- [functional improvement] Stability: unverified → 0.23

### 2026-08-11 (score 43)

First indexed and scored.

## MCP tools (34)

### `list_folders` (~35 tokens)

List folders and labels

List all Proton folders and labels available over the Bridge. Call this first to learn exact folder/label names for filing and tagging.

### `folder_status` (~54 tokens)

Folder status

Message counts plus UIDNEXT and UIDVALIDITY for a folder. UIDs are only valid within one UIDVALIDITY generation, so check this before acting on uids noted earlier.

Input parameters:

- `folder` (string): Default INBOX.

### `poll_folder` (~98 tokens)

Poll for new mail

Messages that have arrived since the last poll. The very first poll emits nothing and just records where the mailbox ends, so turning this on does not replay the backlog. Marks nothing as read.

Input parameters:

- `advance` (boolean): Default true. Set false to look without committing, then confirm with ack_folder.
- `folder` (string): Default INBOX.
- `limit` (integer): Most per call, 1 to 100 (default 20).

### `ack_folder` (~48 tokens)

Acknowledge poll checkpoint

Commit a checkpoint returned by poll_folder with advance=false. Repeating it is harmless.

Input parameters:

- `checkpoint` (string, required): Exactly as poll_folder reported it.
- `folder` (string): Default INBOX.

### `search_mail` (~252 tokens)

Search a folder

Search a folder. Combine any of: text, from, subject, since (DD-Mon-YYYY), unread_only, flagged_only. Returns uids + envelopes, newest first. Set include_locations to also report which labels and folders each message carries.

Input parameters:

- `before` (string): DD-Mon-YYYY. Combine with since for a date range.
- `flagged_only` (boolean)
- `folder` (string): Folder to search, e.g. INBOX, 'All Mail', 'Folders/<name>'. Default INBOX.
- `from` (string)
- `include_locations` (boolean): Report every other mailbox each message appears in, so you can tell what it is already labelled or filed as without a second search. Costs one search per mailbox.
- `limit` (integer): Max results (default 15).
- `since` (string): DD-Mon-YYYY, e.g. 01-Jul-2026
- `subject` (string)
- `text` (string)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.
- `unread_only` (boolean)

### `search_all_mail` (~122 tokens)

Search all mail

Search every mailbox at once and collapse duplicates by Message-ID, reporting where each message lives. Use when you do not know which folder something is in.

Input parameters:

- `before` (string): DD-Mon-YYYY. Combine with since for a date range.
- `flagged_only` (boolean)
- `from` (string)
- `limit` (integer): Most recent N (default 25).
- `since` (string): DD-Mon-YYYY.
- `subject` (string)
- `text` (string)
- `unread_only` (boolean)

### `get_headers` (~85 tokens)

Get message headers

Headers plus SPF/DKIM/DMARC verdicts and Proton metadata, for judging whether a message is what it claims to be. Pass raw=true for the unparsed header block.

Input parameters:

- `folder` (string): Default INBOX.
- `raw` (boolean): Return the full raw header block instead.
- `uid` (string, required)
- `uidvalidity` (string)

### `read_message` (~74 tokens)

Read a message

Read the full headers and body text of one message by uid within a folder.

Input parameters:

- `folder` (string): Default INBOX.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `list_attachments` (~119 tokens)

List attachments

List a message's attachments, separating real DOCUMENTS from inline cid: images and PGP keys (hidden by default). Call before claiming a message has no attachment — read_message shows body text only and never reveals files.

Input parameters:

- `folder` (string): Default INBOX.
- `include_inline` (boolean): Also list inline images / PGP keys.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `read_attachment` (~118 tokens)

Read an attachment

Extract an attachment's TEXT inline — PDFs via pypdf, plus text/csv/json/ics/eml. Use for invoices, decks, reports. Binary/image types must use save_attachment instead.

Input parameters:

- `filename` (string): Which attachment (partial match OK). Optional if there is only one.
- `folder` (string): Default INBOX.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `view_attachment` (~93 tokens)

View an image attachment

Look at an image attachment. Returns it as a viewable image, which is the only way to see a photo or a scan when the client cannot read local files. Images only, use read_attachment for text and PDFs.

Input parameters:

- `filename` (string): Which image; partial match is fine.
- `folder` (string): Default INBOX.
- `uid` (string, required)
- `uidvalidity` (string)

### `save_attachment` (~194 tokens)

Save an attachment

Write attachment(s) to disk and return the path(s). Use for images, scanned PDFs, or anything not text-extractable. EPHEMERAL by default — files self-delete after the TTL.

Input parameters:

- `dest_dir` (string): Sub-path under the attachments dir. Writes outside it are refused.
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `filename` (string): Partial match; omit to save all documents.
- `folder` (string): Default INBOX.
- `include_inline` (boolean)
- `persist` (boolean): Keep the file permanently. Default false = auto-deleted after the TTL so nothing lingers for the user to open by accident.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `purge_attachments` (~49 tokens)

Delete saved attachments

Immediately delete all ephemeral saved attachments. Call after reading a saved file so nothing lingers on disk.

Input parameters:

- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.

### `find_thread` (~112 tokens)

Find a thread

Pull every message of a conversation from All Mail, showing which ones carry documents. ESSENTIAL: Proton's UI groups conversations but IMAP exposes single messages, so an inbox 'Re:' can look attachment-free while the thread's original holds the PDFs. Run this before concluding what a thread needs.

Input parameters:

- `folder` (string): Folder of that uid, default INBOX.
- `subject` (string): Alternatively match on a subject directly.
- `uid` (string): A message in the thread (its subject is used).

### `bulk_mark` (~105 tokens)

Mark messages in bulk

Mark many messages read/unread/starred in one pass. Far cheaper than one call per message.

Input parameters:

- `action` (string, required)
- `dry_run` (boolean): Preview which uids would be affected, change nothing.
- `folder` (string): Folder the uids belong to. Default INBOX.
- `uids` (array, required): Explicit message uids. No wildcards.
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `bulk_apply_label` (~120 tokens)

Apply a label in bulk

Apply one existing label to many messages. Messages stay where they are.

Input parameters:

- `dry_run` (boolean): Preview which uids would be affected, change nothing.
- `folder` (string): Folder the uids belong to. Default INBOX.
- `label` (string, required): An existing label. On Proton the Labels/ prefix is optional; elsewhere this is an ordinary mailbox name.
- `uids` (array, required): Explicit message uids. No wildcards.
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `bulk_move` (~120 tokens)

Move messages in bulk

File or Trash many messages at once. GATED: preview with dry_run=true, show the user, then call with confirmed=true.

Input parameters:

- `confirmed` (boolean, required)
- `dry_run` (boolean): Preview which uids would be affected, change nothing.
- `folder` (string): Folder the uids belong to. Default INBOX.
- `to_folder` (string, required)
- `uids` (array, required): Explicit message uids. No wildcards.
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `reply` (~245 tokens)

Reply

Reply to one message with correct threading. Replies to the Reply-To address when there is one, so alias mail stays masked. Pass draft=true to save it for review, or confirmed=true to send.

Input parameters:

- `attach` (array): Files to attach, by path. Only from the allowed source directories.
- `body` (string, required): Your reply text. The original is quoted beneath unless quote=false.
- `confirmed` (boolean): Required to actually send. Not needed when draft=true.
- `draft` (boolean): Save to Drafts instead of sending. Needs no confirmation because nothing goes out.
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Folder holding the message. Default INBOX.
- `from_address` (string): Must be on the sender allowlist. Left unset, alias mail automatically uses the alias-owner address.
- `quote` (boolean): Quote the original beneath your reply. Default true.
- `subject` (string): Override the auto 'Re: ...' subject.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `reply_all` (~233 tokens)

Reply to all

Reply to everyone on a message, with your own addresses removed from Cc and duplicates dropped. Same draft and confirmation rules as reply.

Input parameters:

- `attach` (array): Files to attach, by path. Only from the allowed source directories.
- `body` (string, required): Your reply text. The original is quoted beneath unless quote=false.
- `confirmed` (boolean): Required to actually send. Not needed when draft=true.
- `draft` (boolean): Save to Drafts instead of sending. Needs no confirmation because nothing goes out.
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Folder holding the message. Default INBOX.
- `from_address` (string): Must be on the sender allowlist. Left unset, alias mail automatically uses the alias-owner address.
- `quote` (boolean): Quote the original beneath your reply. Default true.
- `subject` (string): Override the auto 'Re: ...' subject.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `create_draft` (~120 tokens)

Create a draft

Write a draft into the Proton Drafts folder. Never sends. For a reply, pass in_reply_to (the original Message-ID).

Input parameters:

- `attach` (array): Files to attach, by path. Only from the allowed source directories.
- `body` (string, required)
- `cc` (string)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `in_reply_to` (string)
- `references` (string)
- `subject` (string, required)
- `to` (string, required)

### `update_draft` (~169 tokens)

Update a draft

Replace a draft's contents. Threading headers are carried over, the new version is saved before the old one is binned. Omit a field to keep what the draft already had.

Input parameters:

- `attach` (array): Files to attach, by path. Only from the allowed source directories.
- `body` (string)
- `cc` (string)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Defaults to your Drafts folder.
- `from_address` (string): Must be on the sender allowlist.
- `subject` (string)
- `to` (string)
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY of the folder; refuses on mismatch.

### `delete_draft` (~89 tokens)

Delete a draft

Move a draft to Trash. GATED. Nothing here deletes permanently.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Defaults to your Drafts folder.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY of the folder; refuses on mismatch.

### `send_draft` (~101 tokens)

Send a draft

Send a saved draft as written, then move it to Trash. GATED. Sender and recipient checks run again at send time.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Defaults to your Drafts folder.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY of the folder; refuses on mismatch.

### `unsubscribe` (~112 tokens)

Unsubscribe

Report how to unsubscribe from a message using its List-Unsubscribe header, and optionally send the email form. Reports only unless send=true. Web links are never fetched for you.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Default INBOX.
- `send` (boolean): Actually send the mailto: unsubscribe. Requires confirmed.
- `uid` (string, required)
- `uidvalidity` (string)

### `mark` (~95 tokens)

Mark a message

Mark a message read/unread or star/unstar.

Input parameters:

- `action` (string, required)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Default INBOX.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `apply_label` (~123 tokens)

Apply a label

Tag a message with an existing label. The message stays where it is.

Input parameters:

- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Source folder, default INBOX.
- `label` (string, required): An existing label. On Proton the Labels/ prefix is optional; elsewhere this is an ordinary mailbox name.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `remove_label` (~154 tokens)

Remove a label

Take a label off a message. The message itself stays where it is. GATED: removing a label ends in an expunge against the label mailbox, so confirm it or preview with dry_run=true first.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Folder the message lives in, default INBOX.
- `label` (string, required): The label to take off. On Proton the Labels/ prefix is optional.
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `bulk_remove_label` (~130 tokens)

Remove a label in bulk

Take one label off many messages at once. The messages stay where they are. GATED, like remove_label.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview which uids would be affected, change nothing.
- `folder` (string): Folder the uids belong to. Default INBOX.
- `label` (string, required): The label to take off. On Proton the Labels/ prefix is optional.
- `uids` (array, required): Explicit message uids. No wildcards.
- `uidvalidity` (string): UIDVALIDITY for that folder; refuses on mismatch.

### `move_to_folder` (~114 tokens)

Move to folder

File a message: move it into another folder (e.g. 'Folders/<name>', 'Archive', 'Trash').

Input parameters:

- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Source folder, default INBOX.
- `to_folder` (string, required)
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

### `create_folder_or_label` (~98 tokens)

Create a folder or label

Create a new label or folder. GATED: it changes your folder and label structure, so confirm the exact name and type with the user, then call with confirmed=true.

Input parameters:

- `confirmed` (boolean, required)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `kind` (string, required)
- `name` (string, required): Name only, no 'Labels/' or 'Folders/' prefix.

### `delete_label` (~104 tokens)

Delete a label

Delete a label outright. Every message that carried it stays exactly where it is and simply loses the tag — no mail is deleted. Labels only; folders are where messages live and are not deletable here. GATED.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview it, including how many messages carry the label. Changes nothing, needs no confirmation.
- `label` (string, required): The label to delete. On Proton the Labels/ prefix is optional.

### `bulk_delete_labels` (~77 tokens)

Delete labels in bulk

Delete several labels in one pass. Messages keep their place and lose the tags. Labels only, GATED.

Input parameters:

- `confirmed` (boolean)
- `dry_run` (boolean): Preview each one, including how many messages carry it. Changes nothing.
- `labels` (array, required): Label names. On Proton the Labels/ prefix is optional.

### `send` (~198 tokens)

Send mail

Send a new email. GATED: the agent must show the user the exact To/Subject/Body, get an explicit yes, then call with confirmed=true. Never call unattended.

Input parameters:

- `attach` (array): Files to attach, by path. Only from the allowed source directories.
- `body` (string, required)
- `cc` (string)
- `confirmed` (boolean, required): Must be true; set only after the user approves this exact message.
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `from_address` (string): Override the From address. For replies to a SimpleLogin alias, set this to your alias-owner address (PROTON_ALIAS_FROM) and send 'to' the reverse-alias from the message's Reply-To header.
- `in_reply_to` (string)
- `references` (string)
- `subject` (string, required)
- `to` (string, required)

### `forward` (~156 tokens)

Forward

Forward an existing message to someone on demand. GATED like send: confirm recipient with the user, then call with confirmed=true.

Input parameters:

- `confirmed` (boolean, required)
- `dry_run` (boolean): Preview exactly what would happen and change nothing. Needs no confirmation.
- `folder` (string): Default INBOX.
- `from_address` (string): Override the From address (use your alias-owner address when forwarding via an alias reverse-address).
- `note` (string): Optional note added above the forwarded content.
- `to` (string, required)
- `uid` (string, required)
- `uidvalidity` (string): UIDVALIDITY reported alongside the uid. Pass it back so a mailbox resync cannot make this act on the wrong message.

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid#diagnostics

## Score history

- 2026-08-22: 43
- 2026-08-21: 43
- 2026-08-20: 42
- 2026-08-19: 42
- 2026-08-18: 41
- 2026-08-17: 43
- 2026-08-16: 43
- 2026-08-15: 43
- 2026-08-14: 43
- 2026-08-13: 43
- 2026-08-12: 43
- 2026-08-11: 43

## Links

- Website: https://considus.com/proton-bridge-mcp/
- Changelog RSS feed: https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid.json
- HTML version of this page: https://verifymcp.io/servers/com-considus-proton-bridge-mcp/https-github-com-considus-proton-bridge-mcp-releases-download-v1-2-2-proton-brid
