MCP server for Proton Mail, over the local Proton Mail Bridge IMAP endpoint
Strong tool naming (verb_noun pattern consistently applied across 16 tools). Descriptions are detailed and contextual (avg ~150 chars, within 10-1024 baseline). Input schemas are comprehensive with types, descriptions, and sensible defaults. However, output schemas are not formally documented, responses are inferred from code (ok() wrapper returns JSON text). Parameter descriptions are thorough but lack explicit format constraints (e.g., mailbox paths accept free-form strings without validation hints). Error handling is present but generic (guard() catches errors and returns isError flag without recovery guidance). No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification in the spec.
Add one or more labels to a message.
Copy one message to a different mailbox.
Create a new folder under Folders/.
Create a new label under Labels/.
Delete a folder and move its messages to Trash.
Delete a label. Messages keep their other labels.
Delete one message permanently (move to Trash, then expunge).
Download one attachment from a message to disk. Returns the path where it was saved.
Output schemas not formally documented. Responses are JSON text wrapped by ok() helper; LLMs cannot infer field types or structure for downstream tool chaining.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification. Tools marked DESTRUCTIVE (delete_folder, delete_label, delete_message) should declare destructiveHint=true to guide agent caution.
Error handling is generic. guard() catches errors and returns isError=true with message text, but does not categorize errors as retryable/user-fixable/fatal or provide recovery guidance (e.g., 'Try search_messages() first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
List every Proton mailbox: system mailboxes (INBOX, Archive, Sent, Trash, Spam, Drafts, Starred, All Mail), exclusive folders under Folders/, and labels under Labels/. Includes message and unread counts.
List messages in a mailbox, newest first. Returns summaries (uid, subject, from, date, flags), not bodies — call read_message with a uid for the content.
Message count, unread count and next UID for one mailbox.
Move one message to a different mailbox.
Fetch one message in full: headers, plain-text body, and the attachment list. Attachment contents are not included — use download_attachment.
Remove one or more labels from a message.
Search one mailbox by sender, recipient, subject, body text, date range or read/flagged state. Search "All Mail" to cover the whole account. Returns summaries, newest first.
Set or clear flags on one message (\Seen, \Flagged, \Answered, \Deleted, \Draft).
Parameter descriptions lack explicit format constraints. 'mailbox' parameter accepts free-form strings; no hint that paths must match 'INBOX', 'Folders/X', or 'Labels/Y' patterns. LLMs may pass invalid paths.
Destructive operations (delete_message, delete_folder) lack confirmation/dry-run support. Agents cannot preview consequences before committing irreversible actions.