Proton Mail Bridge MCP
The Proton Mail Bridge MCP server provides full programmatic control over Proton Mail via Proton Bridge, enabling email management, drafting, search, triage, analytics, diagnostics, and automation — entirely locally.
Sending & Composing
Send emails via SMTP with CC, BCC, attachments, HTML body, and priority
Reply (including reply-all), forward, and send test emails
Draft Management
Create, list, read, update, sync, send, and delete drafts
Support for new, reply, forward, and thread-based drafts
Sync drafts to/from remote Proton Drafts folder
Reading & Searching
Browse emails by folder with pagination; fetch full content by ID
Search via live IMAP filters (sender, recipient, subject, date, read status, attachments)
Fast offline search using a local SQLite index with field shortcuts (
from:,to:,subject:,domain:,label:)
Mailbox Actions
Mark read/unread, star/unstar, move, archive, trash, restore, permanently delete
Batch operations and thread-level actions with dry-run preview support
Folder Management
List folders with message/unseen counts
Create, rename, and delete custom folders (with system folder protection)
Thread & Triage Tools
Inbox digest, actionable threads ranked by urgency, follow-up candidates
Thread briefs with recommended next actions, document thread finder (invoices, contracts, travel), and meeting context prep
Attachments
List, fetch (inline base64 or metadata), and save attachments to disk
Analytics & Statistics
Email stats, top senders, busiest hours, volume trends, and most-contacted addresses
Diagnostics & Maintenance
Connection status (IMAP/SMTP), runtime status, full health check (doctor), sync controls, IMAP IDLE monitoring, index management, cache clearing, in-session logs, and persistent audit logs of all write operations
Security & Control
Read-only mode, send restrictions, action allowlists, and file/command-based secrets to avoid plaintext credentials
Provides interaction with Proton services via the local Proton Bridge, enabling secure access to mailbox data, thread management, and analytics.
Enables comprehensive management of Proton Mail through Proton Bridge, allowing users to read, send, reply, and forward emails, manage attachments, and perform mailbox operations like archiving and labeling.
____ ____ ___ _____ ___ _ _ __ __ _ ___ _
| _ \| _ \ / _ \_ _/ _ \| \ | | | \/ | / \ |_ _| |
| |_) | |_) | | | || || | | | \| | | |\/| | / _ \ | || |
| __/| _ <| |_| || || |_| | |\ | | | | |/ ___ \ | || |___
|_| |_| \_\\___/ |_| \___/|_| \_| |_| |_/_/ \_\___|_____|
Bridge Client · CLI + Claude Desktop MCP for Proton Mail
Give Claude Desktop (or Cline, or any MCP client) full access to your Proton Mail inbox: read, search, send, draft, triage threads, manage folders, save attachments, and more — 95 MCP tools in total. Most of the same capabilities are also available as a full CLI for scripting, cron, and piped automation — no Claude required.
What you get
Claude reads and manages your Proton Mail — triage, reply, draft, archive, search, move, batch-act on threads, pull attachments
Full CLI — a dedicated command for every one of the 95 tools (plus a generic
tool <name>passthrough), scriptable and pipeable, works in cron and shell scriptsFast local search — full-text search across your inbox without hitting IMAP on every query
Safety controls — read-only mode, send gate, destructive-action confirmation, per-action allowlist
Privacy-native — no third-party email service involved; your mail stays on your machine
Related MCP server: protonmail-mcp
Privacy model
Your emails travel: Proton Mail → Proton Bridge (local) → this server (local) → your AI client.
Nothing goes through a third-party email relay. Proton Bridge decrypts your mail locally; this server reads it over a local IMAP connection on 127.0.0.1. The AI model (Claude Desktop, Cline, etc.) sees the email content you ask it to act on — that's the whole point — but no email leaves your machine except through your own Proton account when you send.
If you use Claude Desktop with the default Anthropic API, conversation content (including email snippets) is sent to Anthropic per their privacy policy. If you self-host an LLM or use a local-only Claude setup, nothing leaves your machine at all.
Prerequisites
1. Proton Bridge — must be installed, signed in, and running. Download: proton.me/mail/bridge
Bridge password vs Proton password: Proton Bridge generates a separate local password that is not your Proton account password. Find it inside the Bridge app under Account → Copy password (or similar — exact label varies by Bridge version). You'll need this for setup.
2. Node.js 18 or later — node --version to check.
3. Your Bridge credentials — from the Bridge app:
IMAP host/port (default:
127.0.0.1:1143)SMTP host/port (default:
127.0.0.1:1025)Username (your Proton email address)
Bridge password (see note above)
Install
npm (recommended):
npm install -g proton-mail-bridge-clientHomebrew:
brew tap googlarz/tap
brew install proton-mail-bridge-clientgit clone https://github.com/googlarz/proton-mail-bridge-client.git
cd proton-mail-bridge-client
npm install
npm run buildThe proton-mail-bridge-client binary is available inside the repo after build.
Connect to Claude Desktop
Run the guided setup wizard:
proton-mail-bridge-client setup-claude-desktopThe wizard:
checks your local Bridge ports
asks for your Bridge username and Bridge password
writes the Claude Desktop MCP config entry
After setup: restart Claude Desktop, make sure Proton Bridge is open, then check + → Connectors → proton-mail-bridge.
Updating
npm update -g proton-mail-bridge-client
proton-mail-bridge-client setup-claude-desktopManual config
The wizard handles config automatically. If you need to set it up by hand, three credential methods are supported:
{
"mcpServers": {
"proton-mail-bridge": {
"command": "proton-mail-bridge-mcp",
"env": {
"PROTONMAIL_USERNAME": "you@proton.me",
"PROTONMAIL_PASSWORD": "your-bridge-password",
"PROTONMAIL_IMAP_HOST": "127.0.0.1",
"PROTONMAIL_IMAP_PORT": "1143",
"PROTONMAIL_IMAP_SECURE": "false",
"PROTONMAIL_SMTP_HOST": "127.0.0.1",
"PROTONMAIL_SMTP_PORT": "1025"
}
}
}
}{
"mcpServers": {
"proton-mail-bridge": {
"command": "proton-mail-bridge-mcp",
"env": {
"PROTONMAIL_USERNAME_FILE": "/path/to/username.txt",
"PROTONMAIL_PASSWORD_FILE": "/path/to/password.txt",
"PROTONMAIL_IMAP_HOST": "127.0.0.1",
"PROTONMAIL_IMAP_PORT": "1143",
"PROTONMAIL_IMAP_SECURE": "false",
"PROTONMAIL_SMTP_HOST": "127.0.0.1",
"PROTONMAIL_SMTP_PORT": "1025"
}
}
}
}{
"mcpServers": {
"proton-mail-bridge": {
"command": "proton-mail-bridge-mcp",
"env": {
"PROTONMAIL_USERNAME_COMMAND": "pass proton/username",
"PROTONMAIL_PASSWORD_COMMAND": "pass proton/password",
"PROTONMAIL_IMAP_HOST": "127.0.0.1",
"PROTONMAIL_IMAP_PORT": "1143",
"PROTONMAIL_IMAP_SECURE": "false",
"PROTONMAIL_SMTP_HOST": "127.0.0.1",
"PROTONMAIL_SMTP_PORT": "1025"
}
}
}
}Connect to Claude Code
Install globally, then register the server with one command:
npm install -g proton-mail-bridge-client
claude mcp add proton-mail-bridge \
-e PROTONMAIL_USERNAME=you@proton.me \
-e PROTONMAIL_PASSWORD=your-bridge-password \
-- proton-mail-bridge-mcpyour-bridge-password is the Bridge app's own password (Bridge → account → Mailbox details), not your Proton account password — see the note under Prerequisites.
By default this registers the server for the current project only. Add -s user to make it available in every project:
claude mcp add proton-mail-bridge -s user \
-e PROTONMAIL_USERNAME=you@proton.me \
-e PROTONMAIL_PASSWORD=your-bridge-password \
-- proton-mail-bridge-mcpVerify it's connected:
claude mcp listFor file-based or command-based credentials instead of plaintext env vars, add -e PROTONMAIL_USERNAME_FILE=/path/to/file (or _COMMAND) the same way — see the credential methods under Manual config above.
Connect to Cline (VS Code)
Install globally (npm install -g proton-mail-bridge-client), then open Cline's MCP settings:
VS Code → Cline extension panel → MCP servers icon → Edit MCP Settings
Or edit directly:
~/Library/Application Support/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json(macOS)
Add the server:
{
"mcpServers": {
"proton-mail-bridge": {
"command": "proton-mail-bridge-mcp",
"env": {
"PROTONMAIL_USERNAME": "you@proton.me",
"PROTONMAIL_PASSWORD": "your-bridge-password",
"PROTONMAIL_IMAP_HOST": "127.0.0.1",
"PROTONMAIL_IMAP_PORT": "1143",
"PROTONMAIL_IMAP_SECURE": "false",
"PROTONMAIL_SMTP_HOST": "127.0.0.1",
"PROTONMAIL_SMTP_PORT": "1025"
}
}
}
}For file-based or command-based credentials, use the same PROTONMAIL_USERNAME_FILE / PROTONMAIL_PASSWORD_COMMAND pattern from the Claude Desktop manual config above.
Reload the Cline extension after saving. Proton Mail tools will appear in Cline's tool list.
Try it: example Claude prompts
Morning triage
"Give me a digest of my inbox. Flag anything that needs a reply today and anything that looks like a bill or invoice."
Inbox zero
"Go through my unread emails from the past 3 days. Archive newsletters, trash anything promotional, and tell me what's left that needs action."
Folder filing
"Find all emails from stripe.com and move them to Folders/Receipts. Create the folder if it doesn't exist."
Meeting prep
"I have a call with alice@example.com in an hour. Pull up our last 5 email threads and summarise the open items."
Draft review
"Show me my drafts, pick the oldest one, and suggest a better subject line and closing paragraph."
Tip: When creating folders, use
Folders/Name(not justName) — that's the Proton Bridge namespace for real folders vs. labels.
More recipes — expanded triage prompts, cron scripts for scheduled digests, and a Claude Code /mail-triage slash command — are in examples/.
Recommended System Prompt
Add this to Claude Desktop's system prompt (Settings → Claude Desktop → System Prompt) for safer defaults:
You have access to my Proton Mail inbox via the proton-mail-bridge tool.
Rules:
- Always use dryRun: true before any batch operation (batch_email_action, apply_thread_action).
- Before calling send_email, reply_to_email, or forward_email, summarise what you are about to send and ask me to confirm.
- For anything important or hard to walk back (a wide CC list, a sensitive topic, an attachment), offer a short undo window via send_email's undoWindowSeconds instead of sending immediately — remind me it only protects against mistakes noticed in the next few seconds, not a change of mind days later.
- Before calling delete_email, confirm with me — deletion is permanent.
- Prefer create_draft over send_email when composing from scratch.
- Use get_inbox_digest or get_actionable_threads as your starting point for triage sessions.CLI
Every capability is also a scriptable terminal command — no Claude required:
proton-mail-bridge-client digest # morning triage summary
proton-mail-bridge-client search --from stripe.com --json | jq . # scriptable search
echo "Deploy done" | proton-mail-bridge-client send --to you@x.com --subject "Deploy"
proton-mail-bridge-client notify & # background new-mail alertsAll commands support --json for machine-readable output, and any MCP tool is directly callable via proton-mail-bridge-client tool <name> --args '{...}'.
Full command reference: docs/cli.md (a named command for every one of the 95 tools, across read, triage, compose, mailbox actions, folders, drafts, templates, analytics, and diagnostics).
Safety controls
All flags work in both the MCP server and CLI:
PROTONMAIL_TOOL_TIER=core # expose 20 core tools instead of all 95 — saves context window
PROTONMAIL_READ_ONLY=true # disable all write operations
PROTONMAIL_ALLOW_SEND=false # disable SMTP sends only (other writes still work)
PROTONMAIL_CONFIRM_DESTRUCTIVE=true # require confirmed:true on send, reply, forward, delete
PROTONMAIL_ALLOWED_ACTIONS='mark_read,archive,trash' # per-action allowlistbatch_email_action and apply_thread_action both support dryRun: true regardless of the above flags.
Environment reference
# Credentials (required)
PROTONMAIL_USERNAME='you@proton.me'
PROTONMAIL_PASSWORD='your-bridge-password' # Bridge password, not Proton account password
PROTONMAIL_IMAP_HOST='127.0.0.1'
PROTONMAIL_IMAP_PORT='1143'
PROTONMAIL_IMAP_SECURE='false'
PROTONMAIL_SMTP_HOST='127.0.0.1'
PROTONMAIL_SMTP_PORT='1025'
PROTONMAIL_SMTP_SECURE='true' # Bridge's local SMTP port requires implicit TLS from the first byte; set false only for a non-Bridge SMTP relay
# Secrets via file or command (avoids raw credentials in config)
PROTONMAIL_USERNAME_FILE='/path/to/user.txt'
PROTONMAIL_PASSWORD_FILE='/path/to/pass.txt'
PROTONMAIL_USERNAME_COMMAND='pass proton/username'
PROTONMAIL_PASSWORD_COMMAND='pass proton/password'
# Storage
PROTONMAIL_DATA_DIR="$HOME/.proton-mail-bridge-client"
# Tools
PROTONMAIL_TOOL_TIER='full' # 'core' exposes 20 essential tools (saves context window); 'full' exposes all 95
# Safety
PROTONMAIL_READ_ONLY='false'
PROTONMAIL_ALLOW_SEND='true'
PROTONMAIL_ALLOW_REMOTE_DRAFT_SYNC='true'
PROTONMAIL_ALLOWED_ACTIONS='mark_read,mark_unread,star,unstar,archive,trash,restore'
PROTONMAIL_CONFIRM_DESTRUCTIVE='false'
PROTONMAIL_SEND_DELAY_SECONDS='0' # >0: send_email queues instead of sending immediately, cancelable via cancel_send. Only fires while this server stays running.
PROTONMAIL_SIGNATURE='' # Plain text, appended to send_email/reply_to_email/reply_all_email/forward_email bodies (text + HTML), after your own text and before any quoted/forwarded content. Opt out per-message with appendSignature: false. Never applied to send_draft/schedule_draft — draft content is already finalized.
# Sync
PROTONMAIL_AUTO_SYNC='true'
PROTONMAIL_STARTUP_SYNC='true'
PROTONMAIL_SYNC_INTERVAL_MINUTES='5'
PROTONMAIL_IDLE_WATCH='true'
PROTONMAIL_IDLE_MAX_SECONDS='30'Compared with Claude's native Gmail connector
Capability | Gmail connector | Proton Mail Bridge Client |
Setup | First-party OAuth | Requires Proton Bridge + this client |
Search and read | Native Claude UX | IMAP + local index |
Send email | No | Yes |
Draft workflows | Better first-party UX | Full control incl. remote draft sync |
Attachment content | Limited | Fetch and save to disk |
Mailbox actions | Limited | Full (star, move, archive, trash, restore, delete, batch) |
Folder management | No | Yes (create, rename, delete) |
CLI access | No | Full parity with MCP |
Privacy | Google-hosted | Proton E2E encryption, local Bridge |
Tool surface
Send
send_email · send_test_email · reply_to_email · reply_all_email · forward_email
Drafts
create_draft · create_reply_draft · create_forward_draft · create_thread_reply_draft · list_drafts · list_remote_drafts · get_draft · update_draft · sync_draft_to_remote · send_draft · delete_draft
Read
get_emails · get_email_by_id · count_messages · search_emails · search_indexed_emails · list_attachments · get_attachment_content · save_attachment · save_attachments
Triage
get_folders · sync_folders · get_labels · get_threads · get_thread_by_id · get_thread_brief · get_actionable_threads · get_inbox_digest · get_follow_up_candidates · find_document_threads · prepare_meeting_context · delete_thread · flag_thread · move_thread
Actions
mark_email_read · star_email · move_email · archive_email · trash_email · restore_email · delete_email · batch_email_action · apply_thread_action · empty_folder · bulk_delete · bulk_move · bulk_update_flags · bulk_update_labels · update_message_flags · update_message_labels
Folder management
create_folder · rename_folder · delete_folder · create_label · rename_label · delete_label
Analytics
get_email_stats · get_email_analytics · get_contacts · get_volume_trends · folder_stats · top_senders
Diagnostics
get_connection_status · get_runtime_status · run_doctor · get_audit_logs · run_background_sync · wait_for_mailbox_changes · sync_emails · get_index_status · clear_cache · clear_index · get_logs
Unsubscribe & trust
get_unsubscribe_info · unsubscribe_sender — get_email_by_id also returns a security block (DKIM/SPF/DMARC, encryption, spam score)
Undo-send, scheduling & snooze
cancel_send · list_scheduled_sends · schedule_draft · snooze_email · cancel_snooze · list_snoozed — send_email queues instead of sending immediately when PROTONMAIL_SEND_DELAY_SECONDS is set; all three only fire while this server process stays running, see Operational notes
Templates
create_template · list_templates · get_template · delete_template · render_template — {{variable}} substitution, render then pass the result to send_email
Import/export & attachments
export_email · import_email · get_attachment_text · get_emails_by_ids
Using it as a library
Beyond the CLI and MCP server, the underlying service classes are importable directly:
import { SimpleIMAPService, SMTPService } from "proton-mail-bridge-client/services";
const imapService = new SimpleIMAPService(config, logger);
const smtpService = new SMTPService(config);proton-mail-bridge-client/services has no side effects on import — unlike the package's
main entry point, which also self-starts the MCP server when run directly. Also exported:
all shared types (ProtonMailConfig, EmailSummary, EmailDetail, …), planFolderSync,
isLikelyAuthenticationError, and sanitizeHeader.
Operational notes
get_emailsandsearch_emailsreturn a compositeemailId— use it for all subsequent reads and actions.search_indexed_emailssupportsfrom:,to:,subject:,label:,domain:shortcuts.The local index lives at
PROTONMAIL_DATA_DIR/mail-index.sqlite. Background sync and IMAP IDLE keep it warm.Audit logs live at
PROTONMAIL_DATA_DIR/audit.log.Draft sync is best-effort — the local draft is always preserved even if remote sync fails.
System folders (INBOX, Sent, Trash, Spam, Archive, All Mail) are guarded against accidental deletion.
Troubleshooting
"Wrong password" or connection refused Make sure you're using the Bridge password, not your Proton account password. Find it in the Bridge app under Account → Copy password. Bridge must be running before the MCP server or CLI can connect.
macOS native module crash after update
better-sqlite3 is a native binary built for your machine. After a major Node.js upgrade or environment change, rebuild it:
proton-mail-bridge-client setup-claude-desktopThis reinstalls the runtime and rebuilds native modules in place.
Claude can't see the connector
After changing the MCP config, restart Claude Desktop fully (not just reload). Then check + → Connectors → proton-mail-bridge. If it's not there, run proton-mail-bridge-client doctor to validate the connection.
Folder not found when moving email
Use Folders/Name for real folders (e.g., Folders/Receipts), not just Name. Labels and folders share the same namespace in Proton Bridge but are structurally different.
Changelog
See CHANGELOG.md for release history.
Contributing
Bug reports and pull requests welcome: github.com/googlarz/proton-mail-bridge-client/issues
License
MIT
Available Tools
95 toolsapply_thread_actionADestructive
Apply a reversible mailbox action to every message in a normalized thread at once. Use when you want to act on a full thread identified by threadId (e.g. archive or mark-read an entire conversation). Supports dryRun, unreadOnly to scope impact, and syncBefore to refresh the index first. Prefer batch_email_action when you have explicit emailIds rather than a threadId.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| dryRun | No | Preview the impact without mutating the mailbox. | |
| threadId | Yes | Thread id from get_threads or get_actionable_threads. | |
| syncBefore | No | Refresh the local mailbox index from IMAP before resolving the thread. | |
| unreadOnly | No | Only apply the action to unread messages in the thread. | |
| targetFolder | No | Required when action is move. | |
| continueOnError | No | Continue applying the action after an individual failure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint: true, and the description adds context that actions are 'reversible' and supports dryRun for previewing impact. It also mentions scoping via unreadOnly and index refresh via syncBefore. This goes beyond the annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, usage, and alternative. Front-loaded with the essential description, no filler, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, the description covers the core action, use case, key scoping options, and alternative. It doesn't detail return values or failure mode, but the schema covers parameters and destructiveHint covers risk. Very solid overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (86%) and all parameters have descriptions. The description reiterates dryRun, unreadOnly, and syncBefore but doesn't add new parameter-level meaning beyond what the schema already supplies. Minimally viable, not lacking but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Apply') and identifies the resource ('every message in a normalized thread'), immediately distinguishing it from single-message tools. It also names example actions ('archive or mark-read') and differentiates from batch_email_action by threadId vs emailIds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Use when you want to act on a full thread identified by threadId') and when to prefer an alternative ('Prefer batch_email_action when you have explicit emailIds rather than a threadId'). This gives clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_emailA
Move a single email to the standard Archive folder. Use for messages that are resolved but worth keeping long-term. Prefer trash_email when the message is no longer needed. Prefer move_email to route to a custom folder. Prefer batch_email_action for archiving multiple emails at once.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide destructiveHint=false, so the agent knows it's not destructive. The description adds no major behavioral context beyond the move semantics (e.g., it doesn't mention whether archival removes from the current folder, whether it's reversible, or permission needs). Since the annotation already covers the safety profile, a score of 3 is appropriate—adequate but with room for more behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: the first sentence states the core action, the second gives usage context, and the remaining three sentences list alternatives. Every sentence adds value, with no redundancy or fluff. It is front-loaded and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description fully covers what the tool does, when to use it, and which alternatives to prefer. The annotation covers destructiveness, and the schema covers the parameter. No additional context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the emailId parameter clearly documented as 'Composite email id in FOLDER::UID format, as returned by get_emails or search_emails.' The description does not add extra parameter semantics, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Move a single email to the standard Archive folder.' It specifies the verb (move), resource (email), destination (Archive folder), and scope (single). It also distinguishes itself from sibling tools by naming trash_email, move_email, and batch_email_action as alternatives, making it unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Use for messages that are resolved but worth keeping long-term.' It also gives clear exclusions and alternatives: 'Prefer trash_email when the message is no longer needed. Prefer move_email to route to a custom folder. Prefer batch_email_action for archiving multiple emails at once.' This fully addresses selection vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_email_actionADestructive
Apply one action to a known list of email IDs in a single IMAP pass. Use when you already have the IDs and want to archive, trash, move, mark-read/unread, star/unstar, restore, or permanently delete them. Actions: mark_read, mark_unread, star, unstar, archive, trash, restore, move (requires targetFolder), delete (permanent expunge). Supports dryRun. Prefer bulk_delete when selecting messages by search criteria (from/subject/date) rather than by ID. Prefer apply_thread_action when acting on a thread by threadId. Prefer empty_folder to clear an entire folder.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| dryRun | No | Preview the impact without mutating the mailbox. | |
| emailIds | Yes | Composite email ids as an array or a comma-separated string. | |
| targetFolder | No | Destination folder. Required when action is 'move'; optional for 'restore' (defaults to INBOX). | |
| continueOnError | No | Continue applying the action after an individual failure. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context beyond the destructiveHint annotation: details like 'delete (permanent expunge)', dryRun support, and continueOnError behavior, and does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise at 4 sentences, front-loaded with purpose and usage, then actions, then alternatives. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a batch action tool without output schema, the description fully covers input semantics, supported actions, usage context, and sibling alternatives. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80% with descriptions on most parameters. The description adds semantics for the action enum (lists and explains each action) and clarifies emailIds format. Slightly redundant but helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Apply one action to a known list of email IDs' with specific verb and resource, and distinguishes from sibling tools like bulk_delete, apply_thread_action, and empty_folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance: 'Use when you already have the IDs' and 'Prefer bulk_delete when selecting by search criteria', etc., providing clear when-to-use and when-not-to-use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_deleteADestructive
Delete multiple emails by explicit ID list or by search criteria (from/subject/date/flags). Use when you have specific IDs to delete or want to filter by sender, subject, or date range. Accepts emailIds[] OR match criteria (XOR). permanent:true permanently expunges; false moves to Trash. Use dryRun to preview. Prefer empty_folder to clear an entire folder. Prefer delete_email for a single message. Prefer batch_email_action when the same set of IDs needs a mix of actions, not just deletion.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Search criteria. XOR with emailIds. | |
| dryRun | No | ||
| folder | No | Source folder (required with match). | |
| emailIds | No | Explicit email IDs. XOR with match. | |
| confirmed | No | Required when permanent:true and PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. | |
| permanent | No | Permanently expunge (irreversible). False = move to Trash. | |
| maxBatchSize | No | Maximum number of messages to process. Defaults to 500. Use to prevent runaway operations. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses critical behaviors: the XOR relationship between emailIds and match, the irreversible nature of permanent:true versus moving to Trash, the availability of dryRun for preview, and the safety mechanism of maxBatchSize to prevent runaway operations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, leading with the core purpose, then explaining key parameters, and finally providing decision guidance. Every sentence adds value and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with 7 parameters, a nested match object, and no output schema, the description covers all essential usage patterns, safety considerations, and sibling alternatives. It gives the agent enough context to invoke the tool correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the schema covers 86% of parameters, the description adds crucial semantic meaning: the XOR constraint, that folder is required with match, the purpose of dryRun as a preview, and the safety role of maxBatchSize. These details significantly enhance understanding beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Delete'), the resource ('emails'), and the two modes of operation (explicit ID list or search criteria). It distinguishes itself from siblings by explicitly recommending empty_folder, delete_email, and batch_email_action for alternative scenarios.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use when you have specific IDs to delete or want to filter by sender, subject, or date range.' It further provides clear alternatives with 'Prefer' statements, making it obvious when to choose this tool over related ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_moveA
Move multiple emails to a target folder in one IMAP pass. Accepts either explicit emailIds[] or a match criteria object (XOR). Supports dryRun to preview. For single-message moves use move_email.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Search criteria to select messages. XOR with emailIds. | |
| dryRun | No | Preview without moving. | |
| folder | No | Source folder (required when using match). | |
| emailIds | No | Explicit email IDs (FOLDER::UID format). XOR with match. | |
| maxBatchSize | No | Maximum number of messages to process. Defaults to 500. Use to prevent runaway operations. | |
| targetFolder | Yes | Destination folder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Disclosures include operations in one IMAP pass, dryRun support, and max batch limit. The annotation destructiveHint: false is consistent. No contradictions noted, but could mention that moves are reversible or if permissions required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no redundancy. Key information is front-loaded: purpose, usage, and differentiation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers essential aspects: method of selection (IDs or criteria), dryRun, batch size limit. Missing details on return value or error handling, but acceptable without output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the description adds value by explaining the XOR relationship between emailIds and match, and that folder is required when using match. This context goes beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (move multiple emails), resource (emails in one IMAP pass), and explicitly differentiates from the sibling tool move_email for single-message moves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: when to use (bulk moves), when not to use (single-message use move_email), and how to use (XOR between emailIds and match criteria, dryRun preview, max batch size).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_flagsA
Add or remove IMAP flags on multiple messages simultaneously. Use when the same flag change (e.g. \Seen, \Flagged) should apply to several messages. Accepts emailIds[] OR match+folder (XOR). Returns notApplied[] per message for flags the server silently dropped. Prefer update_message_flags for a single message when you need per-flag server verification.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Search criteria. XOR with emailIds. | |
| dryRun | No | ||
| folder | No | Source folder (required with match). | |
| emailIds | No | Explicit email IDs. XOR with match. | |
| flagsToAdd | No | IMAP flags to set, e.g. ["\\Seen", "\\Flagged"]. | |
| maxBatchSize | No | Maximum number of messages to process. Defaults to 500. Use to prevent runaway operations. | |
| flagsToRemove | No | IMAP flags to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint: false. The description adds valuable behavioral context: it discloses that the operation modifies flags, and importantly reveals the return behavior 'Returns notApplied[] per message for flags the server silently dropped.' This goes beyond the sparse annotation, though it does not mention potential side effects like runaway operations (covered in schema) or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each purposeful: purpose, usage, input constraints, and alternative. It is front-loaded with the main action and provides critical details without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 params, nested match object, no output schema), the description covers essential context: batch operation, XOR input modes, return behavior, and when to prefer the single-message alternative. It does not address edge cases like empty flag arrays or conflicting flagsToAdd/Remove, but it provides a solid operational picture.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (86%), so baseline is 3. The description adds key parameter semantics beyond the schema, notably the XOR relationship: 'Accepts emailIds[] OR match+folder (XOR).' It also clarifies flag format with an example. This adds meaning that is not obvious from individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Add or remove IMAP flags on multiple messages simultaneously.' It specifies the resource (IMAP flags) and the scope (multiple messages), and distinguishes itself from sibling tools like update_message_flags by emphasizing batch operations and the XOR input mode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: 'Use when the same flag change... should apply to several messages' and provides an explicit alternative: 'Prefer update_message_flags for a single message when you need per-flag server verification.' This clearly guides tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_update_labelsA
Add or remove Proton labels on multiple messages simultaneously. Use when the same label change should apply to several messages. Labels are IMAP folders under Labels/ namespace. Accepts emailIds[] OR match+folder (XOR).
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Search criteria. XOR with emailIds. | |
| dryRun | No | ||
| folder | No | Source folder (required with match). | |
| emailIds | No | Explicit email IDs. XOR with match. | |
| labelsToAdd | No | Labels to add, e.g. ["Labels/Work"]. | |
| maxBatchSize | No | Maximum number of messages to process. Defaults to 500. Use to prevent runaway operations. | |
| labelsToRemove | No | Labels to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations set destructiveHint to false, which aligns with the non-destructive nature of adding/removing labels. The description mentions the operation but does not detail behavioral aspects like idempotency, rate limits, or what happens with duplicate operations. With annotations covering the safety profile, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. Each sentence conveys essential information: purpose, when to use, and parameter constraint. It is front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 7 parameters, a nested object (match), and no output schema, the description adequately explains the two modes of operation and the maxBatchSize safeguard. It is complete enough for correct invocation, though more detail on return values or error cases could be added.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so most parameters are already described. The description adds value by explaining the XOR relationship between emailIds and match+folder, noting default maxBatchSize (500), and giving an example for labelsToAdd. This improves understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Add or remove Proton labels on multiple messages simultaneously.' It specifies the resource (labels) and action (add/remove), and distinguishes it from sibling tools like 'bulk_move'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance: 'Use when the same label change should apply to several messages.' It also explains the XOR constraint between emailIds and match+folder, helping the agent choose parameters. However, it does not explicitly advise against using for single messages.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_sendA
Cancel a send_email call that was queued because PROTONMAIL_SEND_DELAY_SECONDS is set. Only works while the item is still pending — once it has actually sent, this returns canceled: false. No effect (throws) if PROTONMAIL_SEND_DELAY_SECONDS is 0, since nothing is ever queued in that case.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id returned by a queued send_email call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite minimal annotations (only destructiveHint: false), the description discloses key behaviors: returns canceled: false if already sent, and throws when PROTONMAIL_SEND_DELAY_SECONDS is 0. It doesn't mention the success return value, but it covers edge cases well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences with no filler. The main action is front-loaded, and limitations are stated efficiently without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description covers the operation, edge cases, and error behavior. It lacks an explicit success return value, but the overall context is sufficiently complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the only parameter (id) with 100% coverage, and the description adds no additional parameter semantics. Baseline 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Cancel a send_email call that was queued', using a specific verb and resource. It also differentiates from sibling tools like cancel_snooze by referencing the PROTONMAIL_SEND_DELAY_SECONDS mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool (while the item is pending) and when not to use it (if delay is 0, it throws). It also clarifies the outcome if the item has already sent, giving clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_snoozeA
Wake a snoozed email immediately, moving it back to its original folder before wakeAt. No effect (throws) if the snooze has already woken or was already canceled.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The id returned by snooze_email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the destructiveHint=false annotation by explaining the side effect (moving back to original folder) and the error behavior (throws if no longer snoozed). This is transparent about state changes and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and includes necessary edge-case behavior in the second sentence. Every word adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one well-documented parameter and no output schema, the description fully covers what happens, when it throws, and the side effect. It is complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage for the single 'id' parameter, including a clear description ('The id returned by snooze_email'). The description does not add extra semantic detail, but none is needed because the schema is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Wake') and resource ('snoozed email'), and clarifies the action ('moving it back to its original folder before wakeAt'). It clearly distinguishes from the sibling tool 'snooze_email' by being its inverse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly implies when to use (when an email is currently snoozed and you want to wake it early) and provides an important boundary condition ('No effect (throws) if already woken or canceled'). However, it does not explicitly reference alternatives or mention that re-snoozing can be done with snooze_email.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_cacheA
Evict all in-memory caches: folder list, message metadata, and analytics data. Use when cached data appears stale after external mailbox changes (e.g. folders modified via Proton webmail). Does NOT affect the persistent SQLite index — use clear_index for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes behavioral effect (evicts caches) and context (stale data). Annotations declare destructiveHint=false, and description aligns, adding detail about what is destroyed (in-memory caches but not index). No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states action and scope, second gives usage guidance and sibling differentiation. Concise and front-loaded with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and clear annotations, the description is fully complete. It covers purpose, usage, and what it does not do, which is sufficient for agent decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema (0 params), so baseline is 4. Description does not need to add param info; it correctly implies no input required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action (evict all in-memory caches) and specifies the cache types (folder list, message metadata, analytics data). Distinguishes from sibling tool 'clear_index' by noting it does not affect the persistent SQLite index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: when cached data appears stale after external mailbox changes (e.g., via Proton webmail). Provides explicit exclusion: 'Does NOT affect the persistent SQLite index — use clear_index for that.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_indexADestructive
Delete the entire persistent SQLite mailbox index from disk. Use only to reset a corrupted or schema-incompatible index. After clearing, call sync_emails to rebuild. Irreversible — all indexed metadata and search history is lost. Does NOT clear in-memory caches — use clear_cache for that.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that the operation is irreversible, deletes all indexed metadata and search history, and specifically excludes in-memory caches. It also instructs the necessary follow-up action (sync_emails), providing full transparency about consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tightly written sentences, each earning its place: what, when, how to recover, and what it does not do. It is front-loaded with the core action and avoids any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this is a destructive irreversible action with no output schema, the description fully addresses the agent's needs: what exactly is deleted, under what circumstances to invoke, the irreversibility, and the required rebuild step. The sibling clear_cache is explicitly differentiated, leaving no ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter schema to elaborate on. The description nevertheless clarifies what the tool operates on (persistent SQLite index) and the irreversibility, which is sufficient for an agent to invoke without additional parameter context. Baseline 4 per rubric for zero-param tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Delete the entire persistent SQLite mailbox index from disk.' It clearly distinguishes the tool from sibling clear_cache by stating the scope is the persistent index, not in-memory caches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('reset a corrupted or schema-incompatible index') and provides alternatives: after clearing, call sync_emails to rebuild, and for in-memory caches use clear_cache. This is explicit when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
count_messagesARead-only
Count messages matching live IMAP search criteria without fetching message data. Use to preview how many results a search would return before running it. Prefer folder_stats for a simple unread/total count on one folder without filters.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by recipient address. | |
| from | No | Sender filter. | |
| label | No | Filter by folder label applied locally. | |
| query | No | Free-text filter. | |
| dateTo | No | Inclusive end date in ISO format. | |
| folder | No | Folder to count in. Defaults to INBOX. | |
| isRead | No | Read status filter. | |
| subject | No | Subject filter. | |
| dateFrom | No | Inclusive start date in ISO format. | |
| threadId | No | Filter by thread id, applied locally. | |
| isStarred | No | Starred status filter. | |
| sizeLarger | No | Only count messages larger than this size in bytes. | |
| sizeSmaller | No | Only count messages smaller than this size in bytes. | |
| senderDomain | No | Filter by sender domain, applied locally. | |
| hasAttachment | No | Filter by attachment presence. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, indicating no side effects. The description adds transparency by stating it counts without fetching message data, confirming lightweight behavior. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, extremely concise, front-loaded with key action and purpose. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but the description implies a count result. For a simple count tool, it adequately covers what the tool does and when to use it. Could explicitly state return value (number) but not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all 15 parameters documented. The description does not add specific parameter meaning beyond schema descriptions, only stating 'live IMAP search criteria' broadly. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool counts messages matching live IMAP search criteria, explicitly noting it does not fetch message data. It explains the purpose (preview count before running a search) and distinguishes from folders_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use (to preview how many results a search would return before running it) and when not to use (prefer folder_stats for simple unread/total count on one folder without filters), providing a clear alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_draftA
Save a new outbound message as a local draft in SQLite, optionally syncing it to the Proton Drafts IMAP folder. Use to compose and review before sending. Prefer create_reply_draft when replying to a specific emailId, or create_forward_draft when forwarding. Returns a draftId for later update, sync, or send via send_draft.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipient email addresses, comma-separated. | |
| to | No | Recipient email addresses, comma-separated. | |
| bcc | No | BCC recipient email addresses, comma-separated. | |
| body | Yes | Draft body. | |
| notes | No | Optional local note for the draft. | |
| isHtml | No | Whether the body should be HTML. | |
| replyTo | No | Optional reply-to email address. | |
| subject | Yes | Draft subject. | |
| priority | No | ||
| attachments | No | Attachments with base64 encoded content. | |
| syncToRemote | No | Whether to sync the draft to the Proton Drafts mailbox when IMAP is available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include destructiveHint=false, so description carries the burden. It discloses local SQLite persistence, optional sync to the Proton Drafts IMAP folder, and the return of a draftId for later operations, adding meaningful context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with action and storage, then usage, alternatives, and return value. Every sentence earns its place with no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description explains the draftId return and the draft lifecycle (update, sync, send). With a rich input schema and clear alternatives, the description is complete enough for correct tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 91%, so the schema handles most parameter meaning. The description adds context for sync behavior and return value but does not detail individual params; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Save a new outbound message as a local draft in SQLite', clearly distinguishing it from sibling tools. It also explicitly contrasts with create_reply_draft and create_forward_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use to compose and review before sending' and directs to specific alternatives for replying ('create_reply_draft') and forwarding ('create_forward_draft').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderA
Create a new mailbox folder via IMAP. Use 'Folders/' prefix for user folders and 'Labels/' for labels in Proton Bridge (e.g. 'Folders/Receipts'). Do NOT attempt to create system folders such as INBOX, Sent, Trash, Archive, or Spam. Returns the created path on success.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Full mailbox path. In Proton Bridge, user folders live under 'Folders/' and labels under 'Labels/'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint: false only. The description adds behavioral details: it creates a folder via IMAP, disallows system folders, and returns the created path on success. This adds context beyond the minimal annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding essential information: action, path conventions, prohibited folders, and return value. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 1-parameter tool with no output schema and minimal annotations, the description covers the key aspects: what it does, how to use it, constraints, and expected outcome. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by providing concrete path examples ('Folders/Receipts', 'Labels/') and warning against system folders, which enhances understanding beyond the schema's generic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: 'Create a new mailbox folder via IMAP.' It specifies the resource (mailbox folder) and distinguishes between user folders and labels using the 'Folders/' and 'Labels/' prefixes, which differentiates it from sibling tool 'create_label'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when not to use the tool (system folders) and how to construct paths (using 'Folders/' and 'Labels/' prefixes). It implies usage context (for user-created folders and labels) but does not explicitly name alternative tools like 'create_label'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_forward_draftA
Create a forward draft for an existing email, pre-filling the original message as quoted body and preserving its attachments. Use when you have an emailId and want to stage a forward for review before sending. Prefer forward_email to send immediately without saving. Returns a draftId for later update or send via send_draft.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients, comma-separated. | |
| to | Yes | Forward recipient list, comma-separated. | |
| bcc | No | BCC recipients, comma-separated. | |
| body | No | Optional message before the forwarded content. | |
| notes | No | Optional local note for the draft. | |
| isHtml | No | Store body as HTML. | |
| emailId | Yes | Original email id. | |
| attachments | No | Attachments with base64 encoded content. | |
| syncToRemote | No | Whether to sync the draft to the Proton Drafts mailbox when IMAP is available. | |
| includeAttachments | No | Include the original email's attachments in the draft. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint=false, so the description carries most of the behavioral burden. It discloses key behaviors: the original message is quoted, attachments are preserved unless configured otherwise, no immediate send occurs, and a draftId is returned for later update or send. This goes well beyond the annotation while remaining accurate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler. The primary action and key behavior are front-loaded, and the alternative and return value are each covered in one sentence, giving maximum signal per word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with no output schema and sparse annotations, the description covers the essential operational context: what the tool does, when to use it, the key alternative, and what it returns (draftId). It could mention the required recipient parameter or sync behavior, but those are already visible in the schema, so the description is sufficiently complete for correct tool selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters, establishing a baseline of 3. The description adds some context—'quoted body' clarifies how body relates to the original message, and 'preserving its attachments' gives meaning to includeAttachments—but it does not substantially enrich the parameter docs overall.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Create a forward draft'), a clear resource ('an existing email'), and core behaviors (pre-filling the original as quoted body, preserving attachments). It distinguishes this tool from forward_email by highlighting the staging-for-review purpose, so an agent can tell them apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: when you have an emailId and want to stage a forward before sending. It also names the alternative — 'Prefer forward_email to send immediately without saving' — giving a clear when-not-to-use condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_labelA
Create a Proton label (IMAP folder under Labels/ namespace). Idempotent — safe to call if the label may already exist. For folder creation use create_folder with a Folders/ prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Label name. The Labels/ prefix is optional and will be added automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=false annotation, the description adds idempotency context, though it does not cover potential error cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with clear, front-loaded information and zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description adequately covers purpose, safety, and alternative, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the schema already describes the parameter, and the tool description repeats the prefix behavior without adding new info. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a Proton label under the Labels/ namespace, distinguishing it from create_folder which creates folders under Folders/. The verb and resource are specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool vs the sibling create_folder, and notes idempotency implying safe re-call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reply_draftA
Create a reply draft for a specific email, pre-filling To, Subject, and quoted body from the original message. Use when you have an emailId and want to stage the reply for review before sending. Prefer create_thread_reply_draft when you only have a threadId. Prefer reply_to_email to send immediately. Returns a draftId.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Additional CC recipients, comma-separated. | |
| bcc | No | Additional BCC recipients, comma-separated. | |
| body | Yes | Reply body to prepend. | |
| notes | No | Optional local note for the draft. | |
| isHtml | No | Store body as HTML. | |
| emailId | Yes | Original email id. | |
| replyAll | No | Reply to all original recipients. | |
| attachments | No | Attachments with base64 encoded content. | |
| syncToRemote | No | Whether to sync the draft to the Proton Drafts mailbox when IMAP is available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=false. The description adds valuable behavioral context: pre-fills To/Subject/quoted body, stages reply for review (not sent), and returns a draftId. It stops short of explaining draft persistence or sync implications, but for a non-destructive draft tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no fluff. Purpose is front-loaded, followed by usage and return value. Every sentence contributes actionable information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite 9 parameters, the schema fully documents them. The description covers what the tool does, when to use it, key alternatives, and return value (draftId). This is complete enough for an agent to select and invoke correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 9 parameters with individual descriptions (100% coverage), so description doesn't need to re-articulate each parameter. It does add context around emailId's role ('original message') and that the body is prepended, but this is not a major addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action: 'Create a reply draft for a specific email, pre-filling To, Subject, and quoted body from the original message.' Distinguishes from siblings by explicitly naming create_thread_reply_draft (threadId) and reply_to_email (send immediately), so the tool's unique role is evident.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage conditions: 'Use when you have an emailId and want to stage the reply for review before sending' and gives direct alternative guidance: 'Prefer create_thread_reply_draft when you only have a threadId. Prefer reply_to_email to send immediately.' This is textbook when-to-use vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_templateA
Save a reusable email template. Subject and body may contain {{variable}} placeholders (e.g. {{firstName}}), auto-detected and stored on the template. Fails if a template with the same name already exists — delete it first to replace it.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Body text, may contain {{variable}} placeholders. | |
| name | Yes | Unique template name. | |
| isHtml | No | Whether body is HTML. | |
| subject | Yes | Subject line, may contain {{variable}} placeholders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint: false, which is minimal. The description compensates by disclosing key behaviors: placeholder auto-detection and storage, and failure on duplicate names. This adds meaningful context beyond the sparse annotation, though it does not mention return values or authentication.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose. The first sentence states what the tool does; the second adds important behavior and failure mode. There is no filler, tautology, or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple creation tool with full schema coverage, the description covers the essential elements: purpose, placeholder behavior, and duplicate handling. It does not explain return values, but no output schema exists and the tool's simplicity mitigates the need. It is sufficiently complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% description coverage for all four parameters, so the baseline is 3. The description adds a small behavioral note about placeholders in subject/body but does not materially enhance parameter semantics beyond the schema. It correctly leaves detailed parameter meaning to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Save a reusable email template', a specific verb+resource that clearly defines the tool's function. It distinguishes from sibling tools like list_templates, get_template, delete_template, and render_template by focusing on the creation action. Additional details about placeholders and uniqueness add clarity without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool (to save a new reusable template) and provides a practical guideline: it fails on duplicate names, so you must delete the existing template first to replace it. However, it does not explicitly name alternative tools or state when not to use this tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_thread_reply_draftA
Create a reply draft from a threadId, automatically selecting the latest inbound message to reply to. Use when you have a threadId from get_threads or get_actionable_threads and want to stage a reply for review. Prefer create_reply_draft when you already have a specific emailId. Returns a draftId for later update or send.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Additional CC recipients, comma-separated. | |
| bcc | No | Additional BCC recipients, comma-separated. | |
| body | Yes | Reply body to prepend. | |
| notes | No | Optional local note for the draft. | |
| isHtml | No | Store body as HTML. | |
| replyAll | No | Reply to all original recipients. | |
| threadId | Yes | Thread id from get_threads or get_actionable_threads. | |
| syncBefore | No | Refresh the local mailbox index from IMAP before resolving the thread. | |
| attachments | No | Attachments with base64 encoded content. | |
| syncToRemote | No | Whether to sync the draft to the Proton Drafts mailbox when IMAP is available. | |
| preferLatestInbound | No | Prefer replying to the latest inbound message in the thread. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond the destructiveHint annotation by explaining the automatic selection of the latest inbound message and the return of a draftId. However, it does not disclose potential side effects such as syncing to remote (though syncToRemote parameter implies this). With annotations only covering destructiveHint, the description provides moderate additional transparency but not comprehensive behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, then usage guidance, alternative, and return value. Every sentence adds value with no fluff, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 11 parameters and no output schema, the description covers key context: purpose, use case, alternative, selection behavior, and return value. It does not elaborate on all parameters or potential caveats, but with full schema coverage this is sufficient. Slightly incomplete due to lack of mention of sync behavior or error cases, but generally complete for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have descriptions in the schema (100% coverage), so the baseline is 3. The description aligns with the preferLatestInbound parameter by mentioning automatic selection of the latest inbound message, adding minimal extra meaning beyond schema. No significant parameter details are missing, but the description does not need to compensate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a reply draft from a threadId, with the specific behavior of automatically selecting the latest inbound message. It distinguishes itself from create_reply_draft by noting the preference when an emailId is available, and from other draft tools by its thread-based focus.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use when you have a threadId from get_threads or get_actionable_threads and want to stage a reply for review' and 'Prefer create_reply_draft when you already have a specific emailId.' This clearly states when to use the tool and when to use an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_draftADestructive
Permanently delete a locally saved draft from SQLite. Use to discard a draft you no longer need. Does NOT remove a matching draft from the Proton Drafts IMAP folder — that requires a separate mailbox action. Irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the 'destructiveHint' annotation, the description adds that the deletion is permanent and irreversible, and clarifies it only affects local SQLite storage, not the IMAP folder. This gives full behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, each serving a distinct purpose: stating the action, recommending usage, and clarifying limitations. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all necessary aspects: what it does, when to use, what it doesn't do, and irreversibility. With a single parameter fully documented, no output schema needed, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, draftId, is fully described in the schema with examples of where it comes from. The description does not add further parameter details, but schema coverage is 100%, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Permanently delete a locally saved draft from SQLite,' specifying the action, resource, and context. It distinguishes itself from sibling tools like delete_thread and trash_email by focusing on local drafts and noting it does not affect the IMAP folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises when to use ('Use to discard a draft you no longer need') and when not to use ('Does NOT remove a matching draft from the Proton Drafts IMAP folder — that requires a separate mailbox action'), providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailADestructive
Permanently delete a single email via IMAP expunge. Use only when certain the message is no longer needed. Prefer trash_email if recovery may be required. Prefer bulk_delete to delete multiple emails at once. Prefer delete_thread to delete all messages in a conversation. Irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| confirmed | No | Set to true to confirm this permanent deletion when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. Cannot be undone. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds critical behavioral context: 'Permanently delete', 'Irreversible', and 'via IMAP expunge' reveal the actual deletion mechanism. This clearly signals that the action cannot be undone, going beyond the annotation's generic destructiveness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is highly concise and front-loaded: the first sentence states the core purpose, followed by tightly worded usage guidelines and the final 'Irreversible' warning. Every sentence earns its place without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (2 params, no output schema), the description covers purpose, usage timing, alternatives, and irreversibility. Combined with the complete schema, the agent has all necessary context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents both parameters with detailed descriptions, including the composite format for emailId and the confirmation requirement for confirmed. The tool description adds no additional parameter-specific meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb ('delete'), resource ('a single email'), and method ('via IMAP expunge'). It distinguishes itself from sibling tools by explicitly naming alternatives like trash_email, bulk_delete, and delete_thread.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Use only when certain the message is no longer needed' and directly recommends alternatives: 'Prefer trash_email if recovery may be required', 'Prefer bulk_delete to delete multiple emails at once', and 'Prefer delete_thread to delete all messages in a conversation.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_folderADestructive
Delete an empty mailbox folder via IMAP. The folder must contain no messages — move or trash all messages first. Do NOT delete system folders (INBOX, Sent, Trash, Archive, Spam). Irreversible; messages already removed cannot be recovered this way.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Folder path to delete. | |
| confirmed | No | Pass true to confirm permanent deletion of the folder and all its messages. Required when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds important behavioral context: the operation is irreversible, limited to IMAP, and requires an empty folder. It also explicitly forbids system folders. This directly enhances transparency and aligns with the destructiveHint true flag.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: three sentences, each adding necessary information. The main action is front-loaded, and there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive folder deletion tool, the description covers all essential context: prerequisites (empty folder), restrictions (system folders), and consequences (irreversible). Combined with the schema's parameter descriptions and the destructiveHint annotation, the tool is fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% coverage with descriptions for both 'path' and 'confirmed'. The description does not add further detail about parameter semantics, so the baseline of 3 is appropriate given the high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'Delete an empty mailbox folder via IMAP'. It distinguishes from siblings like create_folder, rename_folder, and empty_folder by specifying the empty-folder requirement and the IMAP context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('The folder must contain no messages') and when not to use it ('Do NOT delete system folders'). It also provides actionable prerequisites ('move or trash all messages first'), which serves as clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_labelADestructive
Delete a Proton label (IMAP folder under Labels/ namespace). Deletes the label itself, not the messages — they remain in their other folders/labels. Irreversible. For deleting a folder use delete_folder with a Folders/ prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Label name to delete. The Labels/ prefix is optional and will be added automatically. | |
| confirmed | No | Pass true to confirm permanent deletion of the label. Required when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that the operation is irreversible, that messages are not deleted, and that the label is an IMAP folder under Labels/. This adds critical behavioral context that annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each providing essential information: what it does, the side effects on messages, and the alternative tool. No redundant wording, front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description covers the key aspects: the operation, irreversibility, message preservation, and alternative for folders. It is complete for an agent to safely use and select this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers both parameters with descriptions (name and confirmed), so the description does not need to add parameter details. The description mentions the Labels/ prefix handling, which is already in the schema. Baseline of 3 is appropriate at 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deletes a Proton label, specifying the exact resource and scope (Labels/ namespace). It also distinguishes itself from the sibling delete_folder by explicitly contrasting the target resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use this tool versus the alternative: 'For deleting a folder use delete_folder with a Folders/ prefix.' It also clarifies that the label itself is deleted, not the messages, which helps the agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_templateADestructive
Delete a saved email template.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The template id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations include destructiveHint: true, which already signals that the operation is destructive. The description adds that it deletes a 'saved' template, but this is a minor addition. It does not disclose side effects like permanence or whether the deletion can be undone, but with the destructive hint, the agent is aware of the risk.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one short sentence, front-loaded with the action, and contains no unnecessary words. It is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple deletion operation with one parameter and a destructive hint, the description is sufficiently complete. No output schema is present, so no return value explanation is needed. The parameter is fully documented, and the tool's purpose is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one parameter `id` with a description 'The template id,' providing 100% coverage. The description does not add any further detail about the parameter, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Delete' and the resource 'saved email template,' which clearly distinguishes it from sibling tools like create_template, list_templates, and get_template. It's not a tautology because it specifies that the template is 'saved.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or exclusions. However, the phrasing 'saved email template' implies that this tool is for deleting templates, not drafts or emails, so usage is implicitly clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_threadADestructive
Delete all messages in a thread, identified by RFC 5322 Message-ID header. permanent:true permanently expunges; false moves to Trash. Use when you have the raw Message-ID. Prefer apply_thread_action with action 'trash' or 'delete' when you have a local threadId from get_threads or get_actionable_threads.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | ||
| confirmed | No | ||
| messageId | Yes | RFC 5322 Message-ID. | |
| permanent | No | ||
| acrossFolders | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=true, and description expands by explaining the permanent parameter behavior (permanently expunges vs. moves to Trash). Also notes the tool is destructive by deleting all messages in the thread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first covers purpose and parameter behavior, second provides usage guidance. No extraneous content; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose and key parameter (permanent), but does not address dryRun, confirmed, or acrossFolders. For a destructive tool with 5 parameters, this leaves gaps. No output schema exists, but return values are not explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schemas description coverage is only 20% (only messageId described). Description adds meaning for the permanent parameter but does not explain dryRun, confirmed, or acrossFolders. While some value is added, it does not fully compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool deletes all messages in a thread using RFC 5322 Message-ID. Distinguishes from sibling tools like apply_thread_action by specifying when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool (when you have raw Message-ID) and when to prefer apply_thread_action (when you have local threadId from get_threads or get_actionable_threads).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
empty_folderADestructive
Permanently delete ALL messages in a folder at once. Use only when the goal is to clear an entire folder (e.g. emptying Trash or Spam). Only available when PROTONMAIL_ALLOW_EMPTY_FOLDER=true. Irreversible. Prefer bulk_delete when removing a subset of messages rather than everything in the folder.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | Folder path to empty (e.g. 'Trash', 'Spam'). | |
| confirmed | No | Must be true to execute. Call with confirmed:false first to see a preview of what would be deleted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint annotation, description adds 'Irreversible', 'Permanently delete', condition 'Only available when PROTONMAIL_ALLOW_EMPTY_FOLDER=true', and explains two-step process with confirmed parameter.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, front-loaded with main action. Every sentence adds value: purpose, usage, availability, and parameter guidance. No waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, destructive nature, and conditional availability, description fully covers purpose, guidelines, behavioral traits, and parameter usage. No need for output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% coverage, but description adds valuable context: folder path examples and explanation of confirmed parameter preview pattern, exceeding schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Permanently delete ALL messages in a folder at once' with specific verb and resource. Mentions alternatives like bulk_delete for subset removal, distinguishing from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use only when the goal is to clear an entire folder' and 'Prefer bulk_delete when removing a subset', providing clear when-to-use and when-not-to-use guidance with an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_emailA
Save a message's full raw source (RFC822/.eml) to disk. Use for backup or migrating a message elsewhere. Requires PROTONMAIL_ALLOW_FILE_DOWNLOAD_DIR to be configured, same as save_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format. | |
| outputPath | No | Optional file or directory path to write the .eml to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include destructiveHint=false, so the agent knows it is not destructive. The description adds valuable non-obvious context: the tool writes raw RFC822 content to disk and requires an environment variable to be set. It does not contradict annotations, and the extra behavioral details (e.g., .eml format, backup use) go beyond what structured fields provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and immediately providing use-case and configuration context. Every sentence adds value, and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter export tool with no output schema, the description covers purpose, use case, and a configuration prerequisite. It does not explicitly state what happens when outputPath is omitted, but the schema already marks it optional. Given the low complexity and strong schema coverage, the description is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes both parameters (emailId in FOLDER::UID format, outputPath as optional file/directory). The description does not add much parameter-specific semantics beyond mentioning the .eml extension and the environment variable requirement. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Save') and resource ('full raw source (RFC822/.eml)') and clearly states the intended use case ('backup or migrating a message elsewhere'). This distinguishes it from sibling tools like save_attachment (which saves only attachments) and import_email (which brings messages in).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('Use for backup or migrating a message elsewhere') and provides a critical prerequisite (PROTONMAIL_ALLOW_FILE_DOWNLOAD_DIR configured, same as save_attachment). It does not explicitly state when not to use it or compare against alternatives, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_document_threadsARead-only
Find email threads likely containing important document attachments such as invoices, contracts, travel confirmations, or calendar invites. Use to locate attachment-heavy threads by category without knowing the exact sender or subject. Prefer search_indexed_emails with hasAttachment:true for custom attachment queries beyond the built-in categories.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum threads to return. | |
| query | No | Optional filter across thread subjects and attachment names. | |
| category | No | Document category to prioritize. | document |
| syncBefore | No | Refresh the local mailbox index from IMAP before searching document threads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description does not add behavioral context such as side effects of syncBefore parameter (e.g., index refresh). With annotations present, the bar is lower, but the description provides no extra transparency beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero wasted words. The first sentence captures the core purpose; the second provides usage guidance and alternatives. Perfectly sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description should explain what the tool returns (e.g., thread IDs, metadata). It does not describe the return format. However, given the usage guidelines and parameter details, it is adequate for basic invocation. Could be more complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description lists example categories but adds no semantic detail beyond the schema definitions. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Find'), the resource ('email threads'), and the scope ('likely containing important document attachments...'). It distinguishes from siblings by noting it works without knowing exact sender or subject, and explicitly names an alternative tool for custom queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use ('locate attachment-heavy threads by category without knowing exact sender or subject') and when not to ('Prefer search_indexed_emails with hasAttachment:true for custom attachment queries beyond the built-in categories').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flag_threadA
Add or remove IMAP flags across all messages in a thread, identified by RFC 5322 Message-ID header. Use when you have the raw Message-ID and want to flag an entire conversation at once. Prefer apply_thread_action with action 'mark_read', 'mark_unread', 'star', or 'unstar' when you have a local threadId from get_threads.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | ||
| messageId | Yes | RFC 5322 Message-ID. | |
| flagsToAdd | No | ||
| acrossFolders | No | ||
| flagsToRemove | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include destructiveHint=false, which is consistent. Description adds that flags can be added or removed, but doesn't detail other behavioral traits like rate limits, side effects, or behavior when flags already exist. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no wasted words, front-loaded with purpose and usage guidelines. Highly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters and no output schema, the description provides usage context but omits details on dryRun (test mode) and acrossFolders scope. Return value not mentioned, but for a flag-modification tool, that may be acceptable. Moderate completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (only messageId has a description). The tool description does not explain dryRun, flagsToAdd, flagsToRemove, or acrossFolders. This leaves agents without crucial parameter context. Fails to compensate for low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the tool adds or removes IMAP flags across all messages in a thread using the Message-ID header. Distinguishes itself from sibling apply_thread_action by specifying when to use each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use this tool when you have the raw Message-ID and want to flag an entire conversation, and to prefer apply_thread_action with specific actions when you have a local threadId. Provides clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
folder_statsA
Return live message count, unseen count, uidNext, and uidValidity for a single mailbox folder. Use to check unread counts or folder health without fetching messages. Prefer count_messages when you need to apply filters (sender, subject, date). Prefer get_email_stats for an aggregate summary across all folders.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder path. Defaults to INBOX. | INBOX |
| scanLimit | No | Maximum messages to scan (1–20000, default 5000). Lower = faster but less accurate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the live nature, the fact that no messages are fetched, and the speed/accuracy tradeoff of scanLimit. It does not explicitly mention read-only or side-effect-free behavior, but 'without fetching messages' strongly implies it. This adds meaningful context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences: core function, use case, and explicit alternatives. Every sentence earns its place, with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter input and lack of output schema, the description provides return value names, use cases, alternatives, and performance tradeoffs. It is complete for a lightweight read-only stats tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters completely, including defaults and the speed/accuracy tradeoff. The description adds no new parameter-level detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns live message count, unseen count, uidNext, and uidValidity for a single mailbox folder. It distinguishes itself from sibling tools by specifying it does so without fetching messages.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool (checking unread counts or folder health) and provides alternatives: count_messages for filtered queries and get_email_stats for aggregate summaries. This is strong when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forward_emailADestructive
Immediately forward an existing email to new recipients, preserving original attachments and prepending an optional note. Use when you have an emailId and want to re-route the message without review. Prefer create_forward_draft to stage a forward for review first. Requires PROTONMAIL_ALLOW_SEND.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients, comma-separated. | |
| to | Yes | Forward recipient list, comma-separated. | |
| bcc | No | BCC recipients, comma-separated. | |
| body | No | Optional message before the forwarded content (plain text). | |
| dryRun | No | Preview recipients without sending. | |
| isHtml | No | Send body as HTML (ignored when markdownBody is provided). | |
| emailId | Yes | Original email id. | |
| fromName | No | Optional display name for the From header. | |
| confirmed | No | Set to true to confirm this irreversible send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. | |
| attachments | No | Attachments with base64 encoded content. | |
| markdownBody | No | Optional introductory note in Markdown. Rendered to HTML with body as plain-text fallback; takes precedence over body+isHtml. | |
| sanitizeHtml | No | Strip scripts and remote image beacons from HTML before delivery. Defaults to true. | |
| appendSignature | No | Append PROTONMAIL_SIGNATURE (if configured) after your note and before the forwarded content. Set false to send without it for this one message. | |
| attachmentParts | No | Forward only specific MIME part numbers, e.g. ["2", "3.1"]. Mutually exclusive with includeAttachments:false. | |
| includeAttachments | No | Include original attachments in the forward. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint: true, so the bar is lower. The description adds useful behavioral context by noting the action is immediate and without review, and states a permission requirement. It doesn't detail the confirmation prompt for irreversible sends, but that is already partially covered by the destructive hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste: function, usage trigger, and alternative/prerequisite. Information is front-loaded and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 15 parameters, full schema documentation, and a destructive annotation, the description provides adequate context: what it does, when to use, what to prefer, and a key permission. It doesn't detail return values, but no output schema exists and the schema covers parameters thoroughly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well documented there. The description adds minimal extra meaning by mentioning 'preserving original attachments' and 'optional note', but these are already reflected in schema parameters like includeAttachments and body/markdownBody. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'forward', the resource 'existing email', and key behaviors (preserving attachments, prepending optional note). It explicitly mentions the alternative create_forward_draft, distinguishing it from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when you have an emailId and want to re-route the message without review') and when to prefer an alternative ('Prefer create_forward_draft to stage a forward for review first'). Also mentions a prerequisite (PROTONMAIL_ALLOW_SEND).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_actionable_threadsARead-only
Return mailbox threads ranked by reply urgency, filtered to those requiring action. Use for daily triage to surface what needs a response from you. Supports pendingOn filter to distinguish threads waiting on you vs. them. Prefer get_inbox_digest for a broader summary including stale items. Prefer get_threads for an unranked thread list.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Require a normalized label on the thread. | |
| limit | No | Maximum threads to return. | |
| query | No | Free-text filter across subject, latest preview, senders, and labels. | |
| pendingOn | No | Filter by who the thread is currently waiting on. | any |
| syncBefore | No | Refresh the local mailbox index from IMAP before ranking threads. | |
| unreadOnly | No | Prefer threads with unread messages only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description is not required to reiterate safety. It adds context about ranking by urgency and filtering for action, but does not disclose deeper behavioral traits like indexing behavior or response format. With annotations covering the safety profile, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only three sentences, each with clear purpose: first sentence states the core function, second gives usage context, third references alternatives. No wasted words, front-loaded with the key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 6 parameters and no output schema, the description provides adequate context: what the tool does, when to use it, a key parameter (pendingOn), and sibling distinctions. It does not explain the return format or pagination, but with high schema coverage and read-only annotation, it is sufficiently complete for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds a small extra note about the pendingOn filter ('to distinguish threads waiting on you vs. them'), which reinforces the schema. However, it does not significantly extend understanding beyond the parameter descriptions, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return mailbox threads ranked by reply urgency, filtered to those requiring action' with a specific verb and resource. It distinguishes from siblings by naming get_inbox_digest and get_threads, explaining their different scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for daily triage to surface what needs a response from you' and provides alternative tools with reasons: 'Prefer get_inbox_digest for a broader summary including stale items' and 'Prefer get_threads for an unranked thread list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachment_contentARead-only
Fetch metadata for a specific email attachment and optionally return its base64-encoded content inline. Use when you need to read or process attachment data in-memory. Set includeBase64:false (default) to retrieve metadata only without loading the full payload. Prefer save_attachment to write the file to disk instead.
| Name | Required | Description | Default |
|---|---|---|---|
| saveTo | No | Relative path within PROTONMAIL_ALLOW_FILE_DOWNLOAD_DIR to save attachment to disk. Returns file path and size instead of inline base64. Requires env var to be set. Set PROTONMAIL_MAX_INLINE_BYTES (in KB, default 40) to configure the inline size threshold. | |
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| attachmentId | Yes | Stable attachment id returned by list_attachments. | |
| includeBase64 | No | Include base64 payload in the response. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the optional saveTo parameter that can write to disk, which implies side effects. However, the annotation declares readOnlyHint: true, suggesting no state change. This is a contradiction, as the tool can mutate disk state. Hence score 1 due to annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, every sentence adds essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description hints at return values for saveTo case. It could be more explicit about the metadata structure, but overall sufficient given sibling tools and context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, baseline 3. The description adds value by explaining the default for includeBase64, the need for environment variable for saveTo, and configuring inline size threshold. This goes beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch metadata for a specific email attachment and optionally return its base64-encoded content inline,' which is a specific verb+resource. It distinguishes itself from siblings like save_attachment and list_attachments by mentioning when to use the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use when you need to read or process attachment data in-memory' and 'Prefer save_attachment to write the file to disk instead,' providing clear context and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attachment_textARead-only
Extract plain text from a text-like attachment (text/plain, text/csv, text/markdown, application/json, application/xml, text/html stripped of markup, text/calendar summarized) without dealing with base64 encoding. Not gated by the smaller inline-base64 size limit that get_attachment_content uses — bounded separately at 512KB of raw content. Fails clearly for non-text formats (e.g. PDF, images) — use get_attachment_content or save_attachment for those.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| attachmentId | Yes | Stable attachment id returned by list_attachments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description adds substantial behavioral context: supported MIME types, HTML stripping, calendar summarization, a 512KB raw-content limit, and clear failure for non-text formats. This goes well beyond what annotations provide and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose, followed by highly relevant details about size limits, format compatibility, and alternatives. Every sentence contributes meaningful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description fully covers what it does, supported formats, limits, and failure modes. It also references sibling tools for fallback, making it self-sufficient for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; both emailId and attachmentId are already described with formats and sources. The description adds no further parameter-specific details, so the baseline score of 3 is appropriate since the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Extract plain text from a text-like attachment' with a specific verb and resource. It further distinguishes itself from get_attachment_content by mentioning the base64 handling and size-limit differences, making its unique role clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: use for text-like attachments, when avoiding base64 encoding, and when the attachment exceeds the inline-base64 size limit. It also names alternatives (get_attachment_content or save_attachment) for non-text formats, and states the 512KB bound.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_audit_logsARead-only
Return recent entries from the persistent on-disk audit log of all write operations performed by this server. Use to review what mutations (sends, moves, deletes, draft operations) were executed across sessions. Prefer get_logs for debugging in-session behavior and transient connection errors.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | Number of records to skip for pagination. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds useful behavioral context: the log is persistent, on-disk, spans sessions, and records write operations (sends, moves, deletes, drafts). It does not contradict the annotation. No mention of return format or ordering, but enough safety/behavior context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, use case, and explicit alternative. Front-loaded and every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity read-only listing tool with readOnlyHint annotation and pagination params in schema, the description covers purpose, scope, persistence, and sibling differentiation. It does not describe return fields, but the absence of an output schema is partially mitigated by the clear 'entries' language and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: only offset has a description. The tool description does not elaborate on limit/offset, but offset is self-documented in the schema and limit has a default. This is adequate but adds no meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return recent entries from the persistent on-disk audit log of all write operations performed by this server.' It clearly distinguishes this from sibling tools by contrasting with get_logs for in-session debugging.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use for reviewing mutations across sessions, and explicitly says 'Prefer get_logs for debugging in-session behavior and transient connection errors.' This names an alternative and gives exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_connection_statusARead-only
Check whether Proton Bridge SMTP and IMAP are reachable and return authentication status for each. Use to diagnose connectivity before sending or syncing, or when tools return connection errors. Returns individual pass/fail for each protocol, plus this server's own version and entrypoint path — check these first if behavior doesn't match the latest release notes; an old/orphaned install elsewhere on disk can silently shadow an upgrade. Prefer run_doctor for a full end-to-end health check including index integrity.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint=true already covers the read-only nature, the description reveals return contents (individual pass/fail per protocol), the server version and entrypoint path, and a subtle diagnostic warning about orphaned installs shadowing upgrades. This adds meaningful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: purpose, use cases, return values, version-check guidance, and an alternative tool. The most actionable information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read-only diagnostic with no output schema, the description fully explains what it returns, why it matters, when to call it, and when not to. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is nothing to document. Per the no-parameter baseline this is a 4; the description appropriately spends no space on parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Check whether Proton Bridge SMTP and IMAP are reachable'. It clearly differentiates this diagnostic from the sibling run_doctor tool by name, so an agent can distinguish it without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it: 'before sending or syncing, or when tools return connection errors.' It also names the alternative run_doctor and the condition for preferring that tool, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactsARead-only
Return the most frequently contacted email addresses ranked by interaction volume within the analytics sample window. Use to identify key correspondents or to pre-populate recipient lists. Reads from the local index (auto-refreshed if stale or empty) — reflects the last sync. Note: results are frequency-derived from recent email history, not a Proton contacts address book.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum contacts to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds context that it reads from a local index (auto-refreshed if stale or empty) and reflects the last sync. This explains the data source and freshness behavior beyond the annotation. It also clarifies that results are frequency-derived, not from an address book, adding transparency about data provenance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the primary function, then usage, then data source caveats. Every sentence adds value, with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional param), the description covers purpose, usage, behavioral traits (read-only, auto-refresh), and caveats. It lacks explicit return format info, but no output schema exists and the tool is simple enough that this is not critical. It effectively compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage with a single 'limit' parameter that has a default and description ('Maximum contacts to return'). The description does not add extra semantics beyond that, but since the schema is self-explanatory, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: returns the most frequently contacted email addresses ranked by interaction volume within the analytics sample window. It distinguishes itself from sibling tools like top_senders and search tools by specifying frequency-derived ranking and usage for identifying key correspondents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use to identify key correspondents or to pre-populate recipient lists,' which provides clear context for when to use it. However, it does not explicitly state when NOT to use it or alternatives, though the note about not being a Proton contacts address book implicitly warns against using it for address book purposes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_draftARead-only
Fetch the full content of a single locally saved draft by its draftId. Use to read or verify a draft before sending or updating. Prefer list_drafts to discover draftIds first. Does NOT fetch drafts from the Proton server — use list_remote_drafts for those.
| Name | Required | Description | Default |
|---|---|---|---|
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, but the description adds critical context: the tool only fetches locally saved drafts, not from the Proton server. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each adding essential information with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only fetch tool with one parameter, the description fully covers purpose, usage context, and behavioral boundaries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter draftId is described in the schema with 100% coverage; the description adds minimal extra value beyond listing sources, but overall it is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Fetch' and the resource 'full content of a single locally saved draft', distinguishing it from sibling tools like list_drafts (which discover IDs) and list_remote_drafts (server drafts).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (read/verify before sending/updating), recommends prior use of list_drafts, and directly contrasts with list_remote_drafts for server drafts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_analyticsARead-only
Generate sampled mailbox analytics including top senders, busiest hours of day, and volume breakdown by folder. Use for productivity insights and communication pattern analysis. Prefer get_email_stats for a fast aggregate count summary. Prefer get_volume_trends for per-day message volume history. Reads from the local index (auto-refreshed if stale or empty), not live IMAP — reflects the last sync.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing days window. | |
| limit | No | Maximum messages to sample. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include readOnlyHint: true, and the description adds significant context: 'Reads from the local index (auto-refreshed if stale or empty), not live IMAP — reflects the last sync.' This explains data source and staleness, going beyond the annotation to clarify behavioral nuances. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (five sentences) and front-loaded with the core purpose. Each sentence adds value: output definition, use cases, alternatives, and data source/behavior. No fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity with 2 parameters (both documented), no output schema, and clear output description (top senders, busiest hours, volume by folder). The description explains what it returns and its data source, making it fairly complete. Minor gap: it does not specify sampling behavior details or formatting, but that is not critical for an analytics summary tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—both 'days' and 'limit' have descriptions in the schema. The description does not explicitly explain these parameters, but since the schema already provides meaning, a baseline score of 3 is appropriate. No additional semantic value is added beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Generate sampled mailbox analytics including top senders, busiest hours of day, and volume breakdown by folder.' It specifies the resource (mailbox analytics) and the exact outputs, and distinguishes from sibling tools by naming alternatives (get_email_stats, get_volume_trends).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use for productivity insights and communication pattern analysis' and directs away from alternatives: 'Prefer get_email_stats for a fast aggregate count summary. Prefer get_volume_trends for per-day message volume history.' This clearly tells when to use this tool versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_by_idARead-only
Fetch the full content of a single email using a composite emailId. Use after get_emails or search_emails to read a specific message in full. The emailId format is FOLDER::UID — always use the id returned by a prior tool call; do not construct it manually. Response includes a security block (dkim/spf/dmarc pass-fail, Proton's spam score/action, and encryption metadata) for phishing/legitimacy triage.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id from previous tool output. | |
| preferHtml | No | Return raw HTML body instead of plain-text stripped version. | |
| showHeaders | No | Include the full raw header map (from/to/content-type/dkim-signature/list/received/...) in the response. Off by default to avoid token bloat — turn on only when you need a specific header not already surfaced elsewhere (e.g. list.unsubscribe). | |
| maxBodyLength | No | Truncate body at this many characters (1–500000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true, setting the safety baseline. The description adds valuable behavioral context: the response includes a security block (dkim/spf/dmarc pass-fail, Proton's spam score/action, encryption metadata) for phishing triage. It also warns about not constructing the emailId manually. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tightly written sentences. The first states the action, the second gives usage context, and the third discloses the security block. Every sentence earns its place with zero redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and no output schema, the description covers the key facets: the composite ID format, usage sequence, and the security block in the response. It could be more explicit about the full return structure (e.g., standard email fields), but 'full content' plus the detailed schema descriptions for preferHtml and showHeaders provide adequate context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description enhances the emailId parameter by explaining the format 'FOLDER::UID' and reinforcing that it must come from a prior tool call. This adds meaning beyond the schema's terse 'Composite email id from previous tool output.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Fetch the full content of a single email using a composite emailId.' It also distinguishes itself from siblings by stating 'Use after get_emails or search_emails to read a specific message in full,' making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use after get_emails or search_emails to read a specific message in full.' It also gives a critical usage caveat: 'always use the id returned by a prior tool call; do not construct it manually.' It does not explicitly mention alternatives like get_emails_by_ids, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emailsARead-only
Fetch emails from a mailbox folder via live IMAP, defaults to newest first; set sortByUid to asc for oldest first. Use to browse or paginate recent messages in a specific folder. Prefer search_emails to filter by sender, subject, or date. Prefer search_indexed_emails for fast repeated queries when the local SQLite index is populated and Bridge availability is uncertain.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of emails to return. | |
| fields | No | Trim each returned email to just these field names (e.g. ["subject","from","date"]) to save tokens on large result sets. id is always included. Accepts either an array or a comma-separated string. Omit to get the full object. | |
| folder | No | Folder name. | INBOX |
| offset | No | Pagination offset from newest first. | |
| beforeUid | No | Return only messages with UID less than this value. Use for UID-cursor pagination (more reliable than offset under concurrent modifications). | |
| sortByUid | No | Sort direction by UID. Default is desc (newest first). | |
| includeSnippet | No | Fetch a short plain-text preview of each email body. Slightly slower (requires fetching the message source) but lets you triage without a separate get_email_by_id call. Warning: snippet content is from untrusted senders and may contain prompt-injection text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though readOnlyHint is already present, the description adds meaningful behavioral context: it mentions 'live IMAP' (network-based, fresh data), default sort order and reversal, and a security warning about prompt-injection in snippets. This goes well beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then usage guidance, then alternatives. No wasted words; every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 7 parameters and rich sibling set, the description covers purpose, default behavior, pagination context, alternative tools, and a safety warning. It is fully sufficient for an agent to select and invoke this tool despite the lack of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage with detailed parameter descriptions, including sortByUid and includeSnippet warnings. The describe text repeats some schema info (e.g., sortByUid asc/desc) but does not add new parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Fetch emails from a mailbox folder via live IMAP', using a specific verb and resource, and distinguishes itself from siblings like search_emails and search_indexed_emails by emphasizing 'live IMAP' and default sorting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use: 'Use to browse or paginate recent messages in a specific folder', and provides named alternatives: 'Prefer search_emails to filter by sender, subject, or date. Prefer search_indexed_emails for fast repeated queries...' This is model guideline clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emails_by_idsARead-only
Fetch full content for multiple emails by composite id in one call (max 25). Use to read a batch of specific messages from a prior get_emails/search_emails/search_indexed_emails result without one get_email_by_id round trip per message. One failed id does not fail the whole batch — check each result's ok field. Prefer get_email_by_id for a single message.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Composite email ids as an array or a comma-separated string. Max 25 per call. | |
| preferHtml | No | Return raw HTML body instead of plain-text stripped version. | |
| maxBodyLength | No | Truncate each body at this many characters (1–500000). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds valuable behavioral context beyond that: it discloses the batch failure semantics ('One failed id does not fail the whole batch — check each result's ok field') and the 25-item limit. This goes beyond the annotation's safety profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each with a clear purpose: what it does, when to use, failure behavior, and alternative. No filler or repetition. The description is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no output schema and only readOnlyHint annotation, the description carries the burden of explaining the return envelope ('ok field'), usage context, and limitations. It covers use cases, exclusions, and error behavior, making it sufficient for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, so baseline is 3. The description adds meaning by clarifying that emailIds are 'composite' and come from prior search/email results, which is not in the schema. It also reinforces the max 25 constraint. However, it does not add detail for preferHtml or maxBodyLength beyond their schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and resource ('full content for multiple emails by composite id'), clearly distinguishing it from siblings like get_email_by_id (single) and search tools (search vs fetch by id). The phrase 'in one call (max 25)' adds precise scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Use to read a batch of specific messages from a prior get_emails/search_emails/search_indexed_emails result' and explicitly recommends an alternative: 'Prefer get_email_by_id for a single message.' This is clear, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_statsARead-only
Return aggregate mailbox statistics: folder message counts, total unread counts, and a brief analytics sample. Use for a quick mailbox health overview. Prefer get_email_analytics for richer breakdowns such as top senders and hourly patterns. Prefer get_volume_trends for time-series daily volume data. Reads from the local index (auto-refreshed if stale or empty), not live IMAP — reflects the last sync, so read/unread counts can lag a change made from another client. Unread counts specifically can also lag a flag change (e.g. \Seen set shortly after send) until that message's folder is next fully synced.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Trailing days window. | |
| limit | No | Maximum messages to sample. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral traits: it reads from the local index rather than live IMAP, auto-refreshes if stale or empty, and may lag behind changes made in another client. It also explains the specific lag condition for unread counts, adding substantial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then gives usage guidance, then adds necessary caveats about data freshness. Every sentence earns its place; there is no redundant filler or repetition of schema information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with two optional parameters and no output schema, the description is complete: it explains what is returned, when to use it, what alternatives exist, and the data-source caveats that affect interpretation. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes both parameters with 100% coverage: 'days' as 'Trailing days window' and 'limit' as 'Maximum messages to sample.' The description does not add parameter-level meaning beyond this, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return aggregate mailbox statistics: folder message counts, total unread counts, and a brief analytics sample.' It clearly distinguishes itself from sibling tools by explicitly naming get_email_analytics and get_volume_trends as richer alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to use this tool ('Use for a quick mailbox health overview') and explicitly directs users to alternatives: 'Prefer get_email_analytics for richer breakdowns... Prefer get_volume_trends for time-series daily volume data.' This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_foldersARead-only
Return all mailbox folders with message counts and unseen counts from the live IMAP session. Use to discover available folder names before targeting get_emails, move_email, or create_folder. Prefer sync_folders to force a fresh fetch when the folder list appears stale. Folders with noselect:true cannot be used for IMAP operations.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description doesn't need to reinforce that. It adds valuable behavioral context: returns message and unseen counts, from live IMAP session, and warns about noselect folders. Could mention if data is cached, but 'live' implies fresh.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no extraneous information. Efficiently covers purpose, usage, and caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description fully explains the tool's return value, use cases, and relevant constraint (noselect folders). Sufficient for agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema; schema coverage is 100% trivially. Description does not need to add param info. Baseline 4 for zero parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Return all mailbox folders with message counts and unseen counts from the live IMAP session.' It specifies the verb (return), resource (mailbox folders), and output details (counts). It also distinguishes from sibling tools like sync_folders and folder_stats.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: 'Use to discover available folder names before targeting get_emails, move_email, or create_folder. Prefer sync_folders to force a fresh fetch when the folder list appears stale.' Provides clear when-to-use and alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_follow_up_candidatesARead-only
Return threads that appear overdue for follow-up based on age and pending-on state. Use when looking for outbound messages you sent that haven't received a reply, or to surface stale inbound threads. Prefer get_actionable_threads for threads where someone is currently waiting on you.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum candidate threads to return. | |
| pendingOn | No | Which side the candidate thread should be waiting on. | you |
| syncBefore | No | Refresh the local mailbox index from IMAP before selecting candidates. | |
| minAgeHours | No | Minimum thread age in hours. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark the tool as readOnlyHint=true, so the description does not need to reiterate safety. It adds value by explaining the selection criteria (age and pending-on state) and the syncBefore parameter refreshes the index. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences that front-load the purpose and usage guidance. Every sentence is necessary and informative, with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 optional parameters, no output schema, and annotations indicating a read-only operation, the description covers core functionality and usage context well. It lacks details on output format, but for a filter-and-list tool this is acceptable. The description is complete enough for effective use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds extra context for 'syncBefore' ('Refresh the local mailbox index from IMAP') and 'pendingOn' enum values, enhancing understanding beyond the schema. Baseline 3 plus additional value yields a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns threads overdue for follow-up based on age and pending-on state. It uses specific verbs and distinguishes itself from the sibling 'get_actionable_threads', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'looking for outbound messages you sent that haven't received a reply, or to surface stale inbound threads.' Also provides a clear alternative: 'Prefer get_actionable_threads for threads where someone is currently waiting on you.' This gives excellent guidance on tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_inbox_digestARead-only
Return a structured inbox summary: unread counts, top actionable threads, and overdue threads where a reply is pending from you. Use as the starting point for an inbox review session to get an at-a-glance picture. Prefer get_actionable_threads for a deeper, filterable list of threads needing action.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum threads per digest section. | |
| syncBefore | No | Refresh the local mailbox index from IMAP before building the digest. | |
| minAgeHours | No | How old a thread must be before it is considered stale waiting on you. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description carries a lower burden. It adds value by describing the output structure (unread counts, actionable/overdue threads) and mentions the syncBefore parameter behavior, supplementing annotations with useful context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. First sentence describes what the tool returns, second gives usage guidance. Efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description adequately explains the return value (unread counts, top actionable threads, overdue threads) and the syncBefore parameter behavior. For a summary tool with three parameters, this is complete and sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add any parameter-specific meaning beyond what the schema already provides; it focuses on the tool's purpose and output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns a structured inbox summary with unread counts, top actionable threads, and overdue threads. It distinguishes itself from the sibling tool get_actionable_threads by positioning itself as the starting point for an inbox review.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides usage guidance: 'Use as the starting point for an inbox review session' and recommends get_actionable_threads for deeper filtering, giving clear context for when to use this tool vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_index_statusARead-only
Return metadata about the local SQLite email index: row count, last sync timestamp, index schema version, and per-folder coverage. Use to verify the index is fresh and complete before querying it with search_indexed_emails or get_threads. If the index is empty or stale, call sync_emails first.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already communicates the read-only nature. The description adds useful behavioral context about what metadata is returned and the condition for using sync_emails first. It does not disclose potential error conditions or exact output format, but for a simple read-only metadata tool, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, tightly structured, and front-loaded with the key output. Every sentence adds value: what it returns, when to use it, and what to do in a specific condition. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description is complete. It covers the tool's function, provides usage context, and includes conditional logic for handling an empty or stale index. The context signals confirm its simplicity, and the description fully compensates for the lack of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty (100% coverage by default). The description doesn't need to explain parameters, and the baseline for zero-parameter tools is 4. It adds value by describing the returned metadata fields, which is more relevant than parameter info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: returning metadata about the local SQLite email index, listing specific fields (row count, last sync timestamp, schema version, per-folder coverage). It distinguishes itself from sibling tools like search_indexed_emails and sync_emails by positioning itself as a pre-query verification step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use to verify index freshness before querying with search_indexed_emails or get_threads, and call sync_emails first if the index is empty or stale. This clearly articulates when to use it and how it relates to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_labelsARead-only
Return normalized Proton folders and labels from the local mailbox index, including message counts per label. Use to enumerate available labels before filtering with search_indexed_emails or get_threads. Prefer get_folders for live IMAP folder counts when the index may be stale.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum labels to return. Capped at 250; use get_folders for the complete live folder list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint true; description adds that it uses local index (potential staleness) and includes message counts, with a limit cap. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences front-loading purpose, usage, and alternative. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no output schema, the description fully covers purpose, behavior, and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of the single parameter limit, including cap and alternative suggestion. Description doesn't add new parameter info beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it returns normalized Proton folders/labels from local index with counts. Explicitly distinguishes from get_folders for live counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directs when to use: before filtering with search_indexed_emails or get_threads. Warns to prefer get_folders for live counts when index may be stale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsARead-only
Return recent in-memory server log entries, filterable by level (debug, info, warn, error). Use to diagnose unexpected tool behavior or connection errors during the current session. Logs are ephemeral and not persisted across server restarts — use get_audit_logs for a persistent audit trail of write operations.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | ||
| limit | No | ||
| offset | No | Number of records to skip for pagination. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks it as read-only, and the description adds important context: logs are ephemeral and not persisted across restarts. This is valuable beyond the annotation, though it does not cover details like log rotation or memory limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long, front-loaded with the main purpose, then the usage context, then a caveat and alternative. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with no required parameters and no output schema, the description covers purpose, when to use it, the ephemeral nature of logs, and directs users to the persistent alternative. This is fully sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is low (only offset has a description, level has an enum, limit just has a default). The description repeats the level enum values but provides no additional meaning for limit or offset, leaving a gap in parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Return recent in-memory server log entries,' which is a specific verb+resource construction. It also explicitly distinguishes itself from get_audit_logs, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool ('Use to diagnose unexpected tool behavior or connection errors during the current session') and explicitly names an alternative for persistent logs ('use get_audit_logs').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_runtime_statusARead-only
Return the server's current runtime state: policy flags (read-only, allow-send, allowed actions), background sync schedule and last-run time, IMAP IDLE watch state, draft store statistics, and local index freshness. Use to understand how the server is configured and whether sync is actively running. Prefer get_connection_status for protocol reachability only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description enumerates the specific runtime state fields returned, adding behavioral details beyond the readOnlyHint annotation. It discloses that the tool is a read operation returning configuration and sync status, with no destructive effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first lists the returned information, the second gives usage guidance. Every sentence is essential and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description lists the categories of state returned, providing enough context for an agent to understand the output. No additional detail is needed for this simple zero-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so the description cannot add parameter semantics. In this case a baseline of 4 is appropriate; no param info is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' and clearly identifies the resource 'server's current runtime state'. It enumerates the types of state information included, and distinguishes from the sibling tool get_connection_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('understand how the server is configured and whether sync is actively running') and when to prefer an alternative ('Prefer get_connection_status for protocol reachability only'), providing clear decision guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateARead-only
Get a single saved email template by id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The template id, as returned by create_template or list_templates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the read-only nature, so the description adds little beyond 'saved' and 'by id'. It does not disclose behavior on missing IDs, error handling, or the exact return structure, but remains consistent with the annotation without contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It front-loads the verb and resource, making it concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter getter, the description covers the core purpose and scope. It does not mention what happens if the template is not found or the response format, but given the readOnlyHint and the simple nature, it is largely complete. Slightly brief but adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has full coverage for the single 'id' parameter, including a helpful description referencing create_template and list_templates. The tool description itself adds no parameter details, but the schema sufficiently documents it, meeting the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and the resource 'single saved email template by id', making it distinct from list_templates (plural) and create/delete operations. It is specific and immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage—fetching a template by its ID—but does not explicitly mention when to use it instead of alternatives like list_templates or render_template. No exclusions or alternate scenarios are provided, leaving usage to be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_briefARead-only
Return a summarized view of a single thread: latest inbound message preview, latest outbound preview, attachment list, and a recommended next action. Use for a quick status check on a specific thread without reading every message. Prefer get_thread_by_id when you need the full raw thread data and all messages.
| Name | Required | Description | Default |
|---|---|---|---|
| threadId | Yes | Thread id from get_threads or get_actionable_threads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds that it provides a summarized view and avoids reading all messages, implying lightweight read operation. No contradictions. Additional detail about non-modification could be included but not required.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences: first states what it returns, second states usage context. No wasted words, front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one parameter and no output schema, the description sufficiently covers purpose, usage, and content. Could optionally specify that no pagination is needed but not required for completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already has 100% description coverage for the single parameter (threadId). The tool description does not add extra detail beyond the schema, meeting the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns a summarized view of a single thread and lists specific components (inbound/outbound preview, attachments, recommended action). It differentiates from the sibling get_thread_by_id by indicating that tool provides full raw data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends use for quick status checks without reading every message and directs to use get_thread_by_id for full raw data. Provides clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_thread_by_idARead-only
Fetch the complete normalized thread record from the local index, including all messages, participants, labels, and full metadata. Use when you need all messages in a thread. Prefer get_thread_brief for a summarized quick view that avoids returning the full message list.
| Name | Required | Description | Default |
|---|---|---|---|
| folders | No | Optional folders to scope thread search. Searches all folders when omitted. | |
| threadId | Yes | Thread id from get_threads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description doesn't need to restate safety. However, it adds valuable context: the data comes from a 'local index' (implying cached or indexed state) and describes the return content in detail. This adds behavioral insight beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: first states the action and scope, second provides usage guidance. No fluff, front-loaded, every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description fully explains what is returned (all messages, participants, labels, full metadata) and gives clear usage context. For a fetch tool with read-only annotations, this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (both parameters documented), so baseline is 3. The description adds subtle value by specifying that 'threadId' comes from 'get_threads' (source context) and that 'folders' can scope the search. This enriches the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'Fetch the complete normalized thread record from the local index' with specific resource and scope, and distinguishes from sibling 'get_thread_brief' by noting the alternative returns a summarized view. This provides clear purpose and differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance: 'Use when you need all messages in a thread. Prefer get_thread_brief for a summarized quick view that avoids returning the full message list.' This gives clear when-to-use and when-not-to-use, with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadsARead-only
Return normalized email threads from the local mailbox index, grouping individual messages into conversations by subject and participants. Use to view mail as threads rather than individual messages. Note: searches subject and participants only — use search_indexed_emails to search body content. Prefer get_actionable_threads when you want threads prioritized by reply urgency. Prefer get_inbox_digest for an executive-summary view.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Require a normalized label on the thread. | |
| limit | No | Maximum threads to return. | |
| query | No | Free-text filter across subject, participants, and labels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, and the description adds useful behavioral context: grouping by subject/participants, reliance on 'the local mailbox index', and the limitation that only subject and participants are searched. There is no contradiction with annotations, and the added detail goes beyond the basic safety hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary purpose, and each sentence provides distinct, non-redundant information: the core function, the general usage context, and alternative tool recommendations. It is concise and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, read-only annotation, and the presence of siblings, the description covers purpose, field scope, usage alternatives, and prioritization guidance. No output schema exists, but the description sufficiently equips an agent to invoke the tool correctly without further clues.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters have schema descriptions, so the baseline is 3. The description adds meaningful semantic context by clarifying that body content is not searched, which supplements the query parameter description and helps agents avoid misusing the tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return'), a clear resource ('normalized email threads'), and explains the grouping behavior ('by subject and participants'). It effectively distinguishes the tool from siblings by explicitly naming search_indexed_emails, get_actionable_threads, and get_inbox_digest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('Use to view mail as threads rather than individual messages'), when to use alternatives ('use search_indexed_emails to search body content'), and when to prefer two specific siblings for other needs (urgency, executive summary). This is explicit usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unsubscribe_infoARead-only
Read the List-Unsubscribe header of a message and report how to unsubscribe from it — a mailto address, an https link, or both. Does not take any action. Use before unsubscribe_sender to see what's available, or to hand an https link to the user/agent to open manually (this server never auto-fetches unsubscribe URLs).
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id from previous tool output. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds key behavioral context: it 'does not take any action' and the server 'never auto-fetches unsubscribe URLs.' This tells the agent exactly what side effects to expect and prevents overreach. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary action, and every clause earns its place. There is no fluff or repetition of schema details, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with one required parameter and no output schema, the description fully covers the return value possibilities (mailto, https, or both), the non-mutating behavior, and usage scenarios. It gives the agent everything needed to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the only parameter, emailId, as a composite id from previous tool output. The description does not add extra semantic detail about the parameter, so it relies entirely on the schema. Per the rubric, with 100% schema coverage, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: reading the List-Unsubscribe header and reporting how to unsubscribe (mailto, https, or both). It uses a specific verb ('Read') and names the resource, and it distinguishes this from the sibling tool 'unsubscribe_sender' by explicitly noting it takes no action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: use before 'unsubscribe_sender' to see available options, or to pass an https link to the user/agent for manual opening. It also mentions the server never auto-fetches URLs, which clarifies when this tool is appropriate. This is a model of clear when-to-use advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_volume_trendsARead-only
Return daily inbound and outbound message counts for a trailing window. Use to spot volume spikes, identify quiet periods, or track communication trends over time. Prefer get_email_analytics for sender-level breakdowns and hourly patterns. Reads from the local index (auto-refreshed if stale or empty), not live IMAP — reflects the last sync.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of trailing days to include. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read, and the description adds meaningful behavioral context: it reads from the local index, auto-refreshes if stale or empty, and does not hit live IMAP, so results reflect the last sync. This goes beyond the annotation and helps set expectations about data freshness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler: purpose first, then use cases, then data-source caveat and alternative. Every sentence earns its place and the structure is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter, read-only tool with no output schema, the description is complete: it states the return value (daily inbound/outbound counts), the trailing-window scope, when to use it, and the data-source behavior. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'days' is fully documented in the schema with a default and description. The tool description does not add extra meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return daily inbound and outbound message counts for a trailing window.' It clearly states what the tool does and differentiates it from the sibling get_email_analytics by noting that tool handles sender-level breakdowns and hourly patterns.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use cases are provided: 'spot volume spikes, identify quiet periods, or track communication trends over time.' It also gives an explicit alternative: 'Prefer get_email_analytics for sender-level breakdowns and hourly patterns,' which tells the agent when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_emailA
Import a raw RFC822 message (.eml content) into a folder via IMAP APPEND. Use to restore a backed-up message or migrate mail from another provider's export. Does not send anything — this only inserts a message directly into the mailbox. Many real .eml exports use a legacy 8-bit charset (ISO-8859-1, Windows-1252, etc.) rather than UTF-8 for their header/body text outside of MIME-encoded parts — passing that content through raw corrupts or rejects it. Use rawBase64 instead for any message not already known to be valid UTF-8.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | Full raw RFC822 message source (the .eml file content) as a UTF-8 string. Use rawBase64 instead for non-UTF-8 content. Exactly one of raw/rawBase64 is required. | |
| rawBase64 | No | Full raw RFC822 message source (the .eml file content), base64-encoded, for byte-exact import of non-UTF-8 content. Exactly one of raw/rawBase64 is required. | |
| markAsRead | No | Set the \Seen flag on import. | |
| targetFolder | No | Destination folder. Defaults to INBOX. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint=false, leaving behavioral disclosure to the description. The description adds meaningful context: messages are inserted via IMAP APPEND, nothing is sent, and raw can corrupt or reject legacy 8-bit content, with rawBase64 as the safe alternative. It does not cover return values or duplicate-handling, but the disclosed behavior is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, use cases, and encoding caveat with parameter selection. The phrase 'inserts a message directly into the mailbox' is slightly redundant with 'IMAP APPEND', but it serves to emphasize the non-sending nature. The content is well front-loaded and not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, use cases, behavioral nuance, and parameter selection; the schema fully documents each parameter. No output schema exists, but the description adequately prepares an agent for an import operation with encoding pitfalls. Minor omissions like return values or behavior when a target folder does not exist are acceptable given the tool's moderate complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline 3 applies. The description adds real value by explaining the charset pitfall and explicitly recommending rawBase64 for non-UTF-8 content, reinforcing the schema's 'exactly one required' constraint. markAsRead and targetFolder are already fully covered by the schema, so no additional description is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Import a raw RFC822 message (.eml content) into a folder via IMAP APPEND.' It states the mechanism, destination, and explicitly differentiates from sending ('Does not send anything'), which makes it distinct from send_email/draft siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Concrete use cases are given: 'restore a backed-up message or migrate mail from another provider's export.' It also provides parameter-level guidance, directing users to rawBase64 for non-UTF-8 content. It does not explicitly name sibling alternatives, but the 'Does not send anything' clause implicitly excludes send_email, so context is clear without fully explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_attachmentsARead-only
List all attachments on a specific email with stable attachmentIds, filenames, content types, and sizes. Use before calling get_attachment_content or save_attachment to discover what attachments are available and get their IDs. Prefer save_attachments when you want to download all attachments at once.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| contentType | No | Optional exact content type filter. | |
| includeInline | No | Include inline attachments. | |
| filenameContains | No | Optional filename substring filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. Description adds that it returns stable attachmentIds, filenames, content types, and sizes, providing useful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences with no fluff, front-loaded with the tool's purpose. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Description covers key aspects: what it returns, when to use, and alternatives. Lacks mention of pagination or limits, but given typical usage (few attachments per email) and full schema, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are fully described in the schema. Description does not add new meaning to parameters beyond the schema, meeting the baseline but not exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it lists attachments on a specific email, providing stable IDs, filenames, content types, and sizes. It distinguishes itself from sibling tools like get_attachment_content and save_attachment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises using this tool before get_attachment_content or save_attachment to discover attachments and get IDs, and suggests save_attachments for bulk download. Provides clear context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_draftsARead-only
List all locally saved drafts with their status, subject, and timestamps. Use to review in-progress or unsent messages. Does NOT list drafts stored only on the Proton server — use list_remote_drafts for those. Prefer get_draft when you already have a draftId and need the full content.
| Name | Required | Description | Default |
|---|---|---|---|
| includeSent | No | Include drafts already sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds the specific behavioral constraint that it only lists locally saved drafts and not server drafts, which is useful beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The main action is front-loaded, and the description efficiently uses words to convey scope and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one optional boolean parameter, read-only annotation, no output schema), the description covers all necessary aspects: purpose, returned fields, scope, usage guidelines, and alternatives. It is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter (includeSent) is fully described in the schema with 100% coverage. The tool description does not add any additional meaning about this parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb 'list', the resource 'locally saved drafts', and the fields returned (status, subject, timestamps). It also distinguishes from sibling tools like list_remote_drafts and get_draft, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit instructions on when to use ('review in-progress or unsent messages'), when not to use (for server-only drafts), and which alternative to use (list_remote_drafts, get_draft) are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remote_draftsARead-only
List draft messages currently stored in the Proton Drafts IMAP folder on the server. Use to see drafts created via Proton webmail or mobile app that have not been synced locally. Prefer list_drafts to see drafts managed by this server. Requires an active IMAP connection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum drafts to return. | |
| offset | No | Pagination offset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent with a read-only operation (listing). The description adds valuable context about the specific IMAP folder source and the type of drafts (unsynced), which goes beyond the annotation's bare safety hint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: purpose, usage guidance, prerequisite. No redundant words. Information is front-loaded with the action and scope in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list tool with two parameters and no output schema, the description explains purpose and usage well, but does not mention what fields the returned draft messages contain (e.g., subject, id, date). Since there is no output schema, this omission leaves the agent slightly underinformed about the response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with both parameters (limit, offset) fully documented with descriptions and defaults. The description adds no further param details, but the schema already handles that adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies the verb 'List', the resource 'draft messages', and a specific scope ('stored in the Proton Drafts IMAP folder on the server'). It also distinguishes from the sibling tool 'list_drafts' by contrasting local vs. server drafts, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use ('see drafts created via Proton webmail or mobile app that have not been synced locally') and when not to ('Prefer list_drafts to see drafts managed by this server'). It also notes a prerequisite ('Requires an active IMAP connection'), providing clear decision support.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_sendsARead-only
List every item in the local undo-send / scheduled-send queue (from send_email with PROTONMAIL_SEND_DELAY_SECONDS set, or schedule_draft), including its id, status, and sendAt — use this to rediscover the id needed for cancel_send if it was lost with the conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter to one status. Omit to list everything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already indicates a safe read operation, and the description adds context by specifying the queue source (send_email with PROTONMAIL_SEND_DELAY_SECONDS, schedule_draft) and the returned fields (id, status, sendAt). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that front-loads the core action and resource. It efficiently conveys the queue's origin and the purpose of the tool, though splitting it into two sentences could improve readability slightly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, read-only annotation, and no output schema, the description is sufficiently complete. It explains what is listed, where the items come from, and how the result should be used (to obtain the id for cancel_send), without requiring further detail for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers the only parameter (status) with a clear description ('Filter to one status. Omit to list everything.'), so the description does not need to add much. It mentions status as part of the output, but this is not additional parameter semantics beyond the schema's 100% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists every item in the local undo-send/scheduled-send queue, including id, status, and sendAt. It distinguishes itself from siblings by explicitly mentioning the use case of rediscovering the id for cancel_send, making its purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool, specifically to recover a lost id needed for cancel_send. It does not explicitly exclude alternatives, but the reference to cancel_send and the queue origin (send_email with delay, schedule_draft) implies the appropriate usage scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_snoozedARead-only
List every snoozed email, including its id, status, and wakeAt — use this to rediscover the id needed for cancel_snooze if it was lost with the conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter to one status. Omit to list everything. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint: true, so the safety profile is clear. The description adds context about the scope ('every snoozed email') and the return fields (id, status, wakeAt), but does not cover other behavioral aspects like pagination or potential large result sets. With annotations covering the read-only nature, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that fronts the action and key details. It includes the purpose, the scope ('every'), the return fields, and the primary use case without any fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one optional parameter and no output schema. The description covers what the tool returns (id, status, wakeAt), the optional filtering (status), and a concrete use case. This is complete enough for an agent to know when and how to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'status' is fully documented in the schema with an enum and description. The description does not add extra semantic detail beyond the schema's own description, so it relies on the schema for parameter meaning. Baseline 3 is given because schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List', the resource 'snoozed email', and the specific fields returned (id, status, wakeAt). It also distinguishes the tool's purpose by linking it to rediscovering the id needed for cancel_snooze, making it distinct from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use: 'use this to rediscover the id needed for cancel_snooze if it was lost with the conversation.' It does not provide direct when-not-to-use guidance or name alternative list tools, but the use case is concrete and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesARead-only
List all saved email templates.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint annotation, and it adds scope by saying 'all saved templates.' However, it does not disclose return format, ordering, pagination, or any other behavioral details beyond the annotation already offering the read-only safety signal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that directly states the function with no filler or redundancy. It is perfectly front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing operation, the description is adequate: it names the resource and the operation. It could mention output shape, but with no output schema and no parameters, this is not a critical omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema coverage is trivially 100%. The description adds no parameter information because there are no parameters to explain, which is acceptable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and resource 'all saved email templates,' clearly distinguishing it from sibling tools like get_template or create_template. It is unambiguous and immediately understandable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like get_template or search tools. There are no usage contexts, exclusions, or mention of related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_email_readA
Mark a single email as read or unread by setting the IMAP Seen flag. Use for individual triage or to reset read state. Prefer batch_email_action with action 'mark_read' or 'mark_unread' when updating multiple emails at once.
| Name | Required | Description | Default |
|---|---|---|---|
| isRead | No | ||
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint=false. The description adds that the tool sets the IMAP Seen flag, which is the core behavioral effect. It does not list any side effects or permissions, but for a simple flag-setting operation, this is adequate and does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences. The first sentence defines the purpose and behavior; the second provides usage guidance with an alternative. No wasted words, and key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two parameters and no output schema, the description covers purpose, usage, and distinguishes from a key sibling. It lacks explicit error conditions or return value info, but these are less critical given the tool's simplicity and the presence of schema details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers emailId well, and the description reiterates that. For isRead, the description implies its role ('mark as read or unread') but does not explicitly state that true means read and false means unread, nor does it describe the default. Schema description coverage is 50%, and the description adds marginal value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Mark a single email as read or unread by setting the IMAP Seen flag.' It uses a specific verb ('mark') and resource ('email'), and distinguishes from batch tools by specifying it handles a single email and can toggle read state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states use case: 'Use for individual triage or to reset read state.' Also provides an alternative: 'Prefer batch_email_action... when updating multiple emails at once.' This helps the agent decide when to use this tool versus siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_emailA
Move a single email to any specified mailbox folder. Use when routing a message to a custom folder. Prefer archive_email to move to the standard Archive folder, or trash_email to move to Trash. Use get_folders first to confirm the target folder path.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| targetFolder | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description carries the behavioral burden as annotations only include destructiveHint=false. It clarifies that the tool moves (not copies) a single email, and the get_folders advice implies the target must exist. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all useful and front-loaded with the action. It includes usage guidance, alternatives, and a prerequisite without waste or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, no output schema, and the description covers what, when, and prerequisites. It could be more complete by noting the email is removed from the source folder, but the 'move' verb already implies this. Overall adequate for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: emailId is well-described, targetFolder is not. The description adds semantic context by referring to 'specified mailbox folder' and 'target folder path', but does not fully define the expected format or examples for targetFolder. It partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Move a single email to any specified mailbox folder' with a specific verb and resource. It distinguishes from sibling tools like archive_email, trash_email, and bulk_move by specifying single-email scope and custom folder targeting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use: 'Use when routing a message to a custom folder.' It also names alternatives: 'Prefer archive_email to move to the standard Archive folder, or trash_email to move to Trash.' The prerequisite 'Use get_folders first to confirm the target folder path' adds clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_threadA
Move all messages in a thread to a destination folder, identified by its RFC 5322 Message-ID header. Use when you have the raw Message-ID (e.g. from email headers) and want to move the full conversation. Prefer apply_thread_action with action 'move' when you have a local threadId from get_threads or get_actionable_threads.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | ||
| messageId | Yes | RFC 5322 Message-ID, e.g. <abc@mail.example.com>. | |
| destination | Yes | Destination folder. | |
| acrossFolders | No | Also search Sent and All Mail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the action (move) without adding significant behavioral details beyond the annotation destructiveHint=false. It does not disclose whether the move is reversible, whether permissions are required, or what happens to the original location. However, the annotation already covers the non-destructive nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, consisting of two clear sentences. It front-loads the core action and provides immediate guidance on when to use it versus the alternative, with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters, no output schema, and only a destructiveHint annotation, the description provides sufficient context for an agent to understand the core functionality and when to apply it. It could mention default behavior of acrossFolders or return value, but it is largely complete for a moving operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 75% schema description coverage, the schema already explains most parameters. The description adds minimal semantic value beyond the schema, such as how messageId identifies the thread and that acrossFolders searches additional folders. This is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's action (move thread), the method (using RFC 5322 Message-ID), and distinguishes it from the sibling tool apply_thread_action which is preferred when a local threadId is available.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (when you have the raw Message-ID) and when to prefer the alternative (apply_thread_action with action 'move' when you have a local threadId from get_threads or get_actionable_threads).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_meeting_contextARead-only
Fetch recent threads and communication history for a person or company domain to prepare for a meeting or call. Use before a scheduled meeting to surface relevant recent correspondence. Provide at least one of person (name or email fragment) or domain. Returns matched threads sorted by recency.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum threads to include. | |
| domain | No | Domain to match, such as example.com. | |
| person | No | Person name or email fragment to match. | |
| syncBefore | No | Refresh the local mailbox index from IMAP before building the meeting prep. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given the readOnlyHint annotation, the description adds meaningful behavior details: results are 'sorted by recency' and syncBefore 'Refresh the local mailbox index from IMAP'—a side effect not evident from the annotation. There is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with the core purpose. The first sentence states the action and scope, the second gives usage timing, and the third covers input requirements and output format. No redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only prep tool, it covers input constraints, output sorting, and intended use. It lacks further detail on return thread structure or edge cases (e.g., no matches), but given no output schema exists, the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds a key cross-parameter constraint ('Provide at least one of person or domain') that is not visible from individual schema entries, boosting the value beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Fetch recent threads and communication history for a person or company domain to prepare for a meeting or call.' It identifies a specific action, resources, and purpose, and distinguishes itself from generic thread-fetching tools by focusing on meeting preparation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use before a scheduled meeting' and provides input constraints ('Provide at least one of person or domain'). However, it does not name alternative tools or give explicit 'when not to use' guidance, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_folderA
Rename or move a mailbox folder to a new IMAP path. Existing messages are preserved in place. Do NOT rename system folders (INBOX, Sent, Trash, Archive, Spam). Refreshes the local folder cache after the operation.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Existing folder path. | |
| newPath | Yes | New folder path. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description aligns with annotations (destructiveHint: false) by stating 'Existing messages are preserved in place.' It adds valuable behavioral context beyond annotations: 'Refreshes the local folder cache after the operation.' There is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of three sentences, all front-loaded with the core action. Each sentence conveys unique, essential information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the operation, preservation of messages, system folder warnings, and cache refresh. Given the lack of an output schema, it could optionally mention the return value (e.g., success status), but overall it is sufficiently complete for a rename/move tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters ('Existing folder path.', 'New folder path.'). The description adds no additional semantic value beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Rename or move a mailbox folder to a new IMAP path.' The verb is specific, and the resource (mailbox folder) is unambiguous. It distinguishes this from sibling tools like delete_folder or create_folder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit prohibition: 'Do NOT rename system folders (INBOX, Sent, Trash, Archive, Spam).' It also notes that existing messages are preserved. However, it does not mention when to use this tool vs alternatives like move_email or create_folder, which slightly reduces guidance comprehensiveness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_labelA
Rename a Proton label (IMAP folder under Labels/ namespace). Messages keep the label, just under the new name. For renaming a folder use rename_folder with a Folders/ prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Existing label name. The Labels/ prefix is optional and will be added automatically. | |
| newName | Yes | New label name. The Labels/ prefix is optional and will be added automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation destructiveHint: false already covers non-destructiveness. The description adds valuable context by explaining that messages retain the label under the new name, which clarifies the actual behavioral effect of the rename. It doesn't discuss permissions or edge cases, but for a simple rename this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exactly two sentences: the first states the purpose and effect, the second gives the alternative tool. Every word earns its place, and critical information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename operation with two self-describing parameters and a non-destructive annotation, the description covers all essential context: the action, the namespace, the effect on messages, and the alternative for folders. No output schema is present, and none is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions for 'name' and 'newName' fully document both parameters, including the automatic handling of the Labels/ prefix. The description adds no additional parameter-level detail beyond referencing the namespace, so a baseline score of 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Rename'), the resource ('a Proton label'), and adds specificity by noting it's an IMAP folder under the Labels/ namespace. It explicitly distinguishes from folder renaming by referencing rename_folder, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use this tool versus an alternative: 'For renaming a folder use rename_folder with a Folders/ prefix.' This directly addresses usage boundaries and steers users away from misusing the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_templateARead-only
Render a saved template's subject and body, substituting {{variable}} placeholders with the given values. Placeholders left unfilled stay literal (e.g. {{firstName}}) and are listed in missingVariables — check that field is empty before passing the rendered subject/body to send_email, or the recipient will see literal {{placeholder}} text in the message.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The template id. | |
| variables | No | Map of variable name to replacement value, e.g. { "firstName": "Alex" }. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses a critical behavior: unfilled placeholders remain literal and are listed in missingVariables. It also warns about the risk of sending literal {{placeholder}} text, which is valuable operational knowledge. This adds significant context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the main action front-loaded. Every sentence earns its place, providing both the core functionality and a critical warning without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description effectively communicates what to expect (rendered subject/body plus missingVariables). It also references the downstream send_email tool, placing this tool in the broader workflow. Despite lacking output schema, the description provides enough information for an agent to use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters fully, so the baseline is 3. The description adds meaning to the variables parameter by explaining what happens when a placeholder is not provided (it stays literal and appears in missingVariables). This enriches the semantics beyond the schema's simple 'Map of variable name to replacement value'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'render' and names the resource 'saved template's subject and body'. It clearly explains the substitution behavior and distinguishes this from simply retrieving a template (e.g., get_template). The resulting output is tied to a concrete use case (preparing content for send_email), which further clarifies its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool: before passing rendered content to send_email. It warns about the consequence of unfilled placeholders, which guides the agent to check missingVariables. However, it does not explicitly name alternative tools or state when not to use it, so a small gap remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_all_emailADestructive
Immediately reply to all original recipients (sender + all To/CC addresses) of an existing email. Identical to reply_to_email with replyAll enabled. Use when the conversation involves multiple parties and all should receive the reply. Threading headers (In-Reply-To, References) are preserved. Requires PROTONMAIL_ALLOW_SEND.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Additional CC recipients, comma-separated. | |
| bcc | No | Additional BCC recipients, comma-separated. | |
| body | No | Reply body to prepend (plain text). Required unless markdownBody is provided. | |
| dryRun | No | Preview full reply-all fan-out without sending. | |
| isHtml | No | Send body as HTML (ignored when markdownBody is provided). | |
| emailId | Yes | Original email id. | |
| fromName | No | Optional display name for the From header. | |
| confirmed | No | Set to true to confirm this irreversible send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. | |
| attachments | No | Attachments with base64 encoded content. | |
| includeQuote | No | Append the quoted original message to the reply body. | |
| markdownBody | No | Reply body in Markdown. Rendered to HTML with body as plain-text fallback; takes precedence over body+isHtml. | |
| sanitizeHtml | No | Strip scripts and remote image beacons from HTML before delivery. Defaults to true. | |
| appendSignature | No | Append PROTONMAIL_SIGNATURE (if configured) after your reply text and before the quoted original. Set false to send without it for this one message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include destructiveHint: true, and the description adds context by noting threading headers are preserved and that PROTONMAIL_ALLOW_SEND is required. It clearly conveys the immediate sending behavior beyond what the annotation states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with every sentence adding value: purpose, relationship to sibling, when to use, behavior (threading), and a prerequisite. It is front-loaded with the primary action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (13 params, destructive action, no output schema), the description covers the core purpose, usage context, key behavioral traits, and required permissions. It is sufficient for an agent to correctly select and invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for all 13 parameters, so the schema already documents each parameter. The description does not add additional meaning beyond what the schema provides, placing it at the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool sends a reply to all original recipients (sender + all To/CC addresses) of an existing email. It distinguishes itself from the sibling reply_to_email by explicitly noting it is identical to reply_to_email with replyAll enabled, making the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit usage guidance: 'Use when the conversation involves multiple parties and all should receive the reply.' This directly tells the agent when to choose this tool over alternatives like reply_to_email or forward_email.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_emailADestructive
Immediately send a reply to an existing email, threading it correctly via In-Reply-To and References headers. Use when you have an emailId and want to send the reply right away. Prefer create_reply_draft to save the reply for review first, or create_thread_reply_draft when replying from a threadId. Use reply_all_email to reply to all original recipients. Requires PROTONMAIL_ALLOW_SEND.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Additional CC recipients, comma-separated. | |
| bcc | No | Additional BCC recipients, comma-separated. | |
| body | Yes | Reply body to prepend (plain text). Required unless markdownBody is provided. | |
| dryRun | No | Preview recipient set and threading headers without sending. | |
| isHtml | No | Send body as HTML (ignored when markdownBody is provided). | |
| emailId | Yes | Original email id. | |
| fromName | No | Optional display name for the From header. | |
| replyAll | No | Reply to all original recipients. | |
| confirmed | No | Set to true to confirm this irreversible send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. | |
| attachments | No | Attachments with base64 encoded content. | |
| includeQuote | No | Append the quoted original message to the reply body. | |
| markdownBody | No | Reply body in Markdown. Rendered to HTML with body as plain-text fallback; takes precedence over body+isHtml. | |
| sanitizeHtml | No | Strip scripts and remote image beacons from HTML before delivery. Defaults to true. | |
| appendSignature | No | Append PROTONMAIL_SIGNATURE (if configured) after your reply text and before the quoted original. Set false to send without it for this one message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, and the description aligns by emphasizing 'immediately send.' It adds valuable context not in annotations: the correct threading behavior via In-Reply-To/References headers and the PROTONMAIL_ALLOW_SEND requirement. It doesn't explicitly warn about irreversibility, but the annotation covers the destructive nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences total, front-loaded with the core action, then providing usage alternatives and a prerequisite. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity, destructive send tool with no output schema, the description covers core purpose, when to use vs alternatives, required permission, and threading behavior. It misses minor details like dryRun behavior, but these are sufficiently documented in the schema. The description is complete enough for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 14 parameters with descriptions. The description adds no parameter-specific semantics beyond referencing emailId and the general send action. It does mention the auth requirement, which is not tied to a parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Immediately send a reply to an existing email, threading it correctly via In-Reply-To and References headers.' It distinguishes itself from sibling tools by naming alternatives like create_reply_draft and reply_all_email.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use when you have an emailId and want to send the reply right away.' It also gives when-not-to-use alternatives: 'Prefer create_reply_draft to save the reply for review first, or create_thread_reply_draft when replying from a threadId. Use reply_all_email to reply to all original recipients.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_emailA
Move an email from Trash back to INBOX or to a specified folder. Use to undo a trash_email operation. Does not work on permanently deleted messages — only messages currently in Trash can be restored.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| targetFolder | No | Optional restore destination. Defaults to INBOX. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behavioral trait: only works on messages currently in Trash, not on permanently deleted ones. No contradiction with annotations (destructiveHint: false). Adds value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the main action and usage guideline. Every sentence adds value with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully describes the tool's purpose, usage context, and limitations. Given the simple parameters and absence of output schema, no further detail is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and parameter descriptions are clear, including the default for targetFolder. The description does not add additional meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Move an email from Trash back to INBOX or to a specified folder', specifying verb and resource. Distinguishes from sibling 'trash_email' and 'delete_email'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly recommends using this tool to undo a trash_email operation and states it does not work on permanently deleted messages. Would benefit from mentioning when to use alternatives like 'delete_email'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_background_syncA
Immediately trigger the configured background mailbox sync cycle outside its normal schedule and return its updated status. Use to force a sync when the index may be stale. Does nothing useful if PROTONMAIL_AUTO_SYNC is disabled. Prefer sync_emails for an on-demand, configurable sync with folder and depth options.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that sync trigger is immediate, returns status, and dependency on auto sync setting. No contradiction with destructiveHint=false. Could mention if call is blocking but still clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, each adding value: action, usage guidance, and alternative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully covers purpose, usage conditions, and behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100%. Description adds context about return of updated status beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses specific verb 'trigger' with resource 'configured background mailbox sync cycle outside its normal schedule', clearly distinguishing from siblings like sync_emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when index may be stale'), when not ('does nothing useful if auto sync disabled'), and recommends alternative (sync_emails).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_doctorARead-only
Run a comprehensive production health check covering SMTP auth, IMAP auth, optional IMAP IDLE probe, SQLite index integrity, sync-failed drafts, runtime policy validation, and what this server can/cannot do (capabilities). Also reports this server's own version and entrypoint path — worth checking first when behavior doesn't match the changelog, since an old/orphaned install elsewhere on disk can silently shadow an upgrade and every other field here would still report healthy. Connection failures include a classified diagnosis (authentication_failed vs bridge_unreachable) with a specific fix. Use to fully diagnose or validate the setup. Prefer get_connection_status for a quick protocol-only reachability check.
| Name | Required | Description | Default |
|---|---|---|---|
| includeImap | No | Verify IMAP connectivity. | |
| includeSmtp | No | Verify SMTP connectivity. | |
| includeIdleProbe | No | Run a short IMAP IDLE wait to confirm the watch path is operational. | |
| idleTimeoutSeconds | No | IDLE probe timeout in seconds when includeIdleProbe is true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description reinforces this by framing the operation as a health check rather than a mutation. Beyond the annotation, it adds valuable behavioral detail: connection failures include classified diagnoses (authentication_failed vs bridge_unreachable) with fixes, the tool reports version and entrypoint path, and it warns that other health fields can remain healthy even when an orphaned install shadows an upgrade. This is substantial added context beyond structured metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then adds the key environmental warning and failure-classification detail, and ends with a direct routing instruction to the lighter sibling. Every sentence carries distinct information — coverage scope, extra version/path reporting, diagnostic output, intended use, and alternative tool — with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex diagnostic tool with no output schema, the description provides enough context to invoke it correctly: what it checks, optional behaviors, failure output characteristics, and when to prefer a different tool. It also explains why the version/path reporting matters, addressing an important operational scenario. Nothing essential is missing for an agent to select and call this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all four parameters clearly. The description adds some high-level context by mentioning the optional IMAP IDLE probe and connection diagnosis, but it does not add parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate because the description isn't needed to compensate for schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Run a comprehensive production health check') and enumerates the exact coverage areas: SMTP auth, IMAP auth, IMAP IDLE probe, SQLite index integrity, sync-failed drafts, runtime policy validation, and capabilities. It also explicitly distinguishes itself from get_connection_status by positioning this as the full diagnostic tool, so there is no ambiguity about its role relative to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage guidance is explicit: 'Use to fully diagnose or validate the setup' and 'Prefer get_connection_status for a quick protocol-only reachability check.' It also gives a concrete trigger scenario — checking this tool first when behavior doesn't match the changelog because an old install can shadow an upgrade. This tells an agent exactly when to choose this tool and when to pick an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_attachmentA
Save a single email attachment to disk by its attachmentId and return the written file path. Use when you have a specific attachmentId from list_attachments and want to write that file. Prefer save_attachments to save all or filtered attachments from an email without needing individual attachment IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| saveTo | No | Relative path within PROTONMAIL_ALLOW_FILE_DOWNLOAD_DIR to save attachment to disk. Returns file path and size instead of inline base64. Requires env var to be set. Set PROTONMAIL_MAX_INLINE_BYTES (in KB, default 40) to configure the inline size threshold. | |
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| outputPath | No | Optional file or directory path to write to. | |
| attachmentId | Yes | Stable attachment id returned by list_attachments. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the primary side effect (writing to disk) and the return value (written file path). Annotations only include destructiveHint:false, so the description adds context about the side-effect nature. However, it does not clarify the relationship between saveTo and outputPath, which could confuse users about behavior. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the first sentence stating the core action, the second giving usage context, and the third pointing to an alternative. Every sentence is purposeful and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the primary purpose and basic usage, and it differentiates from a key sibling. However, it lacks clarity on the two optional path parameters and does not describe the return format beyond 'written file path' (e.g., whether it includes size). The absence of an output schema makes these gaps more consequential.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, but the descriptions of saveTo and outputPath are overlapping and ambiguous. The tool description does not clarify the distinction, leaving users uncertain which to use. This undermines parameter semantics despite high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool's function as saving a single attachment to disk using attachmentId and returning the file path. It distinguishes from the sibling save_attachments by emphasizing 'single' and 'specific attachmentId'. This gives a specific verb, resource, and scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool—when you have a specific attachmentId from list_attachments—and when to prefer save_attachments (for all/filtered attachments). This is a clear alternative-guiding statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_attachmentsA
Save all qualifying attachments from an email to a directory on disk, with optional filename substring or content-type filters. Use to batch-download attachments from a single email. Returns the list of written file paths. Prefer save_attachment when you need to save one specific attachment by its attachmentId.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| outputPath | No | Optional target directory or file path. | |
| contentType | No | Optional exact content type filter. | |
| includeInline | No | Include inline attachments. | |
| filenameContains | No | Optional filename substring filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations include destructiveHint=false, so the agent knows the tool is non-destructive. The description adds that it returns a list of written file paths. However, it doesn't disclose overwriting behavior or error conditions, but given the annotation coverage, the description is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, followed by usage and distinction. Every sentence adds value with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the core function, filters, return value, and when to use the sibling. It doesn't cover edge cases like error handling or file naming conventions, but for a batch download tool with good annotations, it is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented. The description reinforces the filter parameters but adds minimal new meaning. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (save), the resource (all qualifying attachments from an email), and the qualifying conditions (optional filters). It distinguishes itself from the sibling 'save_attachment' by indicating batch vs. single attachment retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to use this tool: 'Use to batch-download attachments from a single email.' It also provides an alternative: 'Prefer save_attachment when you need to save one specific attachment by its attachmentId.' This is clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_draftADestructive
Queue a saved draft to send at a future time instead of immediately. IMPORTANT: this only fires while this MCP server process stays running (it's a stdio server that exits when its client disconnects) — if the app is closed before sendAt, the send fires on next server startup instead of the originally requested time, not at sendAt itself. This is best-effort tied to the app being open, not a reliable scheduler. The draft's content is snapshotted at schedule time; the draft record itself is NOT automatically marked sent or deleted once it fires — check list_drafts or get_email_stats afterward, or clean it up yourself. Cancelable via cancel_send until it fires.
| Name | Required | Description | Default |
|---|---|---|---|
| sendAt | Yes | ISO 8601 timestamp of when to send, e.g. 2026-01-15T09:00:00.000Z. Must be in the future. | |
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. | |
| confirmed | No | Set to true to confirm when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description provides rich behavioral details beyond the destructiveHint annotation: content is snapshotted, the draft is not auto-marked sent/deleted, send timing depends on process lifetime, and cancellation is possible. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long, but every sentence carries essential caveats for safe usage. It is front-loaded with the core purpose and uses 'IMPORTANT' to highlight critical constraints, making it efficient despite its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description thoroughly covers the tool's runtime behavior, limitations, cancellation, cleanup, and relationship to other tools. A minor gap is the lack of any mention of the return value or success/error indicators, which is notable since no output schema is provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds meaning to draftId by explaining content is snapshotted at schedule time, and to sendAt by explaining best-effort timing and startup fallback. However, it doesn't add detail for the 'confirmed' parameter beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Queue a saved draft to send at a future time instead of immediately.' It uses a specific verb+resource, distinguishes itself from send_draft (immediate send) and cancel_send (cancellation), and is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains when to use (to delay delivery) and critical when-not-to-use: 'this only fires while this MCP server process stays running' and 'not a reliable scheduler.' It also names alternatives ('Cancelable via cancel_send') and advises follow-up actions like checking list_drafts or get_email_stats after firing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsARead-only
Search emails via live IMAP filters with optional local post-processing for attachments and labels. Use when you need real-time results or must find messages received after the last sync. Prefer search_indexed_emails when the local index is current — it is significantly faster and works even when Bridge IMAP is unavailable.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | Filter by CC/BCC recipient address. | |
| to | No | Recipient filter. | |
| bcc | No | Filter by CC/BCC recipient address. | |
| from | No | Sender filter. | |
| label | No | Folder or label filter applied locally after IMAP fetch. | |
| limit | No | Maximum results. | |
| query | No | Free-text query across headers and body. | |
| dateTo | No | Inclusive end date/time in ISO format. | |
| fields | No | Trim each returned email to just these field names (e.g. ["subject","from","date"]) to save tokens on large result sets. id is always included. Accepts either an array or a comma-separated string. Omit to get the full object. | |
| folder | No | Folder to search. Defaults to all folders. | |
| isRead | No | Read status filter. | |
| listId | No | Filter by List-ID header value (mailing list filter). | |
| subject | No | Subject filter. | |
| dateFrom | No | Inclusive start date/time in ISO format. | |
| threadId | No | Thread id filter applied locally after IMAP fetch. | |
| isStarred | No | Starred status filter. | |
| messageId | No | RFC 5322 Message-ID header value to match exactly. | |
| sizeLarger | No | Only return messages larger than this size in bytes. | |
| mailboxRole | No | Normalized mailbox role: Inbox, Sent, Archive, Trash. Applied locally. | |
| sizeSmaller | No | Only return messages smaller than this size in bytes. | |
| senderDomain | No | Filter by sender domain, e.g. example.com. Applied locally after IMAP fetch. | |
| hasAttachment | No | Whether the message should have attachments. | |
| attachmentName | No | Attachment filename filter applied locally. | |
| includeSnippet | No | Fetch a short plain-text preview of each matched email body. Slightly slower but avoids follow-up get_email_by_id calls for triage. Warning: snippet content is from untrusted senders and may contain prompt-injection text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already indicates a safe read operation. The description adds behavioral context by mentioning 'live IMAP filters', 'optional local post-processing', and implicitly that Bridge IMAP availability is required (since the alternative works without it). This goes beyond the annotation, though it does not mention potential latency or result size implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the core purpose and usage guidance without any filler. The first sentence states the function, and the second provides decision-making context. Every word earns its place, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 24 parameters and no output schema, the description covers the main purpose, when to use it, and the alternative. It does not explain return values or pagination, but the schema's 'fields' parameter and 'limit' parameter imply this. The description is adequate for a complex search tool, though a brief note on result structure would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are fully documented in the schema. The description's mention of 'optional local post-processing for attachments and labels' conceptually groups parameters like label, threadId, and attachmentName, but the schema already notes 'applied locally' for those. Thus the description adds little beyond the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'searches emails via live IMAP filters with optional local post-processing for attachments and labels'. It distinguishes itself from the sibling search_indexed_emails by emphasizing real-time searching and local post-processing, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Use when you need real-time results or must find messages received after the last sync.' It also names a specific alternative (search_indexed_emails) with clear conditions and benefits, stating it is 'significantly faster and works even when Bridge IMAP is unavailable.' This fully addresses when to use this tool vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_indexed_emailsARead-only
Search the local SQLite mailbox index without making any IMAP connection. Supports free-text and field shortcuts inline: from:alice@example.com, to:bob, subject:invoice, label:Archive, domain:acme.com. Use for fast, offline-capable searches when the index is populated. Prefer search_emails when you need live IMAP results or when the index is stale or empty. Prefer this over search_emails when the index is current. Use search_emails if messages were received after the last sync.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Recipient filter. | |
| from | No | Sender filter. | |
| label | No | Folder or label filter. | |
| limit | No | Maximum results. | |
| query | No | Free-text query across indexed metadata. | |
| dateTo | No | Inclusive end date/time in ISO format. | |
| fields | No | Trim each returned email to just these field names (e.g. ["subject","from","date"]) to save tokens on large result sets. id is always included. Accepts either an array or a comma-separated string. Omit to get the full object. | |
| folder | No | Folder filter. | |
| isRead | No | Read status filter. | |
| subject | No | Subject filter. | |
| dateFrom | No | Inclusive start date/time in ISO format. | |
| threadId | No | Thread id filter. | |
| isStarred | No | Starred status filter. | |
| mailboxRole | No | Normalized mailbox role like Inbox, Sent, Archive, or Trash. | |
| senderDomain | No | Sender domain filter such as example.com. | |
| hasAttachment | No | Attachment filter. | |
| attachmentName | No | Attachment filename filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds context by stating it makes no IMAP connection and relies on a local index, which implies potential staleness. It also introduces inline field shortcuts, but does not detail behavior when the index is empty or result ordering, though this is a minor gap given the annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (about four sentences), front-loaded with the core purpose, and each sentence adds essential guidance. It avoids redundancy with schema and annotations, making every line valuable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 17 parameters and no output schema, the description does a good job explaining the tool's niche (offline index search versus live IMAP) and usage conditions. It does not describe return format or pagination beyond the limit parameter, but the schema covers parameters, and the key contextual distinction from siblings is thoroughly addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds value by explaining field shortcut syntax directly (from:alice@example.com, to:bob, subject:invoice, label:Archive, domain:acme.com), which enriches understanding of how the query parameter can be used alongside structured filters, beyond what schema parameter descriptions individually provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search the local SQLite mailbox index without making any IMAP connection.' It specifies the resource (local SQLite index) and distinguishes from sibling search_emails by highlighting offline capability versus live IMAP.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance is provided: 'Prefer search_emails when you need live IMAP results or when the index is stale or empty. Prefer this over search_emails when the index is current. Use search_emails if messages were received after the last sync.' This clearly communicates when to use this tool versus the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_draftADestructive
Send a previously saved local draft through Proton Bridge SMTP. Use as the final step in a draft-review-send workflow after create_draft and optional update_draft. Marks the draft as sent in the local store but does not delete it. Refuses if this draft has a still-pending scheduled send (from schedule_draft) — cancel that with cancel_send first, otherwise sending now would deliver the draft twice. Requires PROTONMAIL_ALLOW_SEND.
| Name | Required | Description | Default |
|---|---|---|---|
| dryRun | No | Preview recipients and draft content without sending. Returns what would be sent. | |
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. | |
| confirmed | No | Set to true to confirm this irreversible send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses that sending marks the draft as sent but does not delete it, that it refuses to send when a scheduled send is pending to avoid duplicate delivery, and that it requires PROTONMAIL_ALLOW_SEND. This gives the agent a realistic model of side effects and failure conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action and workflow placement, then adds only high-value behavioral and prerequisite details. Every sentence earns its place, including the rationale for refusing on pending scheduled sends, which prevents an agent from making a duplicate-delivery mistake.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive send operation with three parameters and no output schema, the description covers purpose, workflow context, side effects, prerequisites, and a critical conflict case. Combined with the fully documented input schema, an agent has what it needs to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by clarifying that draftId refers to a local draft (as opposed to remote drafts in sibling tools) and by explaining the high-level workflow role of the draft. It does not need to restate dryRun/confirmed since those are already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a previously saved local draft through Proton Bridge SMTP.' It clearly distinguishes this from related sending tools by scoping it to local drafts and a draft-review-send workflow, and the sibling list makes that differentiation useful.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool: 'Use as the final step in a draft-review-send workflow after create_draft and optional update_draft.' It also gives an exclusion condition by refusing when a pending scheduled send exists and tells the agent to cancel that first, which is actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailADestructive
Compose and send a new outbound email through Proton Bridge SMTP. Use for one-shot messages that need no review. Prefer create_draft when you want to save and review before sending, or reply_to_email when responding to an existing message. Fails if PROTONMAIL_ALLOW_SEND is false or if Bridge SMTP is unreachable. If PROTONMAIL_SEND_DELAY_SECONDS is set, this queues the send instead of sending immediately and returns a cancelable id — call cancel_send within the window to abort. Otherwise returns delivery confirmation immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipient email addresses, comma-separated. | |
| to | Yes | Recipient email addresses, comma-separated. | |
| bcc | No | BCC recipient email addresses, comma-separated. | |
| body | No | Email body content (plain text). Required unless markdownBody is provided. | |
| dryRun | No | Preview the full recipient set and validate without sending. | |
| isHtml | No | Whether body should be sent as HTML (ignored when markdownBody is provided). | |
| replyTo | No | Optional reply-to email address. | |
| subject | Yes | Email subject. | |
| fromName | No | Optional display name for the From header (e.g. 'Alice'). Does not change the sending address. | |
| priority | No | SMTP priority header. | |
| confirmed | No | Set to true to confirm this irreversible send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. | |
| attachments | No | Attachments with base64 encoded content. | |
| markdownBody | No | Email body in Markdown. When provided, rendered to HTML with body as plain-text fallback; takes precedence over body+isHtml. | |
| sanitizeHtml | No | Strip scripts, event handlers, and remote image beacons from HTML before delivery. Defaults to true when body is HTML. | |
| appendSignature | No | Append PROTONMAIL_SIGNATURE (if configured) to the body. Set false to send without it for this one message. | |
| undoWindowSeconds | No | Override PROTONMAIL_SEND_DELAY_SECONDS for this one send: queue it for this many seconds (cancelable via cancel_send) instead of the server's configured default. 0 sends immediately even if the server has a default window configured. Same caveat as the server default: only fires while this server process stays running. | |
| requestReadReceipt | No | Request a read receipt (MDN) via a Disposition-Notification-To header. Most mail clients ask the recipient before honoring it — this is a request, not a guarantee. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide destructiveHint: true, but the description goes well beyond that. It discloses the failure when PROTONMAIL_ALLOW_SEND is false, the queueing behavior with PROTONMAIL_SEND_DELAY_SECONDS, cancellation via cancel_send, the same-process caveat, and the confirmation requirement for destructive sends. This is rich, useful context not present in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, usage boundary, failure conditions, delayed-send behavior, and fallback behavior. It is front-loaded with the core action and remains compact given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 17-parameter destructive send tool with only a destructiveHint annotation and no output schema, the description covers the essential behavior: what happens on success, failure modes, delay/cancellation, confirmation requirements, and relationship to sibling tools. It is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all 17 parameters thoroughly. The description does not add additional parameter-level semantics beyond noting the delay override behavior, which is also described in the schema. Baseline 3 is appropriate because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific action ('Compose and send a new outbound email through Proton Bridge SMTP') with a clear resource and mechanism. It also distinguishes itself from siblings by calling out create_draft and reply_to_email, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use ('one-shot messages that need no review'), when not to, and names alternatives ('Prefer create_draft... or reply_to_email...'). Also provides operational guidance about failure conditions and delayed sends with cancel_send.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_test_emailADestructive
Send a minimal diagnostic email to confirm Proton Bridge SMTP credentials and connectivity. Use before relying on send_email in a new environment. Prefer get_connection_status for a connectivity check that does not actually send mail. Returns transport debug info and delivery status.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient email address. | |
| customMessage | No | Optional custom test body. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds context beyond the destructiveHint annotation by explaining the tool returns 'transport debug info and delivery status' and that it is a minimal diagnostic email. While the annotation flags destructive behavior, the description discloses the side-effectful action (sending an email) without contradicting the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with a clear action and purpose, followed by usage guidance and return info. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, when to use it, alternatives, and return value. Given the simple 2-parameter schema and no output schema, this is sufficient for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with both parameters (to, customMessage) described in the schema. The description does not add additional semantics beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Send' and identifies the resource ('a minimal diagnostic email') and purpose ('confirm Proton Bridge SMTP credentials and connectivity'). It also distinguishes from siblings by mentioning send_email and get_connection_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is provided: 'Use before relying on send_email in a new environment' and 'Prefer get_connection_status for a connectivity check that does not actually send mail.' This clearly indicates when to use this tool and when to use an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
snooze_emailA
Move an email out of sight into Folders/MCP-Snoozed and bring it back to its original folder at wakeAt. IMPORTANT: like scheduled sends, wake only fires while this MCP server process stays running — if the app is closed before wakeAt, the email wakes on next server startup instead of at the requested time, not reliably at wakeAt itself. Cancelable via cancel_snooze, which wakes it immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| wakeAt | Yes | ISO 8601 timestamp of when to bring it back, e.g. 2026-01-15T09:00:00.000Z. Must be in the future. | |
| emailId | Yes | Composite email id in FOLDER::UID format. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only include destructiveHint: false, which the description does not contradict. Beyond that, the description discloses a major behavioral trait: the wake is not reliable if the server stops, which is not inferable from annotations. However, it does not detail the cancellation mechanism's side effects (e.g., whether email wakes immediately), but given the explicit warning, it adds significant value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured paragraph with a strong imperative verb and correct placement of the critical warning. It avoids fluff and is concise, though the long warning sentence could be split for readability, but this does not detract from substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool mutates an email's location and has a time-dependent behavior, the description fully covers the essential context: what happens on move, when it returns, the fragility of the timer, and the cancellation path. The lack of an output schema is acceptable as the description clarifies state changes, and the sibling tools like cancel_snooze are logically referenced. Minor omission: it does not state whether the original folder is restored exactly, but the operation is clear enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions cover 100% of parameters, providing clear definitions for emailId and wakeAt. The description adds no extra parameter details beyond what the schema provides, such as example formats or constraints, but since the schema already covers them, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Move an email out of sight into Folders/MCP-Snoozed') and the mechanism for returning it ('bring it back to its original folder at wakeAt'). It uses specific verbs and resources, and distinguishes itself from suffixed siblings like 'cancel_snooze' and 'list_snoozed'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly emphasizes the critical scheduling constraint ('wake only fires while this MCP server process stays running') and warns about the fallback behavior if the app closes. It also mentions cancellation via 'cancel_snooze', providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
star_emailA
Star or unstar a single email using the IMAP Flagged flag. Use to bookmark an important message for later follow-up. Prefer batch_email_action with action 'star' or 'unstar' when flagging multiple emails at once.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. | |
| isStarred | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral context (uses IMAP Flagged flag, so it's a metadata change) beyond the destructiveHint annotation, which is false. It doesn't contradict annotations and gives enough detail for a simple flag toggle, though it doesn't mention idempotency or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose, use case, and batch alternative. Front-loaded with the core action, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter mutation with no output schema and minimal annotations, the description covers the essential purpose, use case, and alternative. It doesn't mention return values or error conditions, but these are less critical for such a straightforward tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (emailId described, isStarred not). The description's 'Star or unstar' implies the isStarred parameter's purpose but doesn't explicitly map boolean values to actions. It adds some meaning but not enough to fully compensate for the missing schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Star or unstar a single email using the IMAP Flagged flag.' It clearly differentiates from siblings like batch_email_action (multiple emails) or mark_email_read (different flag).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear use case ('bookmark an important message for later follow-up') and explicitly directs users to batch_email_action when flagging multiple emails, giving both a when-to-use and an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_draft_to_remoteA
Force-push a locally saved draft to the Proton Drafts IMAP folder and return the remote UID. Use when a draft was created with syncToRemote:false or when the automatic sync failed. Do NOT use this if PROTONMAIL_ALLOW_REMOTE_DRAFT_SYNC is false — the call will be rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only destructiveHint:false in annotations, the description adds meaningful behavioral context: it is a 'force-push' (indicating an overwrite/forced action), it returns the remote UID, and it will be rejected when a specific env var is false. This goes well beyond the minimal annotation and discloses important conditions and outcomes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first states the action and return value, the second gives usage conditions and an exclusion. Every word earns its place, no fluff or repetition. It is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter and no output schema, this description is complete: it explains what it does, when to use it, a critical rejection condition, and the return value. The context is sufficient for an agent to decide and invoke correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single draftId parameter, and the schema already provides a precise description of where the ID comes from. The tool description adds no additional parameter meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific operation: 'Force-push a locally saved draft to the Proton Drafts IMAP folder and return the remote UID.' It uses a precise verb and resource, and distinguishes itself from siblings like create_draft, update_draft, and list_remote_drafts by specifying the force-push and remote UID return. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use: 'Use when a draft was created with syncToRemote:false or when the automatic sync failed.' It also provides a clear exclusion: 'Do NOT use this if PROTONMAIL_ALLOW_REMOTE_DRAFT_SYNC is false — the call will be rejected.' This gives concrete, actionable guidance with a conditional rejection, which is exactly what an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_emailsA
Incrementally sync email metadata from IMAP into the local SQLite index, using stored checkpoints to avoid re-fetching already-indexed messages. Use before calling search_indexed_emails or get_threads when the index may be stale. The default incremental sync only ever adds/updates recent messages — it never notices a message that was archived, trashed, or moved out of the synced folder by any client, so search/thread/digest tools can keep showing a message as still present indefinitely. Set full:true (per folder — sync each folder you want cleaned up) to also detect and prune those, in addition to fetching a larger sample. Prefer run_background_sync to trigger the scheduled sync cycle (also incremental-only by default; see PROTONMAIL_AUTO_SYNC_FULL).
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Fetch a larger per-folder sample, and detect/prune messages no longer present in this folder (moved, archived, trashed, or deleted by any client) that the default incremental sync would otherwise leave stale in the index forever. | |
| folder | No | Folder to sync. Defaults to all folders. | |
| limitPerFolder | No | Override the per-folder fetch limit. | |
| includeAttachmentText | No | Extract searchable text from text-like attachments while syncing. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses a critical behavioral limitation: incremental sync never notices archived, trashed, or moved messages, so stale entries can persist indefinitely. It also explains exactly what full:true changes, giving the agent important operational knowledge not available from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: it front-loads the core purpose, then adds necessary caveats and usage guidance. Every sentence contributes meaningful information, and the length is justified by the tool's nuanced behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a sync tool with four optional parameters, no output schema, and important staleness caveats, the description covers the essential operational context: when to run it, what it does, what it misses, how to fix that with full:true, and which sibling to prefer for scheduled sync. This is complete for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters well. The description reinforces the meaning of full and folder but does not add substantial new parameter-level semantics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Incrementally sync email metadata from IMAP into the local SQLite index.' It clearly distinguishes this tool from siblings by explaining the checkpoint-based incremental mechanism and explicitly positioning it relative to search_indexed_emails, get_threads, and run_background_sync.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage context: use before search_indexed_emails or get_threads when the index may be stale. It also directs users to prefer run_background_sync for scheduled syncs and explains when to set full:true, providing clear alternatives and conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_foldersARead-only
Refresh the in-memory folder list from the IMAP server and return the updated list. Use when folders have been created, renamed, or deleted externally (e.g. via Proton webmail) and get_folders is returning stale data. Prefer get_folders for a read-only view that does not force a refresh.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that it forces a refresh and returns updated list; annotations only provide readOnlyHint which is consistent with server-side read.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, front-loaded with purpose, no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description fully explains behavior and usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters; schema coverage is 100%; baseline 4 applies as no additional parameter info needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the verb 'Refresh' and resource 'folder list', and distinguishes from sibling get_folders by emphasizing it forces a refresh.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use when folders changed externally and get_folders is stale, and to prefer get_folders for a read-only view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
top_sendersARead-only
Return a frequency table of the top senders in a folder over a date range. Keyed on the sender address, not the display name, so display-name spoofing does not conflate different senders. Use for inbox analytics, unsubscribe triage, and contact discovery.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max senders to return. | |
| since | No | ISO date lower bound. | |
| before | No | ISO date upper bound. | |
| folder | No | Folder to analyse. Defaults to INBOX. | |
| scanLimit | No | Max messages to scan. | |
| excludeSelf | No | Exclude messages sent by your own address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true. The description adds valuable behavioral detail: keyed on sender address, not display name, to avoid spoofing. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, front-loaded with core purpose. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, key behavioral trait, and use cases. With good schema annotations, it is mostly complete, though it could optionally clarify the return format more explicitly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description does not add additional parameter details beyond what the schema provides, but hints at folder and date range.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Return a frequency table of the top senders' with specific verb and resource, and distinguishes from siblings by mentioning keying on sender address to avoid spoofing. Use cases are explicitly listed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit use cases (inbox analytics, unsubscribe triage, contact discovery), giving context. It does not explicitly mention when not to use or alternatives, but the sibling list implies differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trash_emailA
Move a single email to the Trash folder. Messages in Trash can be recovered with restore_email. Use instead of delete_email when you may want to recover the message later. Prefer batch_email_action with action 'trash' for multiple emails at once.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format, as returned by get_emails or search_emails. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations set destructiveHint=false, and description adds that messages can be recovered via restore_email, providing useful behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, front-loaded sentences with no wasted words. Each sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple single-parameter tool with a clear purpose and usage guidelines, the description is complete and sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with adequate parameter description. The description does not add extra semantic detail beyond the schema, so baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Move a single email to the Trash folder' and distinguishes it from delete_email by noting recoverability. It also references batch_email_action for multiple emails.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when to use this tool vs delete_email and recommends batch_email_action for multiple emails, giving clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unsubscribe_senderADestructive
Execute the mailto: variant of a message's List-Unsubscribe header by sending a minimal unsubscribe email through Proton Bridge SMTP. Only works when the header includes a mailto address — if it only has an https link, this throws and returns that link for you to open manually instead (this server never auto-fetches unsubscribe URLs, to avoid firing an unreviewed request from mail content). Call get_unsubscribe_info first to see what's available.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id from previous tool output. | |
| confirmed | No | Set to true to confirm this send when PROTONMAIL_CONFIRM_DESTRUCTIVE is enabled. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond destructiveHint=true, the description discloses the implementation via Proton Bridge SMTP, the conditional throw-and-return-link behavior, and the safety rationale for not auto-fetching URLs. This adds meaningful behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary action, followed by edge case behavior and a prerequisite. No redundant or vague wording; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a simple schema and no output schema, the description covers the main behavior, edge case, and prerequisite. It does not specify the success return value, but this is a minor gap given the clarity of the action and the existence of related tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with emailId described as from previous tool output and confirmed for confirmation. The description adds no additional parameter meaning beyond reinforcing that emailId comes from get_unsubscribe_info output, which is already in the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: executing the mailto: variant of a List-Unsubscribe header by sending a minimal unsubscribe email through Proton Bridge SMTP. It distinguishes from siblings like get_unsubscribe_info (which checks availability) and send_email (general send), and specifically mentions the https-only fallback behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use the tool (when header includes a mailto address) and when it throws (if only an https link), and instructs to call get_unsubscribe_info first. It also explains the server's policy of never auto-fetching URLs, guiding the agent to open https links manually instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_draftA
Update an existing locally saved draft's recipients, subject, body, or other fields. Use to edit a draft before sending. Only provided fields are updated — omitted fields retain their current values. After updating, call send_draft to send or sync_draft_to_remote to push to Proton Drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipient email addresses, comma-separated. | |
| to | No | Recipient email addresses, comma-separated. | |
| bcc | No | BCC recipient email addresses, comma-separated. | |
| body | No | Draft body. | |
| notes | No | Optional local note for the draft. | |
| isHtml | No | Whether the body should be HTML. | |
| draftId | Yes | Draft id returned by create_draft, list_drafts, or a create_*_draft call. | |
| replyTo | No | Optional reply-to email address. | |
| subject | No | Draft subject. | |
| priority | No | ||
| attachments | No | Attachments with base64 encoded content. | |
| syncToRemote | No | Whether to sync the updated draft to the Proton Drafts mailbox when IMAP is available. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses partial update behavior ('Only provided fields are updated — omitted fields retain their current values'), which is valuable. However, it misleadingly instructs to call sync_draft_to_remote after updating, contradicting the syncToRemote parameter that defaults to true and auto-syncs when IMAP is available. This creates confusion about whether the tool syncs automatically. Annotations only provide destructiveHint: false, offering minimal safety context, so the description carries the transparency burden and partially fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no filler. Every sentence contributes to understanding the tool's function, usage, or next steps. The structure is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, partial update behavior, and follow-up actions, but the sync guidance is misleading and omits the existence of the syncToRemote parameter behavior. Given the tool has 12 parameters and no output schema, this is a notable gap that could cause incorrect invocation. It is adequate but not fully reliable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 92%, so the baseline is 3. The description adds meaningful parameter behavior beyond the schema by explaining that omitted fields retain their current values — a critical semantic that is not apparent from individual field descriptions. It also clarifies the draftId refers to a 'locally saved draft.'
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear, specific verb and resource: 'Update an existing locally saved draft's recipients, subject, body, or other fields.' This distinguishes it from create_draft (creates new), send_draft (sends), and sync_draft_to_remote (syncs). The partial update semantics further clarify the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it ('Use to edit a draft before sending') and provides alternatives for subsequent actions ('call send_draft to send or sync_draft_to_remote to push to Proton Drafts'). This clearly separates it from sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_message_flagsA
Add or remove arbitrary IMAP flags on a single message, then verify the server applied them. Returns notApplied[] listing flags the server silently dropped. Use for custom IMAP flags (e.g. \Answered) or when mark_email_read / star_email don't cover the flag you need. Prefer bulk_update_flags to update flags across multiple messages at once.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format. | |
| flagsToAdd | No | IMAP flags to set, e.g. ["\\Seen", "\\Flagged", "\\Answered"]. | |
| flagsToRemove | No | IMAP flags to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral context: the tool verifies the server applied the flags and returns 'notApplied[]' for silently dropped flags. Annotations only provide destructiveHint=false, so this extra transparency about verification and partial-application behavior is meaningful, though more detail on side effects could be included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (three sentences) and front-loaded with the core action and verification behavior. It then provides usage guidance and alternatives without unnecessary detail. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with moderate complexity, the description covers purpose, usage context, alternatives, and return behavior (notApplied[]). No output schema exists, so the description's mention of the returned notApplied list fills the gap. It is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter already described in the input schema. The description adds minimal new parameter semantics beyond mentioning 'arbitrary IMAP flags' and giving an example, which aligns with schema examples. Baseline 3 is appropriate since the schema carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Add or remove arbitrary IMAP flags on a single message, then verify the server applied them.' It distinguishes itself from siblings by explicitly mentioning mark_email_read / star_email as alternatives for common flags and bulk_update_flags for multi-message updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Use for custom IMAP flags (e.g. \Answered) or when mark_email_read / star_email don't cover the flag you need' and 'Prefer bulk_update_flags to update flags across multiple messages at once.' This tells the agent when to choose this tool over alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_message_labelsA
Add or remove Proton labels on a single message without moving it. Labels live under the Labels/ namespace (e.g. 'Labels/Work'). Use for one message at a time. Prefer bulk_update_labels to apply label changes across multiple messages. Create missing labels first with create_folder using a 'Labels/' prefix.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | Composite email id in FOLDER::UID format. | |
| labelsToAdd | No | Label paths to add, e.g. ["Labels/Work", "Labels/Receipts"]. The 'Labels/' prefix is optional and will be prepended if missing. | |
| labelsToRemove | No | Label paths to remove. Idempotent — silently ignored if the label is not applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate destructiveHint=false. The description adds meaningful behavioral context: it does not move the message, requires labels to exist under the Labels/ namespace, and is intended for single-message operations. This goes beyond the minimal annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose, followed by usage guidance and a prerequisite. No wasted words, easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage, alternatives, and prerequisites. With no output schema and minimal annotations, it provides sufficient context for a straightforward label modification tool, though it omits potential return values or error behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters with rich examples. The description reinforces the namespace convention but does not add significant new semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: adding or removing Proton labels on a single message. It distinguishes itself from bulk_update_labels and indicates it does not move the message, making it specific to message label modification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use for one message at a time, directs users to bulk_update_labels for multiple messages, and instructs to create missing labels first with create_folder. Provides clear usage context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wait_for_mailbox_changesARead-only
Open an IMAP IDLE session and block until a mailbox change event arrives or the timeout expires. Use to detect real-time inbox activity without polling. Returns whether a change was observed. Always returns within timeoutSeconds plus a few seconds' grace, even if the underlying IDLE session gets stuck — do not use in fire-and-forget pipelines. A change that arrives may not always wake the call early; it is still detected and reported correctly, just not necessarily before the timeout.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Mailbox to watch during IDLE. | INBOX |
| timeoutSeconds | No | Maximum watch duration in seconds. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint annotation by disclosing blocking semantics, guaranteed return within timeout+grace, early-wake caveat, and correctness of detection even if not early. These are critical runtime behaviors not evident from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise and front-loaded: first sentence states the core action and constraint. Subsequent sentences add necessary caveats without redundancy. No fluff, each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no output schema), the description fully explains purpose, usage constraints, and behavioral guarantees. Complete for an agent to invoke correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are clearly described in the input schema. The description does not add additional parameter details, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear action: opens an IMAP IDLE session and blocks until a mailbox change event or timeout. Specifies resource (mailbox) and operation (wait). Distinguishes from siblings by focusing on real-time detection without polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit use case: 'Use to detect real-time inbox activity without polling.' Provides a clear exclusion: 'do not use in fire-and-forget pipelines.' Also explains timeout behavior, which helps decide when to call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Many tools have overlapping purposes, e.g., multiple delete tools (delete_email, bulk_delete, trash_email, empty_folder) and multiple search tools (search_emails, search_indexed_emails, count_messages). Descriptions help partially but still require careful reading to avoid misselection.
Most tools follow a verb_noun pattern (e.g., batch_email_action, bulk_delete, send_email). Minor inconsistencies: 'flag_thread' vs 'apply_thread_action', 'star_email' vs 'update_message_flags', and mixing 'email' and 'message' references.
48 tools is excessive for a mail bridge server. The granularity leads to many single-purpose tools that could be consolidated, making the surface overwhelming and over-decomposed for the domain.
Covers core email operations (send, receive, move, delete, search, sync) but missing basic draft creation tools (despite references in descriptions) and folder listing tools, which are notable gaps.
Maintenance
Related MCP Connectors
Read, send and organize email and calendars on any IMAP/CalDAV mailbox: OVH, iCloud, Zoho, Fastmail.
Connect any mailbox to Claude, ChatGPT & AI: read, send, reply, schedule & search emails.
Unified inbox MCP for WhatsApp, Telegram, Email, voice — read/send messages, search, AI agents.
Read and edit GA4, Search Console and Google Tag Manager from any MCP client. 29 tools.
Related MCP Servers
- FlicenseNot gradedqualityFmaintenanceEnables comprehensive ProtonMail management through SMTP and IMAP, supporting email sending/reading, folder operations, analytics, and contact tracking with advanced search and automation capabilities.42
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to interact with ProtonMail accounts through the Proton Bridge using SMTP and IMAP protocols. Provides email management capabilities via secure local bridge connections.27MIT
- AlicenseAqualityCmaintenanceEnables AI agents to send, read, search, and organize emails via ProtonMail using Proton Bridge. Supports MCP-compatible clients like Claude and Cursor.17323MIT
- AlicenseAqualityAmaintenanceEnables AI assistants to read, organize, and send Proton Mail through the local Proton Bridge, with careful gating for sending and attachment access.6341Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/googlarz/proton-mail-bridge-client'
If you have feedback or need assistance with the MCP directory API, please join our Discord server