mailpouch
mailpouch is a local MCP server that gives AI agents secure, permission-gated, and audit-logged access to Proton Mail (via Proton Bridge) or generic IMAP accounts, enabling comprehensive email management and automation.
Reading & Searching Email
Fetch paginated email lists from any folder, get full email content by ID, and retrieve complete email threads
Search emails by sender, recipient, subject, body, date range, size, read/starred/draft status, or attachment presence
Get unread counts per folder, fetch emails by label, download attachments as base64
Local full-text search (FTS5/BM25) with phrase, boolean, prefix, and column-filter support; rebuild and check index status
Sending & Composing
Send emails with To/CC/BCC, HTML or plain text, priority, reply-to, and attachments
Reply (including reply-all), forward, send test emails to verify SMTP, and save drafts
Scheduling & Reminders
Schedule emails for future delivery; list, manage, and cancel scheduled emails
Set follow-up reminders if no reply is received within N days; list, check, and cancel pending reminders
Folder & Label Management
List, create, rename, delete, and sync folders/labels
Move emails to custom folders, trash, spam, archive; apply and remove labels
Email Actions & Bulk Operations
Mark read/unread, star/unstar, mark as answered or forwarded
Bulk mark read/unread, bulk star, bulk move, bulk apply/remove labels, bulk delete
Deletion (Destructive, Confirmation Required)
Move emails to trash, bulk delete, and permanently empty the trash
Analytics & Contacts
Aggregate inbox/sent statistics, advanced analytics (top senders/recipients, peak hours, attachment stats, response times)
Extract and rank contacts from email history, get email volume trends, and get a correspondence profile for a specific address
Content Extraction
Extract action items from email bodies and parse iCalendar (ICS) meeting details from attachments
SimpleLogin Alias Management (Optional)
List, create (random or custom), enable/disable, delete (with confirmation), and view activity logs for aliases
Proton Pass Integration (Optional)
List, search, and retrieve decrypted credentials with audit logging
System & Server Control
Check IMAP/SMTP connection health, sync emails into local cache, clear caches, retrieve server logs and version
Start Proton Bridge; shut down or restart the MCP server
Permission & Security Controls
Tiered access presets (read-only, supervised, send-only, full, custom) with per-agent grants and rate limiting
Human-gated escalation for elevated permissions; explicit confirmation required for all destructive actions
Full audit logging across all operations; multi-account support
Allows AI agents to read, compose, and manage encrypted Proton Mail inboxes through Proton Bridge, with permission-gated and audit-logged access.
Provides tools for managing SimpleLogin aliases, enabling alias creation, deletion, and listing.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mailpouchshow my unread emails from today"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mailpouch
mailpouch is an MCP server that gives AI agents a typed, permission-gated, audit-logged tool surface over private-mail providers — Proton Mail (via Proton Bridge) and plain IMAP.
The pitch in one line: if you picked Proton Mail because you didn't want a third party reading your inbox, you don't suddenly want to hand a chatbot OAuth access to that same inbox so it can triage on your behalf. The usual "connect your email" integrations route everything through someone else's servers and ask for blanket scopes. Hand-rolled IMAP inside the agent is worse — no permission boundary, no audit trail, and the model holds your credentials in its context window. Neither option respects why you chose the provider in the first place.
mailpouch runs locally and speaks to Proton Bridge over a TLS socket on your own machine; nothing leaves the box unless you asked it to. Up to 86 tools (83 canonical plus 3 meta-tools) cover reading, sending, drafts, folders, search, analytics, optional aliases and Proton Pass, plus system control. Tool tiers and capability-aware listing keep unconfigured companion tools out of an agent's context. Every connecting client gets its own grant with folder allowlists, IP pins, per-tool rate caps, expiry, and account binding — all hashed-args in the audit log, never the values. Delete, trash, spam, alias removal, and sensitive Pass retrieval round-trip through MCP elicitation for human confirmation before they execute.
It is real because the primitives are real: OAuth 2.1 with PKCE S256, RFC 7591 dynamic client registration, RFC 8707 resource indicators, RFC 9728 protected-resource metadata, and an OAuth client_credentials grant so headless agents authenticate too — every agent gets its own gated, revocable identity. Credentials live in the OS keychain. A local FTS5 index with BM25 ranking handles phrase, boolean, prefix, and column-filter queries so your search terms never leave your laptop. Desktop notifications use native osascript / notify-send / powershell.exe with no added dependency; webhook dispatch auto-detects CloudEvents 1.0, Slack, or Discord, signs with HMAC, and retries with eight-attempt exponential backoff. So how do you point it at your Bridge install and wire up a client?
Read, compose, and manage your encrypted Proton Mail inbox from any AI assistant — over stdio or remote HTTP — with human-controlled permissions.
⚠ Proton Terms of Service Notice
This is an unofficial third-party tool that connects to Proton Mail through Proton Bridge's local IMAP/SMTP surface. It is not affiliated with, endorsed by, or authored by Proton AG.
Proton's Terms of Service (proton.me/legal/terms) §2.10 prohibits "accessing the Services through automated means (including but not limited to bots, scripts, or similar technologies)". The textual reading covers agentic / scripted workloads against Bridge even though Bridge itself is a sanctioned surface.
This server is designed to keep access user-initiated, not autonomous:
Default permission preset is
read_only. Sending, deletion, and folder mutation require explicit user opt-in via the settings UI.Destructive tools (delete / empty_trash / move-to-trash / move-to-spam / alias deletion / sensitive Pass retrieval) require explicit confirmation. With MCP elicitation-capable clients, the server prompts the user out-of-band before executing; non-elicitation clients must pass
{ confirmed: true }.Elevated permissions require out-of-band human approval (settings UI button or terminal), not an agent-only grant.
The settings UI shows a first-run ToS acknowledgement the user must click through before credentials are accepted.
You remain the operator of your Proton account. Running this server against your own account is your decision to make under Proton's ToS; the authors disclaim responsibility for ToS compliance on your behalf.
Related MCP server: mail-mcp
What It Does
Proton Mail encrypts your email end-to-end, which means no third-party API can read it. Proton Bridge solves this by decrypting email locally. This MCP server connects to Bridge and gives Claude (or any MCP host) structured, permission-gated access to your inbox.
Your emails are decrypted on your own machine by Proton Bridge. Message content is normally cached in memory and cleared on restart, but scheduled outbound messages persist recipients, subjects, and bodies in ~/.mailpouch-scheduled.json. The optional local FTS5 index uses ~/.mailpouch-fts.db (or MAILPOUCH_FTS_DB) as its base/legacy path, then stores live account indexes under the derived private <base-name>.accounts/<account-hash>.db locations. Protect or clear those stores as appropriate. You control exactly what the AI can do through a preset permission system with human-gated escalation for anything sensitive.
Quick Start (zero to running)
Prereq: Proton Bridge installed, running, and signed in.
Add the MCP server to your client. This one form works whether or not mailpouch is globally installed:
{ "mcpServers": { "mailpouch": { "command": "npx", "args": ["-y", "mailpouch"] } } }Configure Bridge credentials — either path writes
~/.mailpouch.json(+ OS keychain):Interactive wizard:
npx -y mailpouch-settingsNon-interactive (scriptable / agent-driven):
npx -y mailpouch setup --username you@proton.me --password-stdin(paste the Proton Bridge password — Bridge → Settings → IMAP/SMTP → Password — not your Proton login password)
Verify:
npx -y mailpouch doctor— prints the exact next step until it reportsready. (Agents can call the always-availablesetup_statustool for the same diagnosis.)Approve the agent. On first connect, every client is gated behind a one-time human Approve/Deny — open the settings UI (
http://localhost:8766/#/agents) and click Approve. This is expected, not an error.
That's it. The sections below cover everything in depth.
Key Features
Up to 86 tools — 83 canonical tools across 11 categories plus 3 always-available meta-tools (
setup_status,request_permission_escalation,check_escalation_status). SimpleLogin and Proton Pass groups are listed only when configured. Seesrc/config/schema.tsfor the canonical inventory.Two transports — stdio (default, Claude Desktop) and HTTP (remote / self-host). HTTP is OAuth-only:
authorization_code+ PKCE-S256 for interactive agents andclient_credentialsfor headless service accounts, with RFC 7591 Dynamic Client Registration, RFC 8414 authorization-server metadata, and RFC 9728 protected-resource metadata. Per-caller token-bucket rate limiting on every endpoint.Progressive tool tiering —
core/extended/completecontrols how many tools land in the client'sListToolsresponse, so context isn't burned on tools you don't use. Configurable viatoolTierorMAILPOUCH_TIER.Destructive-tool confirmation — uses MCP elicitation when the client supports it (Claude Desktop, Cline) so the user sees a prompt before delete, trash, spam, alias deletion, server lifecycle, or sensitive Pass retrieval. Falls back to a required
{ confirmed: true }argument for clients without elicitation.5 permission presets — read-only by default; write access requires explicit opt-in. Per-tool overrides and rate limits via the Custom preset.
Human-gated escalation — agents request elevated permissions, you approve via browser UI or terminal; the agent cannot approve its own requests.
Browser-based settings UI at
localhost:8766— auto-starts with the daemon; setup wizard, live connection test, per-tool toggles, escalation approval panel, per-agent Approve/Deny.Native system tray icon — always visible, clickable menu opens the settings UI or quits. Rendered via a bundled Rust (napi-rs) binding around the
tauri-apps/tray-iconcrate — the same one Tauri ships in production — so the tray behaves correctly on modern GNOME (where the legacy Go-binary library shows a generic placeholder), NSStatusBar on macOS, and Shell_NotifyIcon on Windows. Prebuilts for linux-x64/arm64, darwin-arm64, win32-x64/arm64 ship inside the main package; darwin-x64 (Intel Mac) falls back to the legacy Go backend cleanly.6 MCP prompts — triage inbox, compose reply, daily briefing, find subscriptions, thread summary, draft in my voice.
MCP Resources — individual emails and folders addressable via
email://andfolder://URIs.Scheduled email delivery — queue emails for future sending; survives server restarts. Plus
remind_if_no_replyfor outbound follow-ups gated on inbox replies.Optional companion services — SimpleLogin alias management (16 tools, requires API key) and Proton Pass via pass-cli (4 tools, requires PAT) are omitted from
ListToolsuntil configured; local FTS5 full-text index remains available whenbetter-sqlite3is installed.TLS-strict by default — refuses to connect to localhost Bridge without a pinned cert, recommends Bridge ≥
3.22.0(older detected versions warn but do not block connection), and uses exponential backoff on SMTP abuse-signal responses.Multi-account — configure more than one Proton / IMAP account; a running daemon hot-swaps the active account, while standalone settings and failed live rebinds explicitly request a restart. Tools accept an optional
account_idargument to route a single call to a specific account. Seesrc/accounts/.Per-agent grants — each MCP client (identified by its OAuth
client_id) is gated by its own approvable grant, with optional folder allowlists, IP pins, per-tool rate caps, expiry, and account binding. Separate from the global preset and the escalation flow. Seesrc/agents/.Live notifications — desktop toasts (no extra deps) and outbound webhooks (CloudEvents / Slack / Discord, HMAC-signed, retried) fire on grant-state changes. See
src/notifications/.Strict TypeScript and a comprehensive Vitest suite; unused locals and parameters are compiler errors.
Documentation: HELP.md (task-oriented how-tos) · README_FIRST_AI.md (agent API reference) · docs/index.md (full index)
Quick Start
Ask Claude things like:
"Summarize everything from my boss this week"
"Find emails about my Acme invoice and draft a reply"
"Move all order confirmations to my Shopping folder"
"What's my average email response time this month?"
"Schedule a follow-up email to alice@example.com for next Monday at 9am"
"Remind me if there's no reply within 3 business days"With read-only permissions (the default), Claude can read, search, and analyse your inbox but cannot send, move, delete, or change anything.
Prerequisites
Requirement | Version | Notes |
Node.js | >= 22.0.0 | Check with |
npm | >= 10.0.0 | Bundled with Node.js |
Proton Bridge | 3.22.0 recommended minimum | Must be running and signed in; older detected versions warn but do not block connection · proton.me/mail/bridge |
Proton Mail account | Paid plan | Bridge requires a paid Proton plan (Mail Plus, Unlimited, etc.) |
MCP client | Latest | Claude Desktop, Cline, or any MCP-compatible host · claude.ai/download |
Supported on macOS, Windows, and Linux.
Linux runtime libraries
The native tray binding dynamically links against two GTK system libraries that are preinstalled on every modern desktop Linux distribution (Ubuntu ≥ 18.04, Fedora ≥ 34, Mint, Pop!_OS, Arch, etc.). No manual install is needed on a normal desktop system — just a note for server / container / minimal-WM deployments:
Runtime library | Package name |
|
|
|
|
If both are missing (headless server, container, SSH-only host), mailpouch's tray startup logs a skip reason and continues without the icon — the MCP server itself runs unaffected. macOS and Windows ship their native equivalents as part of the OS.
Proton Bridge ports
Bridge listens locally on:
Protocol | Host | Port |
SMTP (sending) |
|
|
IMAP (reading) |
|
|
Use
127.0.0.1, notlocalhost. On some systemslocalhostresolves to::1(IPv6), which Bridge does not listen on.
Installation
Option A — npm (recommended)
npm install -g mailpouchOr skip the install entirely — npx -y mailpouch runs the latest published version on demand, which is exactly what the canonical MCP client config below uses.
Option B — From source
git clone https://github.com/chandshy/mailpouch.git
cd mailpouch
npm install
npm run buildOptional companions
Install only if you plan to use the corresponding tool group:
Optional dep | Enables | Install |
|
|
|
|
| See |
SimpleLogin API key |
| Generate at app.simplelogin.io; paste in settings UI |
Tools in unconfigured groups return a clean configuration error rather than failing silently.
Setup Wizard
Run the settings server to complete first-time setup:
npx -y mailpouch-settings
# Then open http://localhost:8766The 6-step wizard walks you through everything automatically:
Welcome — overview, ToS acknowledgement, and prerequisites checklist
Bridge health check — live TCP test to ports 1025 and 1143; blocks progress until Bridge is reachable
Account — your Proton Mail address and Bridge password (Bridge app → Settings → IMAP/SMTP → Password — this is not your Proton login password)
Permission preset — choose what the AI is allowed to do (see table below)
Review — confirm your settings before saving
Done — displays the exact JSON snippet to paste into your MCP client config; optionally writes it for you automatically
Settings are saved to ~/.mailpouch.json with mode 0600 (owner read/write only). The Bridge password and SMTP token prefer the OS keychain when available.
Non-interactive setup (agents / CI)
When a browser/TUI wizard isn't an option, configure credentials from the command line — it writes the same ~/.mailpouch.json (+ keychain) the wizard does:
# password from stdin (keeps the secret out of the process list)
printf '%s' "$BRIDGE_PASSWORD" | npx -y mailpouch setup --username you@proton.me --password-stdin
# or from a file, or inline; optional non-default ports / cert
npx -y mailpouch setup --username you@proton.me --password-file ./bridge.pw \
[--imap-host 127.0.0.1 --imap-port 1143 --smtp-host 127.0.0.1 --smtp-port 1025] \
[--bridge-cert /path/cert.pem | --insecure]Then check the install end-to-end:
npx -y mailpouch doctor # human-readable diagnosis + next step; exit 0 when ready
npx -y mailpouch doctor --json # structured output for scripts
npx -y mailpouch status # is it running? ports, connection, approved agents (read-only)
npx -y mailpouch --help # all commands + flags + the config/log pathsdoctor reports the same state machine the always-available setup_status MCP tool returns: unconfigured → bridge-unreachable → pending-approval → ready, each with the exact action to advance. These commands print and exit — they never start a server, so they're safe to run alongside a live daemon. (Running mailpouch with no command starts the MCP stdio server, which is what your MCP client spawns.)
Claude Desktop Configuration (stdio)
The config file locations are:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Canonical entry — works whether or not mailpouch is globally installed:
{
"mcpServers": {
"mailpouch": {
"command": "npx",
"args": ["-y", "mailpouch"]
}
}
}This is the same JSON shown in llms.txt and README_FIRST_AI.md — use it everywhere. If you installed globally (npm install -g mailpouch) you may instead use "command": "mailpouch" with no args. Restart the client after saving.
If you cloned the repo instead of installing from npm, point the client at the built entry file directly (your path will differ):
{
"mcpServers": {
"mailpouch": {
"command": "node",
"args": ["/path/to/mailpouch/dist/index.js"]
}
}
}The settings wizard can also write the entry to your client config automatically — click Write to Claude Desktop on the Done step.
Multi-Account
More than one mail account can be configured in the same server — handy for juggling a personal Proton address, a work Proton address, and a generic IMAP account from a single MCP client.
The config file grows two fields alongside the existing connection block:
{
"accounts": [
{ "id": "primary", "name": "Personal", "providerType": "proton-bridge",
"smtpHost": "127.0.0.1", "smtpPort": 1025,
"imapHost": "127.0.0.1", "imapPort": 1143,
"username": "me@proton.me", "password": "<bridge-pw>" },
{ "id": "acct-7b1c", "name": "Work", "providerType": "imap", "...": "..." }
],
"activeAccountId": "primary"
}The Accounts tab in the settings UI handles add / edit / activate / delete. The server refuses to delete the last remaining account.
AccountManagerkeeps one{ imap, smtp, spec }triple per configured account. In a running daemon, saving a new active selection emits anactive-changedevent that rebinds active-account services and clears prior-account caches. Standalone settings (or a failed live rebind) reports that a restart is required.Tools accept an optional
account_idargument. When omitted, the call runs againstactiveAccountId; when present, the dispatcher routes to the named account. Agent grants can pin a client to a singleaccountIdviaconditions.Legacy single-account configs are migrated lazily: the first load with
accounts: []lifts the top-levelconnectionfields into aprimaryaccount. No manual migration step.
Canonical code: src/accounts/registry.ts, src/accounts/manager.ts, src/accounts/types.ts.
Remote / HTTP Transport
For headless boxes, phones, or sharing one Bridge across multiple devices, switch to HTTP transport. The same binary listens on a port instead of stdio.
Enable it via the Setup tab → Remote (HTTP) mode, or by setting these in ~/.mailpouch.json:
{
"connection": {
"remoteMode": true,
"remoteHost": "127.0.0.1",
"remotePort": 8788,
"remotePath": "/mcp",
"remoteTlsCertPath": "/path/to/cert.pem",
"remoteTlsKeyPath": "/path/to/key.pem",
"remoteOauthEnabled": true,
"remoteOauthIssuer": "https://mcp.example.com",
"remoteRateLimitPerSecond": 20,
"remoteRateLimitBurst": 40
}
}Auth is OAuth-only — every agent authenticates as its own client. There is no shared bearer token (it was removed because it bypassed per-agent gating and audit). A verified token always maps to a specific, gated, revocable agent identity. remoteMode refuses to start without remoteOauthEnabled. Two grant types share the one listener:
authorization_code+ PKCE-S256 (interactive agents) — MCP hosts self-register viaPOST /oauth/register(RFC 7591), discover endpoints viaGET /.well-known/oauth-authorization-server(RFC 8414) andGET /.well-known/oauth-protected-resource(RFC 9728), then complete a PKCE flow with automatic consent (no admin password —GET /oauth/authorizeissues a code immediately). The human gate is the per-agent Approve/Deny in the Agents tab: the issued token is inert until you approve the agent, and a pending request expires after 5 minutes.client_credentials(headless / service accounts) — cron, CI, and scheduled agents that can't do interactive consent. Issue a service account out-of-band, then log in with itsclient_id+client_secret:mailpouch agent issue --name nightly-triage --preset read_only # → prints client_id + client_secret ONCE; the matching grant is pre-approved (active). # also: mailpouch agent list / mailpouch agent revoke <client_id> # (or use the "+ Service account" button in the Agents tab) curl -s -u "$CLIENT_ID:$CLIENT_SECRET" \ -d grant_type=client_credentials https://mcp.example.com/oauth/token # → { "access_token": "…", "token_type": "Bearer", "expires_in": 86400 }
Rate limiting — token-bucket per caller (per IP for unauthed paths, per token key for /mcp). A compromised token can't DoS Bridge.
TLS — provide remoteTlsCertPath + remoteTlsKeyPath for HTTPS. Required for any non-loopback exposure.
A remote client config (after obtaining an access token via either grant) looks like:
{
"mcpServers": {
"mailpouch-remote": {
"url": "https://mcp.example.com/mcp",
"headers": { "Authorization": "Bearer <access_token>" }
}
}
}Connecting a client (stdio or HTTP). The Settings UI (Setup tab → Connect a client) and the first-run wizard both let you choose how an MCP client connects and write the entry for you:
Write to Claude Code merges a
mailpouchentry into~/.claude.jsonundermcpServers(and Write to Claude Desktop does the same forclaude_desktop_config.json).stdio — the client spawns its own mailpouch. The written entry sets
MAILPOUCH_FORCE_STDIO=1so it speaks stdio even when your config hasremoteMode: true. Don't run a stdio client alongside the shared HTTP daemon against the same Proton account — they'd contend for the one IMAP connection.HTTP — the client connects to the shared daemon at
/mcp(needsremoteMode+remoteOauthEnabledand the daemon running). The client performs an OAuth login and you Approve it once in the Agents tab.
Running mailpouch as a shared daemon (multiple apps at once). mailpouch holds one IMAP connection per account (a singleton lock), so two stdio instances for the same account can't run at the same time — the second exits. To use several clients together (e.g. Claude Code and Claude cowork, or headless agents), run one HTTP daemon and point every client at it:
mailpouch daemon # starts the shared HTTP daemon (forces HTTP; requires remoteOauthEnabled)
# optional: mailpouch daemon --host 0.0.0.0 --port 8788mailpouch daemon is user-started (run it in a tmux / login session or your own supervisor) — it is not an autostart. Then:
Interactive apps (Claude Code, Claude Desktop) connect over HTTP and you Approve each once in the Agents tab.
Headless / cowork hosts authenticate with a per-host service account (
mailpouch agent issue --name <host> --preset <preset>) over theclient_credentialsgrant.
All clients share the daemon's single IMAP connection — no singleton conflict, and each is independently gated, audited, and revocable.
While the daemon is running, the Settings "Connect an app" chooser only offers HTTP — the per-computer (stdio) option is disabled, because a stdio entry would spawn a second instance that collides with the daemon and fail to start. Issuing or re-issuing a service account (mailpouch agent issue) takes effect immediately — the running daemon picks it up on the next login, no restart. Revoking a service account (in the Agents tab) deletes its credential, so it stays revoked across restarts; to re-enable, re-issue it.
Environment variables
Configuration is stored in ~/.mailpouch.json and managed via the settings UI — not environment variables. The following env vars are available for advanced/optional overrides:
Variable | Default | Description |
|
| Override config file path |
|
| Scheduled email persistence file |
|
| Override log file path |
|
| Override pending escalations file path |
|
| Override escalation audit log path |
|
| Override reminder persistence file path |
|
| Override Proton Pass access audit log path |
|
| Override full-text-search index database path |
|
| Override per-agent grant store path |
|
| Override service-account (client_credentials) store path |
|
| Override per-agent tool-call audit log path |
| derived from host | Override the machine-binding secret used to encrypt at-rest credentials |
| unset | Force stdio for this spawn even if the config has |
| unset | Per-launch opt-in to localhost Bridge without a pinned cert |
|
| Tool-tier override: |
|
| Override settings UI HTTP server port |
Available Tools
83 canonical tools across 11 categories, plus 3 always-available meta-tools. Optional companion groups are listed only when configured; see src/config/schema.ts for the machine-checkable inventory.
Category | Tools | Default tier | Risk | Permission required |
Reading | 14 |
| safe | always available |
Sending | 4 |
| moderate |
|
Analytics | 4 |
| safe | always available |
System | 5 |
| safe | always available |
Drafts & Scheduling | 9 |
| moderate |
|
Folder Management | 5 |
| moderate |
|
Email Actions | 16 |
| moderate |
|
SimpleLogin Aliases (optional) | 16 |
| moderate | listed when API key is present |
Proton Pass (optional) | 4 |
| moderate | listed when a PAT is present; calls require |
Deletion | 3 |
| destructive |
|
Bridge & Server Control | 3 |
| destructive | mixed; |
Plus 3 always-available meta-tools: setup_status, request_permission_escalation, and check_escalation_status.
Notable tools worth calling out
Reading includes
get_thread,get_correspondence_profile, and thefts_*family (local SQLite FTS5 index — much faster than IMAP search for repeat queries).Drafts & Scheduling includes
remind_if_no_reply(queue an outbound, fire a follow-up reminder if no reply lands within N days),list_pending_reminders,cancel_reminder,check_reminders. JSONL persistence so reminders survive restarts.Bridge & Server Control — if
autoStartBridgeis enabled, the server launches Bridge automatically on startup and runs a 30 s watchdog that attempts up to 3 restarts on outage.shutdown_serverandrestart_serverare capped at 5/hr insupervised.
MCP Prompts
Pre-built prompt templates for common tasks:
Prompt | Description | Arguments |
| Review unread emails, assess urgency, suggest actions |
|
| Draft a contextual reply to an email thread |
|
| Summarize today's inbox: unread, key senders, action items | — |
| Identify mailing lists / newsletters; offer to archive or unsubscribe |
|
| Fetch all messages in a thread; produce a concise summary with open action items |
|
| Draft a new email to a specific recipient in the user's own voice, using a handful of recent sent emails as tone samples. Infers style (formality, greeting/sign-off habits, typical length) from the samples. |
|
Permission Presets
Preset | What's allowed | Best for |
Read-Only (default) | Read, search, analytics, connection status, logs, Bridge start | Starting out; untrusted or new agents |
Supervised | All tools enabled; reading unlimited; sending 200/hr, schedule 100/hr, bulk actions 100/hr; deletion 20/hr; folder delete 20/hr; server lifecycle 5/hr | Day-to-day agentic use |
Send-Only | Reading unlimited; send/forward/schedule 50/hr, remind_if_no_reply 100/hr; actions, deletion, folder writes, and bulk ops disabled | Agents that only need to compose and send |
Full Access | All tools, no rate limits | Trusted workflows where you review actions |
Custom | User-defined per-tool toggles and rate limits (set via the Permissions tab) | Fine-grained control beyond the 4 presets |
Change the preset at any time from the Permissions tab in the settings UI; changes take effect within 15 s without restart.
Human-Gated Escalation
The escalation system lets an agent request broader permissions without permanently changing your settings.
How it works:
The agent calls
request_permission_escalationwith a reason and the target preset it needs.A challenge appears as a banner in the Settings UI (above the tabs) and is also printed to the terminal.
You review the request, type
APPROVEin the confirmation field, and click Approve (or Deny).The agent polls with
check_escalation_statusand proceeds once approved.After 5 minutes, permissions revert automatically.
Security properties:
The agent requests via MCP; approval can only happen via browser or terminal — channels the agent cannot write to
You must type
APPROVEbefore the button activates — no accidental clicksCSRF-protected: the approval API requires a session token embedded only in the rendered HTML page
Rate-limited: max 5 escalation requests per hour, max 1 pending at a time
Audit trail: every request, approval, and denial is appended to
~/.mailpouch.audit.jsonlApprove from another device:
npx -y mailpouch-settings --lan
Settings UI
The settings UI starts automatically on http://localhost:8766 whenever your MCP client runs the server. A system tray icon (purple envelope) appears in your taskbar — right-click it to open the UI, disable it temporarily, or quit.
To run the settings UI standalone (useful for initial setup, headless / SSH systems, or a dedicated remote-mode host):
npx -y mailpouch-settings # auto-detects display; opens browser if available
npx -y mailpouch-settings --port 9000 # custom port (default: 8766)
npx -y mailpouch-settings --lan # bind to 0.0.0.0 (approve from phone/other device)
npx -y mailpouch-settings --browser # force browser UI even if no display detected
npx -y mailpouch-settings --tui # force interactive terminal UI
npx -y mailpouch-settings --plain # plain readline menus (no ANSI colors/escapes)
npx -y mailpouch-settings --no-open # start server but don't auto-open browserThe same standalone behaviour is available from the main binary via mailpouch --settings-only: it starts only the settings UI + tray (no MCP transport, no Bridge connect) and stays running until you quit it from the tray or with Ctrl-C. Unlike a bare mailpouch, it is safe to launch detached (autostart / nohup / a wrapper) — it does not tie its lifetime to stdin.
Tabs:
Setup — credentials, SMTP/IMAP hosts and ports, Bridge TLS certificate, Optional Integrations (SimpleLogin API key, Proton Pass PAT + CLI path), debug mode, auto-start Bridge, insecure-connection toggle, destructive-confirm toggle, desktop notifications toggle, auto-open approval window toggle, settings port
Accounts — per-account Bridge credentials; live active-account switching with an explicit restart fallback
Permissions — preset selector, per-tool enable/rate-limit toggles, tool-tier (
core/extended/complete), destructive-confirm toggleAgents — per-client (OAuth
client_id) approvable grants with folder allowlists, IP pins, per-tool rate caps, expiry, and account bindingStatus — server info, MCP config snippet, live connectivity check, escalation audit log, config reset
Pending escalation requests appear as a full-page banner above the tabs. A Logs tab appears automatically when debug mode is enabled. Most settings changes propagate to the running MCP server within 15 s; active-account switching explicitly reports when a restart is required.
Security
This server gives AI agents controlled access to sensitive email data. The security model has these layers:
Layer | Mechanism |
Permission gate | Every tool call checked against |
Tool tiering |
|
Rate limiting | Per-tool sliding-window limits in-process; per-caller token-bucket on the HTTP transport |
Destructive confirmation | MCP elicitation prompt (or required |
Escalation gate | Privilege increases require explicit human approval via a separate channel |
Audit log | Append-only log of all escalation events at |
OAuth 2.1 + PKCE-S256 | Spec-compliant DCR + automatic consent; per-agent Approve/Deny is the human gate (HTTP transport) |
CSRF protection | All mutating settings API calls require a session token (timing-safe comparison) |
Origin validation | Settings server validates |
Input validation | Email addresses, folder names, attachment sizes, hostnames, label names |
Injection prevention | CRLF stripped from all SMTP headers, subjects, filenames, custom headers |
TLS-strict Bridge | Refuses to connect to localhost Bridge without a pinned cert by default |
Bridge version floor | Warns when Bridge < |
SMTP backoff | Exponential backoff on abuse-signal SMTP responses (4xx 421/450/454 throttle codes) |
Config file isolation | Mode |
Memory safety | Email cache capped at 500 entries / 50 MB; rate-limiter buckets evicted when idle (fully refilled) |
Keychain storage | OS keychain preferred for Bridge password and SMTP token |
What agents cannot do:
Approve their own escalation requests
Bypass the permission gate (it runs in the server process, not the agent)
Read or modify
~/.mailpouch.jsondirectly (not an exposed tool)Erase the audit log
Inject headers into outgoing email via crafted subjects, filenames, or custom headers
Execute destructive tools without surfacing the intent to the user
Credentials: Stored in ~/.mailpouch.json with 0600 permissions (or in the OS keychain). Never commit this file. The settings UI never displays or transmits high-value secrets after they are first saved.
Agent Grants
The global permission preset gates what actions are allowed; the selected tool tier controls what is advertised; and an agent grant gates which MCP client may use that allowed surface. Every agent — local and remote — registers and must be approved. A remote MCP host completes OAuth Dynamic Client Registration and mailpouch creates a pending grant keyed by its client_id; a local stdio client (e.g. Claude Desktop) is registered at the MCP handshake, keyed by its self-reported client name (stdio:<hash>) and shown with a 🖥 local marker. Nothing that client calls will succeed until you approve it; approve once and a local client is remembered across relaunches. To restore the legacy "local client is auto-trusted" behavior, set gateLocalAgents: false (or MAILPOUCH_TRUST_LOCAL=1).
Grant lifecycle: pending → active → revoked | expired. Each grant carries:
Field | Purpose |
| Effective preset for this agent; intersected with the global preset (grants can never widen the ceiling) |
| Per-tool allow/deny that trumps the preset, still bounded by the global config |
| ISO-8601 auto-expiry; checked at call time |
| Restrict which IMAP folders the agent may touch |
| Allowed remote IPs (OAuth/bearer path only) |
| Per-tool hourly rate cap |
| Bind the agent to a single multi-account id |
Approve, deny, revoke, and "approve-with-conditions" all live in the Agents tab of the settings UI. The tab streams live updates over SSE from GET /api/notifications — new pending grants surface without a reload. When a new agent registers, mailpouch also auto-opens this tab in your browser (and fires a desktop notification + tray badge) so you can approve or deny the connection right away; the pending card shows the agent's name, registering IP, and time. The agent's tool calls stay blocked until you approve. When a new agent connects, mailpouch pops a native Approve/Deny dialog right on the screen where it runs (zenity/osascript/PowerShell) so you can decide without opening the tab — Approve grants your global preset, Deny revokes it (nativeApprovalDialog, default on). If no dialog tool is available (headless), it falls back to auto-opening this Agents tab in your browser (autoOpenApprovalWindow, default on) plus a desktop notification + tray badge. Once connected, the card also shows the agent's MCP handshake connection info — its self-reported client name + version, the transport, and a last-connected timestamp — captured at initialize (display-only; the agent's identity is its server-issued OAuth client_id, not the self-reported name).
Every agent authenticates as its own client — there is no shared bearer. The static bearer was removed because it had no per-agent identity (one secret, no gating, no audit). Remote mode requires OAuth (
connection.remoteMode: true+remoteOauthEnabled: true). Interactive agents register and you Approve/Deny them here (automatic consent — no human password; a pending request expires after 5 minutes). Headless agents (cron, CI) use a pre-approved service account (mailpouch agent issue …or the "+ Service account" button) and theclient_credentialsgrant. DeprecatedremoteBearerTokenandremoteOauthAdminPasswordvalues are ignored and scrubbed from config/keychain storage during startup migration.
Every gated tool call writes one row to an append-only JSONL audit log at ~/.mailpouch-agent-audit.jsonl (mode 0600). Rows carry a truncated sha256 argHash — never argument values, never response bodies — so "same call repeated" patterns are observable without creating a parallel on-disk copy of your email. The log rotates at 10 MB and keeps 3 gzipped generations.
Caller identity propagates through the dispatcher via AsyncLocalStorage (see src/agents/caller-context.ts); the caller's clientId is always a real per-agent identity (pmc_… for OAuth clients and service accounts, stdio:… for local stdio agents). Local stdio agents are gated too (gateLocalAgents, default on) — they register and must be approved like any other agent.
Canonical code: src/agents/grant-store.ts, grant-manager.ts, audit.ts, caller-context.ts, notifications.ts, registry.ts.
Notification Channels
Grant-state transitions (grant-created / -approved / -denied / -revoked / -expired) fan out through an in-process NotificationBroker to two optional channels:
Desktop toasts — platform-native, no extra dependency. macOS shells to
osascript, Linux tonotify-send(libnotify), Windows topowershell.exedriving the WinRT toast API. Fire-and-forget; missing tooling degrades to a debug log.Outbound webhooks —
WebhookDispatcherPOSTs a JSON body to each configured endpoint. Format defaults to CloudEvents 1.0; URLs onhooks.slack.comauto-select the Slack shape anddiscord.com/discordapp.comauto-select the Discord shape (explicitformat: "raw"is also available). When an endpoint has a secret configured, every body is HMAC-signed asX-Mailpouch-Signature-256: sha256=<hex>(GitHub-webhook convention). Delivery retries up to 8 times with exponential backoff (1 / 2 / 4 / 8 / 16 / 32 / 64 / 128 s) plus ±20 % jitter; 4xx responses other than 408 and 429 stop retries immediately.
Canonical code: src/notifications/desktop.ts, src/notifications/webhooks.ts.
Troubleshooting
"Connection refused" on Bridge ports
Confirm Proton Bridge is running and signed in.
Use
127.0.0.1instead oflocalhostin all host fields.Verify ports are listening:
lsof -i :1025 -i :1143(macOS/Linux) ornetstat -ano | findstr "1025\|1143"(Windows).Some VPNs block localhost port binding — try disabling the VPN.
"Authentication failed" or IMAP login error
Use the Bridge password, not your Proton Mail login password.
Find it in the Bridge app: Settings → IMAP/SMTP → Password (a long random string).
If you recently reinstalled Bridge, it generates a new password — update it in the settings UI.
"Tool blocked by permission policy"
Open the settings UI → Permissions tab and switch to Supervised or Full Access.
Per-tool toggles let you enable individual tools without changing the overall preset.
The agent can call
request_permission_escalationfor temporary access.
"Certificate error" or TLS handshake failure
Export the Bridge TLS certificate: Bridge app → Settings → Export TLS certificates.
Set the path in the settings UI under Setup → Bridge TLS Certificate.
The server refuses to connect to a localhost Bridge without a pinned TLS certificate — this matches Proton Bridge's own v3.21.2+ hardening. If you cannot provide a cert, set Allow insecure Bridge connection under Setup (or launch with
MAILPOUCH_INSECURE_BRIDGE=1) to opt back into the legacy behavior. Configs that predate this change are grandfathered into the legacy mode with a startup warning until the opt-in is set explicitly.
Bridge version warning on startup
The server issues an IMAP
IDrequest after connect and warns when Bridge is older than 3.22.0 (the recommended minimum); the version probe is warn-only and does not block connection. Upgrade from the Bridge app → Check for updates.
Tool list looks short / missing tools
Check your tool tier under Permissions.
coreexposes 30 tools;extendedexposes 80;completeexposes up to 86, with unconfigured SimpleLogin and Pass tools omitted.SimpleLogin and Proton Pass tools (
alias_*,pass_*) appear once their API key or PAT is configured. Thefts_*tools remain listed and requirebetter-sqlite3when called.
Remote / HTTP client returns 401
The
Authorization: Bearer <token>header must carry an OAuth access token, not a pre-shared secret — the static bearer was removed. For interactive clients, check that/oauth/registersucceeded, the agent is approved in the Agents tab, and the token has not been revoked or expired.For headless clients, confirm the service account exists (
mailpouch agent list) and thatPOST /oauth/tokenwithgrant_type=client_credentialsreturned anaccess_token. A 401invalid_clientmeans theclient_id/client_secretpair is wrong.The
WWW-Authenticateheader on the 401 response carries the failure reason per RFC 6750.
Claude Desktop doesn't show mailpouch tools
Confirm the
mcpServersblock is valid JSON (no trailing commas).Fully quit and reopen Claude Desktop.
Check MCP logs: Help → Show Logs.
Verify the server starts manually:
npx -y mailpouch— it should stay running silently.
Analytics show zero or empty data
Run
sync_emailsfirst to populate the cache.Response time stats only appear when sent emails have
In-Reply-Toheaders matching inbox messages.
Development
git clone https://github.com/chandshy/mailpouch.git
cd mailpouch
npm install
npm run build # compile TypeScript to dist/
npm run dev # watch mode (recompiles on save)
npm run test # run the Vitest suite
npm run test:coverage # coverage report
npm run lint # TypeScript type check (tsc --noEmit)
npm run settings # start standalone settings UI (after build)Project structure
src/
index.ts # Unified daemon: MCP server (up to 86 tools, resources, prompts) + settings + tray
settings-main.ts # Standalone settings UI CLI (for headless/SSH environments)
# (Tray moved to native/tray/ — napi-rs binding around tauri-apps/tray-icon)
config/
schema.ts # Tool registry, categories, tiers, destructive set, response limits
loader.ts # Config load/save, preset builder, keychain migration
permissions/
manager.ts # Per-tool permission checks and rate limiting
escalation.ts # Human-gated escalation challenge system
security/
keychain.ts # OS keychain integration (@napi-rs/keyring)
memory.ts # Credential wipe helpers
services/
smtp-service.ts # Email sending via Nodemailer (with abuse-signal backoff)
simple-imap-service.ts # Email reading via ImapFlow
analytics-service.ts # Email analytics computation
scheduler.ts # Scheduled email delivery (JSONL persistence)
reminder-service.ts # remind_if_no_reply queue
fts-service.ts # Local SQLite FTS5 index (optional better-sqlite3)
simplelogin-service.ts # SimpleLogin alias API client
pass-service.ts # Proton Pass via pass-cli subprocess
settings/
server.ts # Browser-based settings UI server
security.ts # CSRF, origin validation, TLS
tui.ts # Terminal UI for settings
transports/
http.ts # HTTP transport with required OAuth 2.1 authentication
oauth-handlers.ts # /.well-known + /oauth/* (RFC 7591/8414/9728)
oauth-store.ts # Client / authorization-code / token store
rate-limit.ts # Token-bucket per-caller limiter
utils/
helpers.ts # ID generation, email validation, log sanitisation
logger.ts # Structured log store
tracer.ts # Lightweight request tracing
backoff.ts # Exponential backoff helper
types/
index.ts # Shared TypeScript typesWorks Best With…
mailpouch is deliberately scoped to email. Chain it with these MCP servers to cover the rest of an agentic workflow:
MCP server | Use with mailpouch |
| Save attachments to disk; read local files to attach to outgoing mail |
| Follow links the agent reads in an email without leaving the chat |
Turn an email into a task; complete triage in one pass | |
File an issue from a bug-report email with full context | |
Obsidian-vault MCPs (example) | Archive important threads to notes with linked metadata |
The project is intentionally Proton-focused; the positioning is "best email surface for your agent." Pair it with whichever non-email MCPs fit your workflow rather than waiting for this server to grow a second home.
Acknowledgements
This project is built on the foundation originally created by Hawk94, whose initial IMAP/SMTP integration, tool architecture, and test setup made this project possible. The original work was published as barhatch/protonmail-mcp-server.
License
MIT — see LICENSE
Unofficial third-party server. Not affiliated with or endorsed by Proton AG.
Available Tools
66 toolsarchive_emailArchive EmailA
Move an email to the Archive folder. Convenience wrapper for move_email targeting Archive. Note: labels are lost when an email is moved — label copies in Labels/ folders are not preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond annotations by disclosing that labels are lost when moving an email, which is critical behavioral information. Annotations only indicate non-readonly and non-destructive, but the description adds the side effect of label loss.
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 extremely concise, using two sentences to convey purpose, relationship to move_email, and a critical side effect. It is front-loaded and wastes no 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 that an output schema exists and annotations are present, the description adequately covers the essential behavioral detail (label loss). However, it could mention edge cases like what happens if the email is already archived.
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 67% coverage with descriptions for account_id and sourceFolder, but the tool description does not add any extra meaning or usage guidance for the parameters 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 clearly states the tool moves an email to the Archive folder and explicitly distinguishes it as a convenience wrapper for move_email targeting Archive, providing a specific verb and 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?
The description mentions it is a convenience wrapper for move_email but does not provide explicit guidance on when to use this tool versus alternatives like move_to_folder or move_to_spam. No when-not advice is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_delete_emailsBulk Delete EmailsADestructive
Delete multiple emails by MOVING them to Trash — mail is never permanently deleted and stays recoverable from Trash. Emits progress notifications if a progressToken is provided in _meta. Returns success/failed counts. Requires { confirmed: true }. Pass sourceFolder whenever the UIDs came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | ||
| confirmed | No | Must be true to execute. See requireDestructiveConfirm. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as destructive (destructiveHint=true). The description adds value by explaining that deletion is recoverable (moved to Trash), that progress notifications are emitted if a progressToken is provided, and that return counts are provided. 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 extremely concise: two sentences plus a brief note about progress and returns. Every sentence adds essential information, with the core action and safety behavior 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?
Given the tool's complexity (4 parameters, output schema exists), the description fully covers the action, confirmation requirement, folder parameter context, progress notifications, and return type. No gaps for an agent to misinterpret.
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 75% (emailIds lacks description). The description compensates by explaining the requirement for `confirmed` and the rationale for `sourceFolder` (folder-scoped UIDs). This adds meaning beyond the schema's parameter names and types.
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 verb ('Delete multiple emails') and the resource ('emails'), and importantly clarifies that it moves emails to Trash, not permanently deletes. This distinguishes it from siblings like 'delete_email' (single) or 'empty_trash' (permanent).
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 requires `confirmed: true` to execute, and advises passing `sourceFolder` when UIDs come from a folder other than INBOX. It provides clear context for use, though it could explicitly state when not to use it vs. siblings like 'bulk_move_emails'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_mark_readBulk Mark Emails Read/UnreadAIdempotent
Mark multiple emails as read or unread. Emits progress notifications. Returns success/failed counts. Pass sourceFolder whenever the UIDs came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| isRead | No | ||
| emailIds | Yes | Array of email UIDs | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it mentions progress notifications, return counts, and warns about IMAP UID scoping and the risk of silent no-ops with 'All Mail'. The idempotentHint and destructiveHint are also consistent.
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, each adding essential information. It is front-loaded with the core action and quickly covers critical usage advice without unnecessary detail.
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 action, return format, progress notifications, and a key caveat about sourceFolder. Given the output schema likely documents return structure, it is reasonably complete, though it could mention error handling or when to prefer this over single mark_read.
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 description adds meaning to the sourceFolder parameter by explaining the folder-scoping issue and warning against 'All Mail'. It also notes the default isRead value. With 75% schema coverage, the description provides valuable extra guidance.
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 marks multiple emails as read or unread, distinguishing it from single-email alternatives like mark_email_read. It also mentions progress notifications and return 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?
The description advises passing sourceFolder when UIDs are from a non-INBOX folder, which is critical for correct operation. However, it does not explicitly compare to other bulk tools like bulk_star or bulk_move.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_move_emailsBulk Move EmailsA
Move multiple emails to a folder in one call. Moving to Trash or Spam requires { confirmed: true }. Emits progress notifications if a progressToken is provided in _meta. Returns success/failed counts. Pass sourceFolder whenever the UIDs came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email UIDs to move | |
| confirmed | No | Must be true when targetFolder is Trash or Spam. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. | |
| targetFolder | Yes | Destination folder path |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses progress notifications with progressToken, return format (success/failed counts), potential silent no-op without correct sourceFolder, and no-op when moving to same folder. These are important behaviors beyond the annotations (which only indicate readOnly=false, etc.).
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?
Every sentence adds unique information; no redundancy. Purpose is front-loaded. The description is compact yet covers all critical aspects.
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 5 parameters, 100% schema coverage, and presence of an output schema (implied by return mention), the description sufficiently covers usage, edge cases, and behaviors. No gaps for a tool of this 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 100%, but description adds value: explains that emailIds are UIDs, clarifies sourceFolder's role with IMAP scoping and pitfalls, and reiterates the confirmed requirement for Trash/Spam. This 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 starts with 'Move multiple emails to a folder in one call,' clearly stating the verb (move) and resource (emails). It distinguishes from siblings like move_email (single) and bulk_move_to_label (different target type).
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 conditions: requires 'confirmed: true' for Trash/Spam, and advises to pass sourceFolder when UIDs are from non-INBOX folders, warning against 'All Mail'. Does not explicitly compare to alternatives like single move, but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_move_to_labelAdd Label to EmailsA
Add a label to multiple emails. Each email remains in its original folder and also appears in Labels/{label}; use bulk_move_emails only when messages should leave their source folder. Progress notifications are sent for large batches.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Label name without prefix | |
| emailIds | Yes | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=false, idempotentHint=false, destructiveHint=false, indicating a non-destructive mutation. The description confirms by stating 'Each email remains in its original folder and also appears in Labels/{label}', which aligns with and adds detail to the annotations. 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, each serving a purpose: first defines action and effect, second provides usage guidance and a note about progress. Concise 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?
Given the presence of an output schema and the clear explanation of behavior, sibling differentiation, and large-batch notifications, the description is complete for this tool's 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 75% (3 of 4 parameters described). The description adds the label format detail ('Labels/{label}') beyond the schema's 'Label name without prefix', but the sourceFolder parameter is not mentioned in the description. The baseline is 3 due to high schema coverage, and the description adds only marginal extra meaning.
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 'Add a label to multiple emails' and explicitly distinguishes from the sibling bulk_move_emails by noting when to use that alternative. This provides a specific verb-resource pair with clear 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?
The description explicitly tells when to use this tool ('Each email remains in its original folder') versus the alternative bulk_move_emails ('only when messages should leave their source folder'). It also mentions progress notifications for large batches, guiding usage expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_remove_labelBulk Remove Label from EmailsA
Remove a label from multiple emails. Emails are removed from Labels/{label} but remain in their original folders. The UIDs passed must be the UIDs inside Labels/{label} — Labels/ folders have their own UID space, so INBOX UIDs will silently miss.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Label name to remove | |
| emailIds | Yes | Array of UIDs inside Labels/{label} | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals that the operation is non-destructive to emails (they remain in folders) and highlights the UID space nuance. This adds valuable context beyond the annotations (readOnlyHint=false, destructiveHint=false). 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?
The description is concise with two focused sentences. Each sentence serves a purpose: first states the action, second provides critical behavioral details. 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 presence of an output schema and the straightforward nature of the tool (removing a label from emails), the description covers the key caveat (UID spaces) and the effect. The parameter descriptions in the schema are also complete, making the overall definition comprehensive.
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 by explaining why emailIds must be from the label folder, reinforcing the schema's description. It also clarifies that the operation does not affect original folders.
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 (remove a label from multiple emails) and specifies the effect (emails remain in original folders). It also provides a critical distinction from siblings by explaining the UID space uniqueness.
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 guidance that UIDs must come from Labels/{label} and warns that using INBOX UIDs will silently miss. It does not explicitly state when not to use this tool versus alternatives like remove_label, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bulk_starBulk Star/Unstar EmailsAIdempotent
Star or unstar multiple emails. Emits progress notifications. Returns success/failed counts. Pass sourceFolder whenever the UIDs came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailIds | Yes | Array of email UIDs | |
| isStarred | No | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | Yes | |
| failed | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond annotations by stating that it emits progress notifications and returns success/failed counts. It also reveals the behavioral nuance of sourceFolder scoping. Annotations already indicate non-readOnly and non-destructive, and description complements them. It does not explicitly mention idempotency, but idempotentHint is true.
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 redundancy. Each sentence serves a distinct purpose: stating the core action, mentioning side effects (progress notifications, return counts), and providing crucial usage guidance. The 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?
Given the tool's complexity (bulk operation with folder scoping) and the presence of an output schema, the description covers main behavioral aspects and the critical sourceFolder parameter. It could be more explicit about when to use this tool versus the singular star_email, but overall it provides sufficient context for correct 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?
The description compensates for the missing schema description of isStarred by implying its role (star/unstar). It also reinforces the critical sourceFolder parameter with detailed usage guidance, adding meaning beyond the schema. Schema coverage is 75%, and the description fills gaps effectively.
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 'Star or unstar multiple emails,' specifying the verb (star/unstar) and resource (emails) in bulk. It also mentions progress notifications and return counts, adding clarity. It effectively distinguishes from sibling tools like star_email by emphasizing the bulk aspect.
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 for using sourceFolder when UIDs come from a folder other than INBOX, including a warning about 'All Mail.' However, it does not contrast with the singular star_email tool or specify when not to use this tool, leaving some room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_reminderCancel ReminderAIdempotent
Cancel a pending no-reply reminder by ID. Silently returns false if the ID is unknown or the reminder already fired.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| reminder_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate non-readOnly (writes), idempotent, and non-destructive. The description adds value by disclosing that 'silently returns false if the ID is unknown or the reminder already fired', which reveals edge-case behavior not captured in 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 efficient sentences front-load the action and add critical behavioral nuance. No redundancy or unnecessary words. 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 simple tool with two parameters and an output schema, the description captures the essential behavior and failure cases. It could mention the return type (likely boolean) but is otherwise complete given the low 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 only 50% (account_id has description, reminder_id lacks one). The description does not elaborate on either parameter beyond mentioning the ID in the action. It fails to compensate for the missing schema documentation, leaving the reminder_id parameter semantically underdefined.
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 'Cancel' and the resource 'pending no-reply reminder by ID', specifying both the action and the target. This distinguishes it from sibling tools like 'check_reminders' or 'list_pending_reminders'.
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 use for canceling a specific reminder by ID, but does not explicitly state when to use or not use this tool compared to alternatives. No exclusions or prerequisites are mentioned, but the context is clear enough for its simple purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_scheduled_emailCancel Scheduled EmailAIdempotent
Cancel a pending scheduled email before it is sent. Returns false if the ID is not found or the email has already been sent.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Schedule ID from schedule_email or list_scheduled_emails | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint=true and destructiveHint=false. Description adds that cancel returns false if ID not found or email sent, clarifying safety and idempotency. Provides enough 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?
Two sentences: first defines action and target, second explains return behavior. No unnecessary words. Perfectly 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 cancellation tool with clear annotations and a well-documented schema, the description is complete. It explains what happens under different conditions (ID found/sent or not) and implies the prerequisite steps (having scheduled an email). 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?
Input schema has 100% description coverage with clear explanations for both parameters. The tool description does not add further information, but the schema already does the job. Baseline score 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?
Clearly states the tool cancels a pending scheduled email. The verb 'cancel' and resource 'pending scheduled email' are specific and distinct from sibling tools like schedule_email and list_scheduled_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?
Implies usage when an email has been scheduled but not yet sent. Mentions return false conditions for missing or already-sent emails. The id parameter description further guides obtaining IDs from schedule_email or list_scheduled_emails. Lacks explicit 'do not use if already sent' but is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_escalation_statusCheck Escalation StatusARead-onlyIdempotent
Check whether a pending permission escalation has been approved, denied, or has expired. Poll this after calling request_permission_escalation.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| challenge_id | Yes | The challenge ID returned by request_permission_escalation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| newTools | No | |
| expiresAt | No | |
| resolvedAt | No | |
| resolvedBy | No | |
| targetPreset | No | |
| currentPreset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description confirms the read-only polling behavior and adds the statuses checked. No contradiction; it adds moderate 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 short, action-oriented sentences. No redundant phrases. 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?
The description covers the tool's purpose and usage pattern. The output schema exists, so explaining return values is unnecessary. Completeness is high for this simple polling 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% and the schema describes both parameters adequately. The description does not add further 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?
The description uses a specific verb ('Check') and resource ('escalation status'), and mentions three possible outcomes (approved, denied, expired), which clearly distinguishes it from sibling tools like request_permission_escalation.
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 instructs to poll after calling request_permission_escalation, providing clear usage context. It does not list exclusions or alternatives, but the polling nature is self-explanatory.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_remindersCheck RemindersA
Return every pending reminder whose deadline has passed. Each returned reminder is transitioned to 'fired' status so it won't appear in subsequent calls. The agent can then search INBOX for replies to messageId and decide whether to surface the reminder to the user.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| fired | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show readOnlyHint=false, idempotentHint=false, destructiveHint=false. Description adds context by disclosing the transition to 'fired' status and that reminders won't appear in subsequent calls, which is consistent. Provides behavioral context beyond annotations without 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, highly concise and front-loaded with core action. Every sentence adds value: action, side effect, and follow-up guidance. 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 presence of an output schema (not shown), the description adequately covers purpose, side effects, and next steps. It could mention that the tool returns the reminders, but the output schema likely handles that. Overall, complete for a tool with few parameters and no nested objects.
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% for the only parameter (account_id) with a clear description. Tool description does not add further information about the parameter, so 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?
Description clearly states verb 'return' and resource 'pending reminders whose deadline has passed'. It distinguishes from siblings like 'list_pending_reminders' by explaining the transition to 'fired' status, making it specific and 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?
Description implies usage for checking overdue reminders and suggests follow-up action (search inbox), but does not explicitly state when to use this tool versus alternatives like 'list_pending_reminders' or 'cancel_reminder'. Lacks exclusions or comparative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_cacheClear CacheAIdempotent
Clear all in-memory caches (email message cache, folder cache, analytics cache). Forces fresh IMAP fetches on next access. Use if you suspect stale data. Does NOT rebuild the on-disk FTS index — run fts_rebuild to refresh fts_search results.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate idempotentHint=true and destructiveHint=false. Description adds specifics: clears specific caches and forces fresh IMAP fetches on next access. Provides good 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?
Three short sentences. Front-loaded with action and purpose. No redundant information. 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?
Given the tool's simplicity (one optional parameter, output schema present), the description covers purpose, when to use, what it does, and what it doesn't do. Complete for an AI 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?
Only one parameter (account_id) with 100% schema coverage. The schema description fully explains it. Description does not add extra meaning, 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?
Description explicitly states the tool clears all in-memory caches (email message cache, folder cache, analytics cache) and forces fresh IMAP fetches. It also distinguishes from fts_rebuild by stating what it does not do.
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?
Clearly says 'Use if you suspect stale data.' Also explicitly states when not to use: 'Does NOT rebuild the on-disk FTS index — run fts_rebuild to refresh fts_search results.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderCreate FolderA
Create one new IMAP mailbox. Use Folders/Name for a custom folder or Labels/Name for a label; the path must be unused across both namespaces. Use rename_folder to change an existing mailbox. Returns success after Proton Bridge accepts the create; create labels before adding them with move_to_label.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| folderName | Yes | Folder path to create (e.g. Folders/Archive, Labels/Work) |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only show readOnlyHint=false, destructiveHint=false, idempotentHint=false. Description adds that the path must be unique across namespaces and that success is returned after Bridge acceptance, providing useful 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?
Two sentences, front-loaded with the core action, no redundant words. Each sentence adds necessary 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?
With full schema coverage and annotations, description covers creation, naming, return behavior, and related operations. Could mention error conditions like duplicate path, but overall 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 already fully describes both parameters (100% coverage). Description adds format examples (e.g., Folders/Archive) and uniqueness requirement, which adds slight value but does not substantially exceed schema documentation.
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 'Create one new IMAP mailbox' and distinguishes from rename_folder by mentioning it as an alternative for changing existing mailboxes.
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 Folders/Name or Labels/Name, name must be unused, and advises creating labels before adding with move_to_label. Also references rename_folder as alternative for modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_emailDelete EmailADestructive
Delete an email by MOVING it to Trash — mail is never permanently deleted and stays recoverable from Trash. An email already in Trash is left in place. Requires { confirmed: true }. Pass sourceFolder whenever the UID came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| confirmed | No | Must be true to execute. See requireDestructiveConfirm. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (destructiveHint: true, readOnlyHint: false), the description adds that the action is reversible (moves to Trash, not permanently deleted) and idempotent for already-trashed emails. It also explains the confirmation requirement.
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-loading the key action and behavior, with no unnecessary words. 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?
Given the tool has an output schema (implicitly covering return values) and the description covers purpose, usage conditions, parameter guidance, and behavioral nuances, it is fully complete for an AI 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 description adds meaning for 'confirmed' and 'sourceFolder' parameters, explaining their necessity and usage context. The schema already covers the other parameters (emailId, account_id) with adequate descriptions, so the additional value is moderate.
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 moves an email to Trash (not permanent deletion) and specifies behavior for already-trashed emails. This distinguishes it from sibling tools like empty_trash or permanent delete actions.
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 guidance on requiring 'confirmed: true' and passing 'sourceFolder' when UIDs come from non-INBOX folders. However, it does not explicitly differentiate from the sibling tool 'move_to_trash', which may cause confusion about when to use which.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_folderDelete FolderADestructive
Delete an empty folder or label. Protected system folders (INBOX, Sent, Drafts, Trash, Spam, Archive, All Mail, Starred) cannot be deleted. Requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed | No | Must be true to execute when confirmation is required. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| folderName | Yes | Folder path to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description adds valuable behavioral constraints: folders must be empty, system folders are protected, and a confirmation parameter is required. 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?
Two sentences, front-loaded with purpose, each sentence adds essential information with no redundancy or 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?
The description covers the core action, preconditions (empty, not protected), and requirement (confirmed). With an output schema present, return values are not needed. Minor omission: what happens if preconditions fail, but likely implied.
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 3. The description mentions the confirmed requirement but essentially restates the schema description. No additional meaning is added for folderName or account_id.
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 ('Delete') and the target resource ('empty folder or label'), and distinguishes from siblings by specifying the 'empty' condition and listing protected system folders that cannot be deleted.
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 mentions the confirmation requirement and protected folders, but does not explicitly guide when to use this tool versus alternatives like move_to_trash or empty_trash, leaving the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_attachmentDownload AttachmentARead-only
Download the binary content of an email attachment as a base64-encoded string. Use get_email_by_id first to see available attachments and their indices (0-based). Provide the message folder to avoid a cross-folder UID collision; it is required for folder-restricted agents.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder the email lives in. Required for folder-restricted agents and recommended for all callers because IMAP UIDs are per-folder. | |
| email_id | Yes | IMAP UID of the email | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| attachment_index | Yes | 0-based index of the attachment (from get_email_by_id attachments array) |
Output Schema
| Name | Required | Description |
|---|---|---|
| size | Yes | |
| content | Yes | Base64-encoded attachment content |
| encoding | Yes | |
| filename | Yes | |
| contentType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. The description adds the behavioral detail that the output is base64-encoded content and explains why folder is needed. It does not contradict annotations and provides clear 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?
Three sentences, no fluff. The first sentence clearly states the purpose. Each sentence adds essential information: output format, prerequisite, and folder parameter guidance.
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 output schema exists (not shown but context indicates true), so return values are covered. The description explains the output format (base64), prerequisite step (get_email_by_id), and the folder parameter need. This is complete for a download 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%, so baseline is 3. The description adds value by cross-referencing get_email_by_id for attachment_index, explaining the rationale for folder, and clarifying account_id optionality. It provides meaning 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 tool downloads binary content as base64-encoded string. It specifies the resource (email attachment) and the output format, and distinguishes from siblings by mentioning the prerequisite use of get_email_by_id to locate attachments.
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 instructs to use get_email_by_id first to see attachments and indices. It also explains the folder parameter requirement for folder-restricted agents and the cross-folder UID collision reason. However, it does not discuss alternative tools or 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.
empty_trashEmpty TrashADestructive
PERMANENTLY delete every message in the Trash mailbox. This is the only operation that bypasses the move-to-Trash safety net — purged mail is UNRECOVERABLE. It only ever touches the Trash mailbox, never live mail. Requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed | No | Must be true to execute. Purged Trash mail is unrecoverable. See requireDestructiveConfirm. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond annotations: emphasizes 'PERMANENTLY', 'UNRECOVERABLE', and 'bypasses the move-to-Trash safety net'. Clearly conveys destructive nature and requirement for confirmation.
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. Front-loaded with the critical purpose and severity. 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, usage, behavioral details, and parameter requirement. With output schema present, return value explanation is unnecessary. Complete for a low-complexity 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%. Description adds context that 'confirmed' must be true and stresses unrecoverability, reinforcing schema info. Provides slight additional meaning.
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 'PERMANENTLY delete' and resource 'every message in the Trash mailbox'. Distinct from siblings like move_to_trash and delete_email by specifying it bypasses the safety net and empties the entire trash.
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 (permanent deletion of all trash) and that it only touches Trash mailbox, never live mail. However, no explicit alternatives when not to use, though implication is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_action_itemsExtract Action ItemsARead-only
Scan a single email's body for action-item-looking lines (bullets with action verbs, TODO:/ACTION: markers, @mentions) and return a structured list with best-effort assignee and due-date fields. Heuristic — not a replacement for a real task extractor, but useful for quick triage.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder the email lives in. Providing this avoids UID collisions across folders. | |
| email_id | Yes | IMAP UID from get_emails / search_emails | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| action_items | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true, and description adds behavioral context: it's heuristic, best-effort on assignee/due-date, and non-destructive. It does not contradict annotations and provides sufficient transparency about the tool's limitations and 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, no wasted words. Front-loaded with the core function, immediately followed by caveats. 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 3 parameters, presence of output schema, and readOnlyHint annotation, the description is complete. It explains what the tool does, its limitations, and usage context without needing to detail return values (handled by 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 description coverage is 100% with each parameter clearly described (folder, email_id, account_id). The tool description does not add additional meaning beyond what the schema provides, so 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?
Description clearly states it scans an email body for action-item-looking lines (bullets, TODO markers, @mentions) and returns structured list. Distinguishes itself from a real task extractor by noting it's heuristic and for quick triage. This leaves no ambiguity about 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?
Explicitly says it's not a replacement for a real task extractor and useful for quick triage, giving when-to-use and when-not-to-use guidance. However, it does not mention specific alternatives or sibling tools like extract_meeting for comparison, so it could be more explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
extract_meetingExtract Meeting from ICSARead-only
Parse an iCalendar (ICS) attachment or inline VCALENDAR block out of an email and return structured meeting details. Returns { meeting: null } when no ICS block is found. Supports RFC 5545 line folding and the common VEVENT properties (SUMMARY, DTSTART, DTEND, LOCATION, ORGANIZER, ATTENDEE, DESCRIPTION, RRULE).
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder the email lives in. Providing this avoids UID collisions across folders. | |
| email_id | Yes | IMAP UID from get_emails / search_emails | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| meeting | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds value by disclosing that the tool returns null when no ICS block is found and supports RFC 5545 line folding and specific VEVENT properties. 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 (two sentences), front-loaded with the core action, and every sentence adds meaningful information. 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?
Given the presence of an output schema (inferred from description), the description adequately covers input and behavior. It mentions supported properties and return format for missing ICS. Minor gap: does not mention possible errors or limitations (e.g., unsupported properties).
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 descriptions for all parameters. The tool description does not add significant meaning beyond what the schema provides; it focuses on the tool's overall behavior rather than parameter details.
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: parse an ICS file or inline VCALENDAR from an email and return structured meeting details. It specifies the return value when no ICS is found, distinguishing it clearly from sibling extraction tools like extract_action_items.
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 context by naming the input (email with ICS), but does not explicitly provide when-to-use or when-not-to-use guidance relative to sibling tools (e.g., extract_action_items). No exclusions or alternatives are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forward_emailForward EmailA
Forward an email to a new recipient. Original message is included as quoted content. Standard email headers (From, Date, Subject) are preserved in the forward body. Optionally prepend a message before the forwarded content.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient address(es), comma-separated | |
| folder | No | Folder the original message lives in. Providing this avoids UID collisions across folders. | |
| emailId | Yes | UID of the email to forward | |
| message | No | Optional message to prepend before the forwarded content | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it is not readOnly, not idempotent, not destructive. The description adds value by detailing that original headers are preserved and forwarded content is quoted, and optionally a message can be prepended. This provides useful 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?
Two concise sentences that front-load the primary action and key behaviors. No redundant or 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 high schema coverage, annotations, and presence of an output schema, the description sufficiently explains the forward action behavior including quoting and optional message. No obvious gaps for this type of 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 baseline is 3. The description does not add new meaning to parameters beyond what the schema provides; it only mentions the optional message prepending which aligns with the 'message' parameter.
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 forwards an email to a new recipient, with specific details about original message inclusion and header preservation. This distinguishes it from sibling tools like reply_to_email or send_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?
The description implies use for forwarding but does not explicitly mention when to use or avoid this tool compared to alternatives like reply_to_email, send_email, or move_to_trash. No exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fts_rebuildRebuild Local FTS IndexAIdempotent
Clear the local FTS5 index and rebuild it from the messages currently cached by the analytics layer (INBOX + Sent). Intended for use after major mailbox changes or when fts_search returns stale results. Returns the number of messages indexed.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| dbPath | No | |
| indexed | No | |
| messageCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description claims to 'Clear the local FTS5 index' which is destructive, but annotations set destructiveHint=false. This is a direct contradiction. Annotations and description are inconsistent, misleading the agent about side 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?
Three sentences, front-loaded with action and resource, no redundant information. Each sentence adds value: purpose, usage guidance, output.
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 simple input (one optional param), output schema exists (implied return value), and description covers purpose, usage, and result. No gaps for this tool's 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 100% with one optional parameter (account_id) already well-described in schema. Description does not add new parameter meaning beyond what schema provides, meeting 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?
Description uses specific verb 'Clear and rebuild' and identifies resource 'local FTS5 index' with scope 'from messages cached (INBOX + Sent)', clearly distinguishing from siblings like fts_search and fts_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?
Description explicitly states when to use: 'after major mailbox changes or when fts_search returns stale results'. Does not mention alternatives or when not to use, but context is clear for typical scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fts_searchFull-Text Search (Local Index)ARead-only
BM25-ranked keyword search over the locally indexed mail corpus. Supports FTS5 syntax: phrases ("exact phrase"), boolean (foo AND bar, foo OR bar, NOT baz), prefix (proto*), and column filters (subject:invoice from:alice). Use search_emails for live, authoritative IMAP results; use this for faster ranked local search after fts_rebuild has populated the index.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max hits to return (1–200, default 20) | |
| query | Yes | FTS5 query string | |
| folder | No | Restrict results to a single folder | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sinceEpoch | No | Filter to messages whose date is at or after this Unix-epoch second |
Output Schema
| Name | Required | Description |
|---|---|---|
| hits | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that it is a local search dependent on fts_rebuild having populated the index. It does not contradict annotations and provides useful context about the search algorithm and index dependency.
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-loads the main purpose, and contains no filler. 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?
Given the existence of an output schema (not shown), the description adequately covers the search algorithm, supported syntax, and usage context. It mentions the dependency on fts_rebuild, which is important 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?
The input schema is fully documented (100% coverage), and the description does not add additional parameter semantics beyond the schema. 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 the tool performs BM25-ranked keyword search over the locally indexed mail corpus, listing supported FTS5 syntax and explicitly distinguishing it from the sibling tool search_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?
The description provides explicit guidance: 'Use search_emails for live, authoritative IMAP results; use this for faster ranked local search after fts_rebuild has populated the index.' This clearly states when to use this tool vs. the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fts_statusFTS Index StatusARead-only
Report the path, row count, and on-disk size of the local FTS5 index. Returns { available: false } when better-sqlite3 is not installed.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| dbPath | No | |
| reason | No | |
| available | Yes | |
| messageCount | No | |
| databaseBytes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=true. The description adds the important behavioral detail that the tool returns { available: false } when better-sqlite3 is not installed, which is beyond what annotations 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 consists of two concise, front-loaded sentences with no wasted words. Every sentence adds value: the first states output, the second handles an edge case.
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 status tool, the description is complete. It specifies exactly what is reported, handles the missing dependency case, and the output schema (exists) can detail the return format. 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?
The input schema covers the single optional parameter (account_id) with a full description. The description adds no additional parameter information, so it meets the baseline for 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 tool reports path, row count, and on-disk size of the local FTS5 index. The verb 'Report' and specific resource 'FTS5 index' distinguish it from sibling tools like fts_rebuild or fts_search.
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 guidance on when to use this tool versus alternatives. Sibling tools exist (e.g., fts_rebuild, fts_search) but no context is given for when to prefer fts_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_connection_statusGet Connection StatusARead-only
Check live SMTP and IMAP health after setup. Returns connection status, TLS security mode (secure/insecure), and host/port details. Use setup_status first for credentials, Bridge reachability, or agent-approval diagnosis.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| imap | Yes | |
| smtp | Yes | |
| settingsConfigPath | Yes | Absolute path to the settings config file |
| settingsConfigured | Yes | Whether a settings config file exists on disk |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description confirms a read-only health check. It adds specific behavioral details (returns status, TLS mode, host/port) without contradicting annotations. No destructive or side effects are implied, consistent with safety.
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 purpose and output details, followed by a clear usage hint. No redundant information; every sentence is 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 the tool's simplicity (one optional param, read-only, with an output schema), the description covers all necessary aspects: what it checks, what it returns, and when to use it. The output schema handles return value details, so no further elaboration 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% for the single optional parameter 'account_id', which is already well-documented in the schema. The description does not add new parameter meaning, 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 checks live SMTP and IMAP health after setup. It differentiates from sibling tools like setup_status by explicitly directing users to use setup_status first for credentials, Bridge reachability, or agent-approval diagnosis.
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 setup_status first for certain diagnostics, implying this tool is for after setup. 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.
get_contactsGet ContactsARead-only
Extract a ranked contact list from inbox and sent history, including send/receive counts, last interaction, inferred organization, and recency. Use this to choose recipients; use get_correspondence_profile for one relationship in depth.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max contacts to return (default 100, max 500) | |
| sortBy | No | Sort order: recent = recency-weighted total (default), total = raw interaction count, sent = emails you sent them, received = emails they sent you | recent |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| contacts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety profile is clear. Description adds context about data included (counts, organization) but doesn't disclose any additional behavioral traits like rate limits or caching. Adequate but not enriched 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 sentences, each essential and well-placed. First defines functionality, second provides usage guidance. No redundant or unnecessary text.
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 zero required params, presence of output schema, and clear purpose/guidance, the description is largely complete. Lacks mention of pagination or handling of empty results, but still sufficient for typical 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 coverage is 100% with descriptions for all 3 parameters. Description adds minimal parameter-specific value beyond reinforcing the notion of 'ranked' list and recency weighting. Baseline 3 is appropriate as schema already 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?
Clear verb 'Extract' and resource 'ranked contact list' with specific data points. Explicitly distinguishes from sibling tool get_correspondence_profile, making 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: use this to choose recipients; use get_correspondence_profile for in-depth profile. Clearly states when and when not to use, with an alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_correspondence_profileGet Correspondence ProfileARead-only
Return relationship statistics for a single email address — volume sent/received, first and last interaction, average response time (if computable). Useful before drafting so the agent can match tone and recall context.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Email address to look up | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| Yes | ||
| emailsSent | Yes | |
| exhaustive | No | False when the contact ranked beyond the analytics top-500 scan and a lower-ranked record may exist |
| isFavorite | No | |
| emailsReceived | Yes | |
| lastInteraction | No | |
| firstInteraction | No | |
| averageResponseTime | No | Minutes; null when not computable |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds behavioral context: statistics are returned, with 'if computable' noting potential unavailability. 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 concise, front-loaded sentences that efficiently convey purpose, usage, and behavioral nuance with zero 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 output schema exists, description adequately covers inputs and behavioral expectations. Read-only annotation and parameter descriptions complete the picture for a lookup 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%, but description adds meaning beyond schema: emphasizes 'single email address', explains account_id routing, and references settings UI for multi-account configs.
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 relationship statistics for a single email address, specifying exact data points (volume, first/last interaction, response time). It differentiates from numerous sibling tools by providing a specific use case: before drafting to match tone and 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 notes the tool is 'useful before drafting', providing clear guidance on when to use. While it doesn't list alternatives, the context sufficiently implies usage scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_analyticsGet Email AnalyticsARead-only
Return a detailed inbox-and-sent dashboard: top senders/recipients, peak hours, attachment stats, and measured response times (null when insufficient data). Use get_email_stats for a compact overview or get_volume_trends for a custom date window. Results are cached for 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| topSenders | Yes | |
| volumeTrends | Yes | |
| topRecipients | Yes | |
| attachmentStats | No | |
| peakActivityHours | No | |
| responseTimeStats | No | Null when no sent replies could be matched to received emails. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and openWorldHint=true, so the safety profile is clear. The description adds value by noting that results are cached for 5 minutes and that response times are null when data is insufficient, which annotations do not cover. 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 purposeful: first defines the output, second provides guidance on alternatives, third notes caching. Front-loaded and concise 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 complexity (dashboard with multiple metrics) and the presence of an output schema, the description is complete enough. It mentions caching and null values, though it could hint at data range or pagination if applicable, but overall 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?
Schema description coverage is 100% (the single parameter account_id has a detailed description in the input schema). The description does not add new parameter semantics beyond what the schema provides, 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 uses a specific verb ('Return') and names the resource ('detailed inbox-and-sent dashboard') with clear data points. It distinguishes itself from sibling tools get_email_stats and get_volume_trends, 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 this tool vs alternatives: 'Use get_email_stats for a compact overview or get_volume_trends for a custom date window.' Also mentions caching behavior (5 minutes), guiding usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_by_idGet Email by IDARead-only
Fetch a single email's full content including body, attachment metadata (no binary content), isAnswered, and isForwarded flags. Use the id returned by get_emails or search_emails.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder the email lives in (e.g. INBOX, Sent, Drafts). Providing this avoids a cross-folder UID collision. | |
| emailId | Yes | IMAP UID from get_emails or search_emails | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| cc | No | |
| id | Yes | |
| to | No | |
| body | Yes | |
| date | Yes | |
| from | Yes | |
| folder | No | |
| isHtml | No | |
| isRead | Yes | |
| subject | Yes | |
| isStarred | No | |
| isAnswered | No | True if the email has been replied to (\Answered IMAP flag) |
| attachments | No | |
| isForwarded | No | True if the email has been forwarded ($Forwarded IMAP flag) |
| hasAttachment | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds that it returns body, attachment metadata, isAnswered, and isForwarded flags, and explicitly excludes binary content. 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, front-loads the core purpose, and uses clear language with no superfluous 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?
With an output schema present, annotations, and clear parameter docs, the description provides all necessary information for correct invocation and understanding of return values.
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 descriptions for all parameters. The description adds further context, e.g., that folder avoids UID collision and that account_id is for multi-account routing, which 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 it fetches a single email's full content including body and metadata, and explicitly excludes binary attachment content. It specifies the source of the ID (get_emails or search_emails), distinguishing it from sibling tools like get_emails and download_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?
The description instructs to use the ID from get_emails or search_emails, implying proper usage context. It does not explicitly list when not to use or directly compare to siblings, but the information is sufficient for typical scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emailsGet EmailsARead-only
Fetch a page of emails from a folder. Returns summary fields (id, messageId, from, subject, date, isRead, bodyPreview). id is a per-folder IMAP UID; messageId is stable across folders. Use id with get_email_by_id for full content. Set summaryOnly=true to omit bodyPreview for lean listing/triage. Pass nextCursor from a previous response to get the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Emails per page (1-200, default 50) | |
| cursor | No | Opaque cursor from previous response nextCursor to get next page. Omit for first page. | |
| folder | No | Folder path. Examples: INBOX, Sent, Trash, Folders/MyFolder | INBOX |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| summaryOnly | No | When true, omit bodyPreview (and body) from each item — leaner payload for listing/triage. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| emails | Yes | |
| folder | Yes | |
| nextCursor | No | Pass this value as cursor in the next call. Absent when no more pages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint and openWorldHint. Description adds behavioral details: id vs messageId distinction, pagination via cursor, summaryOnly effect, and folder path examples. 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, each serving a purpose: main function, field clarification, pagination and options. No 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?
Handles all 5 parameters, pagination, folder paths, account routing, and summaryOnly. Output schema exists, so return format is already covered. Comprehensive for a paginated list 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%, baseline is 3. Description adds minor value for summaryOnly (leaner payload) and cursor (from previous response), but most parameter meanings are clear from 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 clearly states 'Fetch a page of emails from a folder' with specific verb and resource. It details returned fields and distinguishes from get_email_by_id by mentioning its use for full content.
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 clear context for when to use (listing/triage, pagination) and mentions alternative get_email_by_id for full content. Does not explicitly exclude other scenarios like search, but context signals are sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emails_by_labelGet Emails by LabelARead-only
Legacy convenience wrapper for get_emails with folder set to Labels/. Prefer get_emails when you need the canonical pagination and summaryOnly options.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Label name without prefix (e.g. Work) | |
| limit | No | Emails per page, 1-200 | |
| cursor | No | Opaque cursor from previous response | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| emails | Yes | |
| folder | Yes | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the behavioral safety profile. The description adds context of being a legacy wrapper, which is useful but does not disclose additional behavioral traits 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, front-loaded with purpose and guidance. Every word 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?
Given the output schema exists (not shown but indicated), the description adequately covers purpose and usage guidance. No additional context needed for this simple wrapper 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%, so parameters are well-documented in the schema. The description does not add extra meaning beyond what the schema provides, 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 tool is a legacy convenience wrapper for get_emails with a fixed folder set to Labels/<label>. It distinguishes itself from the sibling tool get_emails by specifying that get_emails is preferred for canonical pagination and summaryOnly options.
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 to prefer get_emails for canonical pagination and summaryOnly, providing clear when-to-use and when-not-to-use guidance. Names the alternative tool directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_email_statsGet Email StatisticsARead-only
Return a compact inbox-and-sent dashboard: totals, unread count, most active contact, and storage estimate. Use get_email_analytics for deeper breakdowns or get_volume_trends for a custom date window. Results are cached for 5 minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| totalEmails | Yes | |
| totalFolders | No | |
| unreadEmails | Yes | |
| starredEmails | No | |
| storageUsedMB | No | |
| totalContacts | Yes | |
| mostUsedFolder | No | |
| mostActiveContact | No | |
| averageEmailsPerDay | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. Description adds caching duration (5 minutes), which is beneficial 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?
Two sentences efficiently cover purpose, usage guidance, and caching. No redundancy, well 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 one optional parameter and an output schema, the description fully covers what the tool does, its caching behavior, and when to use 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 100% for the single parameter account_id. Description does not add any additional semantics or context for the parameter beyond the schema, 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?
Clearly states the tool returns a compact inbox-and-sent dashboard with specific outputs (totals, unread count, most active contact, storage estimate). Mentions sibling tools for 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?
Explicitly tells when to use (for a compact dashboard) and when not to (for deeper breakdowns or custom date windows), directing to get_email_analytics and get_volume_trends.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_foldersGet FoldersARead-only
List all email folders with message counts. Labels appear as folders with the Labels/ prefix (e.g. Labels/Work). Each folder reports folderType (system | user-folder | label) and, for system mailboxes, the IMAP specialUse attribute (\Inbox \Sent \Drafts \Trash \Junk \Archive \All \Flagged) — use these to identify the real Trash/Sent/Archive on a localised account rather than matching English names, and to avoid moving mail into the \All (All Mail) union view.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| folders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes beyond the readOnlyHint and openWorldHint annotations by detailing that the tool returns message counts, folder types, and specialUse attributes. It also discloses the behavioral trait of labels appearing as folders with a prefix and warns about the \All special use, giving agents safe usage guidance.
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 main purpose and then adds necessary details. It is well-structured but slightly longer than minimal; however, 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 tool has a single optional parameter, annotations, and an output schema, the description covers all key aspects: listing folders with counts, folder types, specialUse, and the important warning about the \All union view. The agent has complete context to use 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?
With 100% schema description coverage, the input schema already fully documents the single optional parameter 'account_id'. The tool description does not add parameter-specific meaning, so 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 the tool lists all email folders with message counts, and explains labels appear with 'Labels/' prefix. It distinguishes from sibling tools like 'list_labels' and 'sync_folders' by detailing folderType and IMAP specialUse attributes.
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 guidance on when to use this tool—specifically to identify the real Trash/Sent/Archive using specialUse attributes rather than English names. It also warns against moving mail into the \All (All Mail) union view. However, it does not explicitly mention alternative tools for other scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsGet Server LogsARead-only
Retrieve recent server log entries filtered by level. Sensitive fields are redacted.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Filter by log level | |
| limit | No | Max entries (max 500) | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| logs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description adds that sensitive fields are redacted, disclosing a behavioral trait beyond what annotations provide. 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?
The description is a single, efficient sentence that front-loads the core purpose. No extraneous 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?
All three parameters are documented in the schema, an output schema exists, and the description covers the key behavioral aspect (redaction). For a simple read tool, this is 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%, so the description adds little beyond what the schema already provides. It mentions filtering by level but doesn't elaborate further.
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 ('Retrieve'), the resource ('server log entries'), and key details (filtering by level, redaction). It is distinct from sibling tools which operate on emails, aliases, etc.
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 on when to use this tool versus alternatives. It does not mention when not to use it or provide context for selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_versionGet Server VersionARead-only
Return the running mailpouch server version. Use to confirm which version is active before reporting bugs or checking for new features.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| version | Yes | Semver string (e.g. '3.0.33') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows it is a safe read operation. The description adds that it returns the version, but does not disclose any additional behavioral traits such as whether the optional account_id affects the result, or any rate 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?
Two sentences, no redundancy. Every word is functional. Front-loaded with the core action, followed by usage guidance.
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 version-check tool with one optional parameter and an existing output schema (as indicated by context), the description is complete. It covers purpose and usage without needing elaboration.
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% for the single parameter, so the schema already documents account_id sufficiently. The tool description does not add any extra meaning beyond what is 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 uses a specific verb 'Return' and resource 'server version', clearly distinguishing it from all sibling tools which handle aliases, emails, folders, etc. No 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?
States to use 'to confirm which version is active before reporting bugs or checking for new features.' This provides explicit usage context. It does not mention when not to use it, but the tool is so focused that exclusion is implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_threadGet Email ThreadARead-only
Return all messages that look like they belong to the same thread as the given email. Uses the normalized Subject (Re:/Fwd: stripped) to collect related messages from INBOX + Sent. Folder-restricted agents only receive messages from their allowed folders. Useful for summarising long conversations in one call.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | Folder the seed message lives in. Providing this avoids UID collisions across folders. | |
| email_id | Yes | IMAP UID of any message in the thread | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| max_messages | No | Max messages to return (default 50, cap 200) |
Output Schema
| Name | Required | Description |
|---|---|---|
| subject | Yes | Normalized subject line for the thread |
| messages | Yes | Messages in the thread, oldest-first |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true. The description adds behavioral details: normalized Subject stripping, collection from INBOX+Sent, and folder restrictions for restricted agents. This adds valuable 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?
Three sentences, front-loaded with purpose, then method, then use case. Every sentence provides 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?
Covers purpose, method, and restrictions. With an output schema present, return values need not be explained. Lacks discussion of edge cases like thread size limits or ordering, but sufficient for typical 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?
All four parameters have schema descriptions (100% coverage), so the description adds little extra parameter meaning. It mentions folder restrictions but does not elaborate on parameter details 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 explicitly states it returns all messages belonging to the same thread, using normalized Subject to collect from INBOX+Sent. This clearly distinguishes it from sibling tools like search_emails or get_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?
The description indicates it's useful for summarizing long conversations, providing clear context for when to use it. However, it does not explicitly state when not to use it or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_unread_countGet Unread CountARead-only
Get unread email count for each folder. Cheap call — use this before get_emails to decide whether to fetch. Returns object mapping folder path to unread count.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| totalUnread | Yes | |
| unreadByFolder | Yes | Folder path -> unread count |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnly and openWorld hints. Description adds value by stating the call is cheap (performance trait) and specifying the return type (object mapping folder to count). 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?
Three sentences, each serving a specific purpose: purpose statement, usage guideline, return format. No wasted words; front-loaded with key 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?
Given the single optional parameter and presence of output schema, the description sufficiently covers purpose, usage, behavior, and return type. No additional context needed for this low-complexity 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 description for account_id. Description adds context about multi-account routing and omitting for active account, enhancing the schema's information.
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 retrieves unread email counts per folder, using specific verb and resource. It distinguishes from siblings like get_emails by noting it's a cheap call to use before fetching.
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 to use before get_emails to decide whether to fetch, providing clear when-to-use guidance. No exclusions or alternatives beyond get_emails are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_volume_trendsGet Volume TrendsARead-only
Return daily sent/received volume for a caller-selected time window. Use get_email_analytics for the broader default dashboard, or get_unread_count for current unread counts.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to include | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| trends | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so the description adds little beyond stating the scope. No contradictions, but no extra behavioral detail needed.
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 purpose, second provides usage alternatives. No fluff, 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?
With high schema coverage, annotations, and an output schema (exists), the description plus structured fields fully cover the tool's behavior. Simple tool with no missing 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 baseline 3. Description mentions 'caller-selected time window' which loosely refers to the days parameter, but adds no meaningful extra semantics 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?
Description uses specific verb 'Return daily sent/received volume' and explicitly distinguishes from siblings (get_email_analytics, get_unread_count), making the tool's purpose clear and unique.
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?
Directly states when to use this tool (for daily volume in a time window) and provides explicit alternatives with use cases (broader dashboard, current unread counts).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_labelsList LabelsARead-only
List only Proton Mail labels with message counts (Labels/ prefix), not regular folders. Use get_folders when you also need regular folders, folder type, or IMAP special-use metadata.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| labels | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint) are complemented by description specifying behavior: lists only Labels/ prefix, includes message counts, excludes regular folders. 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 concise sentences with front-loaded primary purpose. Every sentence adds value 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 output schema exists and only one optional parameter, the description fully covers purpose, usage guidance, and behavioral traits for effective agent 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?
Only one parameter (account_id) with full schema description. Tool description does not add further parameter-specific meaning beyond what schema provides, so baseline score 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?
Clearly states the tool lists Proton Mail labels with message counts, distinguishing from get_folders which includes regular folders. Verb 'list' + specific 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?
Explicitly tells when to use this tool vs. get_folders, stating that get_folders should be used when regular folders, folder type, or IMAP metadata are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pending_remindersList Pending RemindersARead-only
List every pending no-reply reminder, sorted by earliest fireAt.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reminders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description adds only the sorting behavior (by fireAt). No additional behavioral traits like permissions or side effects are disclosed, which is acceptable given the read-only 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?
Extremely concise single line that perfectly front-loads the purpose and sorting detail. Every word 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?
Tool is simple with one optional param and an output schema exists (not shown), so description doesn't need to detail return format. The description covers the essential purpose and sorting, but a note about the parameter could 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 coverage is 100% with a well-described optional account_id parameter. The description adds no further meaning beyond the schema, 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?
Description clearly states the tool lists pending no-reply reminders sorted by earliest fireAt. The verb 'List' and resource 'pending reminders' are specific, and the sorting detail distinguishes it from other reminder-related tools like cancel_reminder or check_reminders.
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 when one wants to see pending no-reply reminders, but offers no explicit guidance on when to use this tool versus siblings like check_reminders or cancel_reminder. No alternatives or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_proton_scheduledList Proton Scheduled EmailsARead-onlyIdempotent
List emails natively scheduled via Proton Mail web/mobile app (not MCP-scheduled emails). Reads the 'All Scheduled' IMAP folder exposed by Proton Bridge.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | Yes | |
| emails | Yes | |
| folder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds the context that it reads the 'All Scheduled' IMAP folder exposed by Proton Bridge, which is consistent with a read-only operation and provides operational detail 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 sentences, both necessary: first states purpose and exclusions, second states data source. No redundancy, front-loaded with key 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?
Given the presence of an output schema, the description adequately covers purpose, data source, and sibling differentiation. It could mention any default ordering or limit, but for a simple list tool with one optional parameter, it is 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?
The only parameter (account_id) is fully described in the input schema with 100% coverage. The description does not add any additional meaning beyond what the schema provides, meeting the baseline expectation.
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' and specifies the resource as 'emails natively scheduled via Proton Mail web/mobile app'. It explicitly distinguishes from 'MCP-scheduled emails', referencing the sibling tool list_scheduled_emails. The specific IMAP folder source is also mentioned.
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 a clear contrast between native scheduled emails and MCP-scheduled emails, guiding the agent to choose this tool versus list_scheduled_emails. However, it does not explicitly state 'when to use' or 'when not to use' beyond that distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scheduled_emailsList Scheduled EmailsARead-only
List all scheduled emails, including in-flight and outcome-unknown deliveries. Sorted by scheduledAt ascending.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| scheduled | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description adds valuable behavioral context by specifying that it includes 'in-flight and outcome-unknown deliveries' and that results are sorted by 'scheduledAt ascending'. 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?
The description is two concise sentences: the first states the action and scope, the second adds sorting. No unnecessary words 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 presence of an output schema and no additional parameters, the description covers the tool's functionality well. It could mention pagination or limits, but for a simple listing tool it is 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 schema has 100% coverage for the single parameter, with a detailed description. The tool description does not add extra parameter information, so it falls back to baseline 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 verb 'List', the resource 'scheduled emails', and specifies the scope 'including in-flight and outcome-unknown deliveries'. It also adds sorting order, making the purpose unambiguous and distinct from sibling tools like 'cancel_scheduled_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?
The description implies usage for viewing scheduled emails but does not explicitly state when to use this tool versus alternatives like 'cancel_scheduled_email' or when not to use it. No prerequisites or context are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_answeredMark Email AnsweredAIdempotent
Set or clear the \Answered flag on an email (the IMAP 'replied to' marker). answered defaults to true. Pass sourceFolder whenever the UID came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| answered | No | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds that the tool sets/clears the IMAP 'replied to' marker, which aligns with annotations (readOnlyHint=false, destructiveHint=false). It does not disclose additional behavioral traits beyond what annotations provide, such as permissions or error conditions. Annotations already indicate idempotent and non-destructive, so the description adds minimal extra 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 two sentences long, front-loaded with the core purpose, and contains no unnecessary words. Every sentence adds value: the first states the action, the second covers parameter defaults and usage guidance.
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 medium complexity (4 parameters, 1 required) and the presence of an output schema, the description covers the main behavior and a key usage note. It lacks details on return values or error cases, but the output schema may handle that. It is adequate for a simple mutation 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 50%. The description explains 'answered' (defaults to true) and 'sourceFolder' (when to pass), adding value beyond the schema. The 'emailId' and 'account_id' parameters are not explained in the description, but 'account_id' has a schema description. Overall, the description compensates partially 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 the tool's purpose: to set or clear the 'Answered' flag (IMAP 'replied to' marker) on an email. It is a specific verb-resource combination that distinguishes it from sibling tools like mark_email_read or mark_forwarded.
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 usage, such as the default value for 'answered' (true) and when to pass 'sourceFolder' (when UID came from a folder other than INBOX). It does not explicitly state when not to use the tool or mention alternatives, but the guidance is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_email_readMark Email Read/UnreadAIdempotent
Set the read/unread status of an email. isRead defaults to true. Pass sourceFolder whenever the UID came from a folder other than INBOX — IMAP UIDs are folder-scoped and silent no-ops can otherwise occur.
| Name | Required | Description | Default |
|---|---|---|---|
| isRead | No | ||
| emailId | Yes | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it's a write operation that is idempotent and non-destructive. Description adds value by disclosing the default for isRead and the critical behavior about IMAP UID folder-scoping and silent no-ops. No mention of rate limits or auth, but annotations cover the core 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?
Two succinct sentences with no wasted words. Front-loaded with the core action and immediately followed by key usage hints.
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 boolean toggle, the description covers the essential behavioral nuance (source folder). Annotations confirm safety. Output schema exists. Could mention that it operates on a single email, but that is implicit from the singular emailId parameter.
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 exist for account_id and sourceFolder, but isRead and emailId lack schema descriptions. Description adds the default for isRead and reiterates the importance of sourceFolder. With 50% schema coverage, the description partially compensates but could provide more detail on emailId format.
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 sets the read/unread status of an email, which is a specific verb and resource. It differentiates from siblings like bulk_mark_read (for bulk) and star_email (for starring).
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?
Description explicitly advises when to pass sourceFolder to avoid silent no-ops, but does not provide guidance on when to use this tool versus alternatives like bulk_mark_read or star_email. The instruction is helpful but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_forwardedMark Email ForwardedAIdempotent
Set or clear the $Forwarded keyword on an email (the 'has been forwarded' marker the forward tool writes). forwarded defaults to true. Pass sourceFolder whenever the UID came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| forwarded | No | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (idempotentHint=true, destructiveHint=false), the description adds valuable behavioral context: the default value, the requirement for sourceFolder to avoid silent no-ops, and the warning against using 'All Mail' as source. 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?
Two concise sentences: first defines purpose, second provides key usage guidance. Every sentence is necessary and adds value. No superfluous text.
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 essential behaviors (keyword, default, folder scoping) and integrates with the forward tool context. With output schema available (not shown), return values are presumably documented, so 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 50% (descriptions for account_id and sourceFolder). The description adds only marginal value: it repeats the default for 'forwarded' (already in schema) and adds a warning about 'All Mail' for sourceFolder. No new info for emailId or account_id.
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 'set or clear' and the resource '$Forwarded keyword on an email', explicitly linking it to the forward tool. This distinguishes it from sibling tools like mark_answered or mark_email_read.
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 guidance on the default value for 'forwarded' and when to use 'sourceFolder' (when UID comes from a folder other than INBOX). However, it does not explicitly contrast this tool with alternatives or specify when not to use it, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_emailMove EmailA
Move an email to a different folder. Common targets: Trash, Archive, Spam, INBOX, Folders/MyFolder. Moving to Trash or Spam requires { confirmed: true }. Pass sourceFolder whenever the UID came from a folder other than INBOX — IMAP UIDs are folder-scoped.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| confirmed | No | Must be true when targetFolder is Trash or Spam. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. | |
| targetFolder | Yes | Destination folder path (e.g. Trash, Archive, Folders/Work) |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are not contradictory and indicate a non-read-only, non-destructive operation. The description adds behavioral insights: the 'confirmed' requirement for Trash/Spam, the folder-scoping of IMAP UIDs, and warnings about 'All Mail' and no-op moves. This context is valuable beyond the 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 concise with four sentences but front-loaded with the core action. It efficiently covers key points without redundancy. Could be slightly more structured, but overall lean and effective.
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 complexity (5 parameters, output schema present), the description covers essential use cases, parameter dependencies, and common pitfalls. It does not explain return values or error conditions, but the output schema presumably handles that. Adequately complete for the 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 high (80%), so the baseline is 3. The description adds value by explaining the 'confirmed' requirement in context and elaborating on 'sourceFolder' with IMAP UID scoping and the 'All Mail' pitfall. It 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 'Move an email to a different folder' with specific verb and resource. It lists common targets, making the purpose obvious. However, it does not explicitly differentiate from sibling tools like 'move_to_folder' or 'move_to_trash', which could cause 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 provides clear conditions for using 'confirmed' and 'sourceFolder' parameters, but lacks explicit guidance on when to choose this tool over specialized siblings like 'move_to_spam' or 'move_to_trash'. The usage context is implied through examples but not fully detailed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_to_folderMove Email to Custom FolderA
Move an email to a custom folder (Folders/). Similar to move_to_label but for Folders/ paths.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | Yes | Folder name without prefix (e.g. Work). Moves to Folders/Work. | |
| emailId | Yes | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (readOnlyHint, idempotentHint, destructiveHint), so the description must convey behavioral traits. It states 'Move an email' implying mutation, but does not disclose side effects like whether the original copy is deleted, whether the operation is reversible, or permission requirements. The detailed sourceFolder parameter description is in schema but not in main description.
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 extremely concise: two short sentences that front-load the core purpose and differentiate from a sibling. Every word contributes, 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?
Given the complexity of a move operation (especially with IMAP UID scoping and silent no-ops) and the presence of a detailed sourceFolder parameter, the description could be more complete. It does not mention important behaviors like what happens if the target folder doesn't exist, or strongly recommend providing sourceFolder. The existence of an output schema (not shown) mitigates but doesn't fully compensate.
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 75% (3 of 4 parameters have descriptions). The main description adds no parameter-level information beyond what's in the schema. It mentions 'Folders/' prefix but that is already implied by the folder parameter description. The emailId parameter lacks a description in the schema, and the main description does not address 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?
The description clearly states the action 'Move an email to a custom folder' and specifies the path format 'Folders/<name>'. It distinguishes from sibling tool 'move_to_label' by noting similarity but different target type, helping the agent choose.
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 some context by comparing to move_to_label, but lacks explicit guidance on when to use this tool versus other move-related siblings like archive_email, move_to_spam, or bulk_move_emails. No prerequisites or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_to_labelAdd Label to EmailA
Add a label to an email. The email remains in its original folder and also appears in Labels/{label}; labels are additive, so an email can have multiple labels simultaneously. Use move_email only when the email should leave its source folder.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Label name without prefix (e.g. Work). Moves to Labels/Work. | |
| emailId | Yes | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals additive behavior (email remains in original folder, multiple labels possible) beyond what annotations provide. Annotations indicate non-destructive but no further details; the description adds useful context about the operation's effect.
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, using three sentences to convey purpose, behavior, and usage guidance. Every sentence adds value 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?
Given the presence of an output schema and annotations, the description covers the core functionality and key usage advice. It lacks mention of permissions or error cases but 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 description coverage is 75%, so the schema already documents most parameters well. The tool description does not add additional parameter-level information beyond what is in the schema, thus it meets but does not exceed 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 action ('Add a label to an email') and distinguishes from the sibling tool move_email by specifying when to use each. This provides a specific verb and resource, 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?
The description explicitly contrasts with move_email, clarifying when to use this tool instead. However, it does not address other sibling tools like remove_label or bulk_move_to_label, leaving some potential confusion unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_to_spamMove Email to SpamADestructive
Move an email to the Spam folder. Convenience wrapper for move_email targeting Spam. Destructive: requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| confirmed | No | Must be true to execute. See requireDestructiveConfirm. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint: true, but the description adds that it requires 'confirmed: true' to execute, which is a key behavioral constraint not captured by the annotation flags 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?
Two sentences, front-loaded with purpose and a clear behavioral note. Every word earns its place; 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?
Given the simple nature of the tool, the description is mostly complete. Output schema exists but the description does not explain return values; however, the schema covers that. Could mention the effect on the email or any side effects, but it's sufficient for a straightforward action.
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 schema description coverage at 75%, the description does not add meaning beyond what the input schema already provides. It mentions the 'confirmed' requirement but that is also documented in the schema. No additional parameter insight is given.
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 an email to the Spam folder' and identifies it as a convenience wrapper for move_email targeting Spam. This specific verb+resource combination distinguishes it from siblings like move_email or move_to_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 notes it is a convenience wrapper and that it is destructive requiring confirmation. It implies use when you want to move to Spam specifically, but does not explicitly contrast with alternatives or discuss when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_to_trashMove Email to TrashADestructive
Move an email to the Trash folder. Convenience wrapper for move_email targeting Trash. Note: labels are lost when an email is moved — label copies in Labels/ folders are not preserved. Destructive: requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| confirmed | No | Must be true to execute. See requireDestructiveConfirm. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral details beyond the annotations: labels are lost when moving (label copies not preserved) and the tool requires explicit confirmation. Since annotations already mark it as destructive, this additional context about label behavior and the confirmation requirement provides valuable transparency for the agent.
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 extremely concise, consisting of only three sentences that are front-loaded with the core purpose. Every sentence adds value: the first states the function, the second explains it is a wrapper, and the third provides essential behavioral notes. No redundant or extraneous text.
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 and the presence of an output schema and annotations, the description covers the key aspects: purpose, label loss behavior, and confirmation requirement. It is sufficient for correct invocation, though it could be slightly enhanced by noting that trashing is reversible (e.g., can be undone from Trash).
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 description coverage is 75%, so the schema already documents most parameters. The description adds only a reference to the confirmed parameter (mentioning the requirement), but does not elaborate on emailId, account_id, or sourceFolder beyond what the schema provides. This meets the baseline but does not add significant extra meaning.
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 an email to the Trash folder' and identifies itself as a 'Convenience wrapper for move_email targeting Trash', which clearly specifies the verb and resource while distinguishing it from the general move_email tool. This is highly specific and leaves no ambiguity about the tool's 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 implies that this tool should be used when moving an email to Trash (as opposed to other destinations) and notes the requirement for confirmation ('requires { confirmed: true }'). However, it does not explicitly mention when not to use it or compare it to alternatives like delete_email or archive_email, which would provide stronger guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remind_if_no_replyRemind If No ReplyA
Schedule a follow-up reminder for a message you've sent. Given the IMAP UID of a message in Sent, captures its Message-ID + recipient and fires a reminder after N days. Use check_reminders to retrieve due reminders; list_pending_reminders to audit; cancel_reminder to drop one.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional note explaining the reminder | |
| folder | No | Folder containing the message (default: Sent). Provide this to avoid UID collisions across folders. | |
| email_id | Yes | IMAP UID of the sent message | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| after_days | Yes | Days from the message's send date until the reminder fires (1–365) |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| fireAt | Yes | |
| subject | Yes | |
| recipient | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description reveals internal behavior: it captures Message-ID and recipient, then fires after N days. This adds meaningful behavioral context beyond the readOnly/destructive hints.
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, no redundancy, front-loaded with key purpose. Every sentence serves a purpose, making it highly 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?
Given the presence of an output schema, the description fully covers purpose, parameters, and related tools. It provides sufficient context for an agent to select and use 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?
With 100% schema coverage, the description adds value by explaining the IMAP UID purpose, folder collision avoidance, account routing, and day range. This supplements the schema definitions effectively.
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 schedules a follow-up reminder for a sent message using its IMAP UID. It differentiates from sibling tools like check_reminders, list_pending_reminders, and cancel_reminder, making the purpose distinct and 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 explains the input requirements (IMAP UID, days) and mentions related tools for lifecycle management. It lacks explicit 'when not to use' guidance but provides adequate context for correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_labelRemove Label from EmailA
Remove a label from an email. The email is removed from Labels/{label} but remains in its original folder (Inbox, etc.). The UID passed must be the UID in Labels/{label} (not the INBOX/source UID) — Labels/ folders have their own UID space.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Label name to remove (e.g. Work) | |
| emailId | Yes | UID of the email inside Labels/{label} | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds value by specifying the non-destructive nature (email remains in original folder) and the UID space nuance. This provides behavioral context beyond annotations. Could mention error handling or reversibility, but 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 two sentences, each carrying important information. It is front-loaded with the core action and immediately addresses the critical nuance. 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 presence of an output schema and annotations, the description effectively covers the core operation, the non-destructive effect, and a key caveat about UID space. It does not explain error conditions or what happens if the label doesn't exist, but overall it provides sufficient context for an AI agent to use 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 baseline is 3. The description adds crucial meaning for the 'emailId' parameter by clarifying it must be the UID in Labels/{label} and not the inbox UID. This goes beyond the schema description. No extra context for 'label' or 'account_id' beyond schema, but the addition elevates the score.
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 'Remove a label from an email' and explains that the email remains in its original folder, distinguishing it from deletion or moving. This is specific and differentiates from sibling tools like 'delete_email' or 'move_to_trash'.
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 guidance on the UID requirement: the UID must be from the Labels/{label} folder, not the INBOX. This tells the agent when to use this tool (only if you have the label-folder UID) and implies that if you have the inbox UID, you need to get the label UID first. However, it does not mention alternatives like 'bulk_remove_label' or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_folderRename FolderA
Rename a custom folder or label. Protected system folders cannot be renamed.
| Name | Required | Description | Default |
|---|---|---|---|
| newName | Yes | New folder path | |
| oldName | Yes | Current folder path | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate non-read-only, non-idempotent, non-destructive behavior. The description adds the constraint that protected system folders cannot be renamed, which is a behavioral limit. However, it does not detail side effects (e.g., impact on subfolders or email paths) beyond what annotations 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?
The description is two sentences, front-loaded with the primary purpose. No superfluous information; every word contributes to clarity.
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 an output schema exists (return values are documented), the description adequately covers the tool's role, constraints (system folders), and parameter count. It could mention folder existence prerequisites or error states, but it is reasonably complete for a rename 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?
The input schema describes all 3 parameters with 100% coverage. The description adds no additional meaning beyond the schema—it does not explain expected formats, validation rules, or relationships between parameters. Baseline 3 is appropriate given 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 tool renames custom folders or labels, with a specific verb ('rename') and resource ('custom folder or label'). It distinguishes from siblings like create_folder, delete_folder by specifying the action. The note about protected system folders adds clarity.
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?
While not explicitly naming alternatives, the description implies use when renaming custom folders/labels and not for system folders. It provides context by differentiating from other folder operations (create, delete, move) among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_emailReply to EmailA
Send a reply to an existing email. Fetches the original to pre-fill To, Re:-prefixed subject, and thread references. Use replyAll to include original CC recipients.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Reply body (plain text or HTML) | |
| folder | No | Folder the original message lives in. Providing this avoids UID collisions across folders. | |
| isHtml | No | ||
| emailId | Yes | UID of the email to reply to | |
| replyAll | No | Include all original CC recipients | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate no destructive behavior (destructiveHint=false), and the description adds context about pre-filling fields. However, it does not disclose potential side effects like marking the original email as replied or any permissions needed. With annotations covering basic safety, the description adds moderate 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 extremely concise: two sentences that front-load the purpose and immediately provide actionable guidance on replyAll. Every sentence serves a clear purpose 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?
With an output schema present, the description need not explain return values. It covers the core action and the primary variation (replyAll). It lacks details on error handling, prerequisites (e.g., email must exist), or behavior of isHtml, but these are minor gaps for a mutation tool with 6 parameters.
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 83%, so the schema already documents most parameters well. The description only adds meaning for the 'replyAll' parameter by explaining its usage. Other parameters like 'folder' and 'account_id' are not elaborated, but baseline 3 is appropriate given 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 tool sends a reply to an existing email, specifies that it fetches the original to pre-fill fields, and distinguishes between reply and replyAll. This differentiates it from siblings like 'send_email' and 'forward_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?
The description provides explicit guidance on using replyAll for including original CC recipients, implying the default is to reply only to the sender. It lacks explicit when-not-to-use scenarios or alternatives like 'forward_email', but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_permission_escalationRequest Permission EscalationA
Request an increase in the server's active permission preset. YOU CANNOT APPROVE THIS YOURSELF — approval requires a human to open the settings UI (http://localhost:8766) and click Approve. Use check_escalation_status to poll for the result. Downgrading (reducing access) never requires a challenge.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | Why you need elevated permissions. Shown to the human verbatim. Be specific — vague reasons are more likely to be denied. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| target_preset | Yes | The preset you are requesting. Must be higher than the current preset. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that approval requires a human action (opening UI and clicking Approve), which is critical behavioral context beyond annotations. It adds the URL and process, and notes the non-self-approvable nature. 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?
Two sentences containing all essential info: what it does, that agent cannot approve, where to approve, how to poll, and a note about downgrading. Every sentence earns its place; 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?
Given the complexity (requires human approval, polling for result), the description covers the full workflow: request, human approval step, polling. It also addresses downgrading. No output schema needed as the polling tool handles results.
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?
Adds meaningful advice beyond schema: 'Be specific' for reason, 'Omit to use the active account' for account_id, and 'Must be higher than current preset' for target_preset. Schema coverage is 100%, but description provides extra guidance.
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: requesting an increase in permission preset. It explicitly distinguishes from checking status (check_escalation_status) and notes that downgrading doesn't require this tool. The verb+resource is precise.
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: to request higher permissions. It tells the agent it cannot approve and must poll via check_escalation_status. It also clarifies that downgrading never requires a challenge, implying not to use this for reduction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restart_serverRestart MCP ServerADestructive
Restart the MCP server. Terminates Proton Bridge, shuts down gracefully, then spawns a fresh server process. If autoStartBridge is enabled the new process will re-launch Bridge automatically. Requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed | No | Must be true to execute when confirmation is required. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-idempotent behavior. The description adds valuable context: termination of Proton Bridge, graceful shutdown, spawning a new process, and autoStartBridge behavior. 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 sentences with no wasted words. It front-loads the purpose, then explains the process and a key requirement. Ideal length and structure.
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 server restart tool with 2 parameters, good schema/annotation coverage, and an output schema present, the description covers behavior, confirmation requirement, and auto-bridge nuance comprehensively. No gaps identified.
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 well described. The description reinforces the 'confirmed' parameter but adds no new semantic meaning beyond the schema. 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 restarts the MCP server with specific actions (terminate, shut down, spawn fresh process). It distinguishes from siblings like shutdown_server (which only shuts down) and start_bridge (which only starts Bridge).
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 requires 'confirmed: true', providing a clear precondition. However, it does not directly compare to sibling tools like shutdown_server or start_bridge, leaving some ambiguity about when to use this vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_draftSave DraftA
Save an email as a draft in the Drafts folder without sending it. All fields are optional — drafts can be incomplete. Returns the server-assigned UID.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC addresses, comma-separated | |
| to | No | Recipient address(es), comma-separated | |
| bcc | No | BCC addresses, comma-separated | |
| body | No | Email body (plain text or HTML) | |
| isHtml | No | ||
| subject | No | Email subject line | |
| inReplyTo | No | Message-ID this is a reply to | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| references | No | Thread reference Message-IDs | |
| attachments | No | Attachments as objects with filename, content (base64), contentType |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | No | IMAP UID assigned to the draft |
| error | No | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-idempotent write that is not destructive. The description confirms it saves to Drafts and does not send. No additional side effects (e.g., overwriting) are disclosed, but no contradictions exist.
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 cover purpose, field optionality, and return value without extraneous information. 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?
Given 10 optional parameters and an output schema (not shown here but referenced), the description highlights key aspects: save to Drafts, all fields optional, returns UID. This is sufficient for a draft-saving 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 90%, so the schema already documents parameters well. The description adds 'All fields are optional' but little else beyond what is 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 clearly states 'Save an email as a draft in the Drafts folder without sending it,' specifying the action (save) and resource (email draft). This distinguishes it from sibling tools like send_email or reply_to_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?
The description implies usage for composing drafts without sending, but does not explicitly compare to alternatives like send_email. However, the tool name and context make the use case clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_emailSchedule EmailA
Schedule an email for future delivery (minimum 60 seconds from now, maximum 30 days). Definite failures are retried up to 3 times; ambiguous deliveries are never retried automatically. Use list_scheduled_emails to view pending sends and cancel_scheduled_email to cancel before delivery.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC addresses, comma-separated | |
| to | Yes | Recipient address(es), comma-separated | |
| bcc | No | BCC addresses, comma-separated | |
| body | Yes | Email body (plain text or HTML) | |
| isHtml | No | ||
| replyTo | No | Reply-to address | |
| send_at | Yes | ISO 8601 datetime when to send (e.g. 2026-03-18T09:00:00Z) | |
| subject | Yes | Email subject line | |
| priority | No | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| attachments | No | Attachments as objects with filename, content (base64), contentType |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | Schedule ID — use with cancel_scheduled_email |
| success | Yes | |
| scheduledAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) indicate mutation but no idempotency or destruction. Description adds valuable retry behavior: definite failures retried up to 3 times, ambiguous deliveries never retried. This goes beyond the annotations, though it does not cover potential side effects like rate limits or credit consumption.
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 with no wasted words. The key constraints and retry policy are front-loaded, and the reference to sibling tools is efficient. 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?
With 11 parameters (4 required) and an existing output schema, the description covers scheduling constraints, retry behavior, and related tools. It does not describe the output format or errors, but that is acceptable since an output schema is present. Slight gap: missing note that the email might be sent from a specific account, but the 'account_id' parameter is documented in the 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 coverage is 82%, so most parameters have descriptions in the schema. The tool description does not add new parameter-level information beyond what the schema provides. The 'account_id' parameter is mentioned in the schema as well; the description doesn't elaborate further. 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?
Description clearly states 'Schedule an email for future delivery' with explicit time constraints (min 60 seconds, max 30 days). It distinguishes itself from siblings like 'list_scheduled_emails' and 'cancel_scheduled_email' by mentioning them as related tools, and implies differentiation from 'send_email' by focusing on scheduling.
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 clear context for when to use the tool (scheduling future emails) and mentions related tools for viewing and canceling schedules. However, it does not explicitly state to use 'send_email' for immediate delivery, which would strengthen guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_emailsSearch EmailsARead-only
Search the live mailbox by sender, recipient (To/CC/BCC), subject, body content, date range (received or sent), size, read/replied/starred/draft status, or attachment presence. Uses server-side IMAP SEARCH except hasAttachment, which filters locally. Use fts_search only for faster local ranked search after its index is built. Use folder for one folder or folders for many (pass ["*"] for all); returns summaries, so use get_email_by_id for full content.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by recipient address | |
| bcc | No | Filter by BCC recipient | |
| body | No | Search within email body content | |
| from | No | Filter by sender address or name | |
| text | No | Search headers and body (full text) | |
| limit | No | Max results (1-200, default 50) | |
| dateTo | No | ISO 8601 end date (INTERNALDATE — when received by server) | |
| folder | No | Single folder to search (ignored if `folders` is set) | INBOX |
| isRead | No | ||
| larger | No | Minimum email size in bytes | |
| folders | No | Search multiple folders. Use ["*"] to search all folders (capped at 20). Overrides `folder`. | |
| isDraft | No | Filter by draft status | |
| smaller | No | Maximum email size in bytes | |
| subject | No | Filter by subject text | |
| answered | No | Filter by whether email has been replied to | |
| dateFrom | No | ISO 8601 start date (INTERNALDATE — when received by server) | |
| isStarred | No | ||
| sentSince | No | Filter by Date: header since this date (ISO 8601) | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sentBefore | No | Filter by Date: header before this date (ISO 8601) | |
| hasAttachment | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| emails | Yes | |
| folder | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses server-side IMAP SEARCH, local filtering for hasAttachment, folder cap of 20, and returns summaries. No contradiction with readOnlyHint and openWorldHint 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?
Fully informative and well-structured, but slightly long; still every sentence adds value, earning a high score.
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 high schema coverage, output schema existence, and detailed description, the tool is fully specified for correct 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?
Adds context beyond the high-coverage schema: explains search mechanism, folder behavior, and local filter for hasAttachment, making parameter usage clear.
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 'Search the live mailbox' and enumerates many searchable fields, distinguishing it from sibling tools like fts_search and get_email_by_id.
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 fts_search (faster local ranked search) and get_email_by_id (full content), and explains folder vs folders usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_emailSend EmailA
Send an email via Proton Mail SMTP (through Proton Bridge). Supports To/CC/BCC (comma-separated), plain text or HTML body, priority (high/normal/low), reply-to, and base64-encoded attachments. Returns messageId on success.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC addresses, comma-separated | |
| to | Yes | Recipient address(es), comma-separated | |
| bcc | No | BCC addresses, comma-separated | |
| body | Yes | Email body (plain text or HTML) | |
| isHtml | No | Set true if body is HTML | |
| replyTo | No | Reply-to address (must be valid email) | |
| subject | Yes | Email subject line | |
| priority | No | Message priority header | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| attachments | No | Attachments as objects with filename, content (base64), contentType |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate the tool is mutating and not idempotent. The description adds context about SMTP transport, supported email fields, and that it returns a messageId on success. It does not cover rate limits or delivery behavior, but the added details are sufficient for basic 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 a single sentence that front-loads the core purpose and concisely lists supported features. Every part adds value, with no redundancy or unnecessary detail.
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 10 parameters and an existing output schema, the description covers the main purpose and supported options. It lacks details on error handling, sender identity, or immediate sending behavior, but is still fairly complete for a standard email send 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%, so parameters are already documented. The description reinforces that addresses are comma-separated and attachments are base64-encoded, adding slight extra meaning. However, it does not substantially improve 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 action ('Send an email via Proton Mail SMTP') and specifies the resource (email). It lists supported features like To/CC/BCC, HTML, priority, and attachments, distinguishing it from sibling tools like forward_email or reply_to_email which have different purposes.
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 does not provide guidance on when to use this tool versus alternatives such as forward_email, reply_to_email, schedule_email, or save_draft. It only describes functionality, leaving the agent to infer usage without explicit decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_test_emailSend Test EmailA
Send a test email to verify SMTP is working. Returns messageId on success. Use before relying on send_email in automated workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient address for the test | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| customMessage | No | Optional custom message body |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (all false), so the description carries the burden. It discloses that the tool sends an email and returns a messageId, but does not elaborate on side effects (e.g., actual delivery, rate limits). This is adequate but not comprehensive.
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 efficiently convey the core purpose and usage guidance. While concise, it could be slightly more streamlined, but there is 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 the tool's simplicity and the presence of an output schema, the description covers the main points: purpose, return value, and usage context. It is sufficiently complete for an agent to understand when and how to 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%, meaning the input schema already describes all parameters fully. The description adds no additional parameter semantics beyond what the schema provides, earning the 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 tool's purpose: to send a test email for verifying SMTP functionality. It mentions the return value (messageId) and distinguishes itself from the sibling send_email tool by advising to use it as a prerequisite.
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 recommends using this tool 'before relying on send_email in automated workflows,' providing clear context for when to use it. It does not include explicit when-not-to-use guidance, but the context strongly implies it is for testing only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_statusSetup & Connection StatusARead-only
CALL THIS FIRST. Diagnoses the mailpouch install end-to-end and returns the single next action to get connected: whether credentials are configured, whether Proton Bridge is reachable, and whether this agent's access has been approved. Always available — works even before the agent is approved or credentials are set. Use get_connection_status afterwards for live IMAP/SMTP auth health.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| imap | No | |
| smtp | No | |
| state | Yes | Overall install state — pick the next step from this. |
| nextStep | Yes | The single most-important action to take next. |
| username | No | |
| configPath | No | Path to the config file (default ~/.mailpouch.json; overridable via the MAILPOUCH_CONFIG env var). Redacted to '~/.mailpouch.json' for callers whose grant is not yet active. |
| configured | Yes | A username and Bridge password are configured. |
| grantStatus | No | This agent's per-agent grant state, or null when the local-agent gate is off. |
| insecureTls | No | TLS validation is disabled (no pinned Bridge cert). |
| configExists | No | |
| bridgeReachable | Yes | Both IMAP and SMTP Bridge ports accept TCP connections. |
| credentialStorage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is clear. The description adds behavioral details like 'returns the single next action' and 'always available', which go beyond annotations and help the agent understand what happens.
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?
Description is three sentences, front-loaded with the imperative 'CALL THIS FIRST', and no redundant information. 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?
Given the tool has an output schema (not shown but referenced), the description adequately explains what it returns (single next action) and when it's available. It covers all necessary context for a diagnostic 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 covers the single optional parameter (account_id) with a clear description (100% coverage). The main description does not add new parameter details, which is acceptable given the schema quality, earning a baseline score.
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 explicitly states 'CALL THIS FIRST' and clarifies it diagnoses end-to-end connectivity, listing specific checks (credentials, Proton Bridge reachability, agent access). It distinguishes itself from the sibling 'get_connection_status' by specifying the latter is for live IMAP/SMTP health.
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 usage context: 'CALL THIS FIRST' and 'Use get_connection_status afterwards'. It also notes it works even before the agent is approved or credentials are set, setting expectations for when to invoke.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shutdown_serverShutdown MCP ServerADestructive
Gracefully shut down the MCP server. Terminates Proton Bridge (regardless of whether this server launched it), disconnects IMAP/SMTP, scrubs credentials from memory, then exits. Requires { confirmed: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed | No | Must be true to execute when confirmation is required. | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description details specific destructive actions (terminates bridge, disconnects IMAP/SMTP, scrubs credentials, exits) beyond the annotations, providing valuable context for the agent.
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 cover all key points without unnecessary words, making it efficient 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?
Given the tool's complexity, the description covers graceful shutdown, effects, credential handling, and exit, 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 baseline is 3. The description adds marginal info for 'confirmed' but nothing for 'account_id', so it does not significantly enhance 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 verb 'shut down' and the resource 'MCP server', distinguishing it from sibling tools like 'restart_server' and 'start_bridge'.
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 mentions the requirement for confirmation parameter and that it terminates Proton Bridge, but does not explicitly state when to use versus alternatives or 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.
star_emailStar / Unstar EmailAIdempotent
Toggle the starred (flagged) status of an email. isStarred defaults to true. Pass sourceFolder whenever the UID came from a folder other than INBOX.
| Name | Required | Description | Default |
|---|---|---|---|
| emailId | Yes | ||
| isStarred | No | ||
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). | |
| sourceFolder | No | Folder the UID(s) live in (e.g. INBOX, Folders/Work, Labels/Foo). Strongly recommended whenever the UIDs came from a folder other than INBOX — IMAP UIDs are folder-scoped, so without this the wrong folder may be selected and the operation may silently no-op. Avoid passing 'All Mail' as the source: it is a union view of every folder, not a real location, so moves out of it can silently do nothing — pass the message's actual folder instead. Moving to the folder a message is already in is a no-op. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description says 'toggle' but annotations indicate idempotentHint=true, creating a contradiction: toggling implies non-idempotent flip while setting a boolean is idempotent. This misleads about actual behavior. Beyond that, no side effects or permissions are disclosed.
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. The first sentence states the action, the second adds critical usage detail. Perfectly 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 mutation tool, the description covers the main behavior and a key usage note. However, the toggle ambiguity and lack of mention about return value or required permissions (though output schema exists) leave some 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?
The description adds value by stating the default for isStarred and the strong recommendation for sourceFolder. Although emailId is not described, the schema coverage is 50% and the description compensates with practical context.
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 'Toggle the starred (flagged) status of an email' which is a specific verb-resource pair. It distinguishes from siblings like bulk_star by focusing on single 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?
The description provides a specific guideline about passing sourceFolder when the UID came from a folder other than INBOX. However, it does not explicitly tell when to use this tool over alternatives like bulk_star or mark_email_read, leaving usage context implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_bridgeStart Proton BridgeAIdempotent
Launch Proton Mail Bridge if it is not already running. Waits up to 15 s for SMTP/IMAP ports to become reachable before returning.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| reason | No | |
| success | Yes | |
| messageId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds behavioral details beyond annotations, such as the 15-second wait for ports and the idempotent start behavior. Annotations already provide idempotent hint, but the wait time is additional 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?
The description is two sentences, front-loaded with the main purpose, and contains no unnecessary words. 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?
Given the simplicity of the tool and presence of output schema, the description covers all essential aspects: what it does, idempotency, wait behavior. 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?
Schema coverage is 100%, so the parameter description already exists. The tool description does not add additional meaning about the account_id parameter, so 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 the tool launches the Proton Mail Bridge, with a specific verb and resource. It distinguishes itself from sibling tools by being the only tool related to starting the bridge service.
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 when the bridge is not running, but does not explicitly state when to use vs alternatives. However, the sibling context makes it clear, and the idempotent nature ensures safe repeated calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_emailsSync EmailsAIdempotent
Fetch the latest emails from IMAP into the local cache. Use this to refresh the cache after Bridge syncs new messages. Returns emails fetched; use get_emails for paginated access.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max emails to fetch (1-500, default 100) | |
| folder | No | Folder to sync. Default: INBOX | |
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | Yes | |
| folder | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnly=false, idempotent=true, destructive=false. Description adds context about cache refresh and return 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: one for main action, one for usage guidance and sibling distinction. 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?
Has output schema, so return values are covered. Description provides sufficient context for tool usage and parameter 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%; description does not add parameter details beyond schema, but baseline for high coverage is 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?
Clearly states verb 'fetch' and resource 'emails from IMAP into local cache'. Distinguishes from sibling 'get_emails' by noting paginated access.
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 this to refresh the cache after Bridge syncs new messages' and contrasts with 'get_emails for paginated access'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_foldersSync FoldersAIdempotent
Refresh the folder list from IMAP (invalidates folder cache). Call this after creating/renaming/deleting folders in another client or if folder counts seem stale.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab). |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| folderCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds value beyond annotations by disclosing that it invalidates the folder cache and involves an IMAP network operation. 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?
Two concise sentences, front-loaded with the core action, 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?
With only one optional parameter, output schema present, and comprehensive annotations, the description covers purpose, timing, and behavioral effect completely.
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 optional parameter is fully documented in the schema with description. The tool description does not repeat param details, which is acceptable 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 uses specific verb+resource ('Refresh the folder list from IMAP') and provides concrete use cases, distinguishing it from sibling tools like sync_emails 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?
Explicitly states when to call (after client-side changes, or when counts seem stale) and implies when not to use. Could mention alternatives but not necessary given clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
28 tool updates
v3.2.0- Removed
alias_create_contact - Removed
alias_create_custom - Removed
alias_create_mailbox - Removed
alias_create_random - Removed
alias_delete - Removed
alias_delete_contact - Removed
alias_delete_mailbox - Removed
alias_get_activity - Removed
alias_list - Removed
alias_list_contacts - Removed
alias_list_domains - Removed
alias_list_mailboxes - Removed
alias_options - Removed
alias_toggle - Removed
alias_toggle_contact - Removed
alias_update - Removed
bulk_delete - Changed
bulk_move_emails1 field changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "Must be true when targetFolder is Trash or Spam.", + "type": "boolean" +}
- Changed
delete_folder1 field changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "Must be true to execute when confirmation is required.", + "type": "boolean" +}
- Changed
download_attachment1 field changed- added
Input schema / properties / folderAdded value: +{ + "description": "Folder the email lives in. Required for folder-restricted agents and recommended for all callers because IMAP UIDs are per-folder.", + "type": "string" +}
- Changed
list_scheduled_emails2 fields changed- added
Output schema / properties / scheduled / items / properties / status / descriptionAdded value: +"outcome_unknown means SMTP was interrupted after dispatch; inspect Sent mail before retrying manually" - changed
Output schema / properties / scheduled / items / properties / status / enumPrevious value: -[ - "pending", - "sent", - "failed", - "cancelled" -]New value: +[ + "pending", + "sending", + "sent", + "failed", + "cancelled", + "outcome_unknown" +]
- Changed
move_email1 field changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "Must be true when targetFolder is Trash or Spam.", + "type": "boolean" +}
- Removed
pass_get - Removed
pass_list - Removed
pass_search - Removed
pass_totp - Changed
restart_server1 field changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "Must be true to execute when confirmation is required.", + "type": "boolean" +}
- Changed
shutdown_server1 field changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "Must be true to execute when confirmation is required.", + "type": "boolean" +}
87 tool updates
v3.1.0- Added
alias_create_contact - Changed
alias_create_custom1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Added
alias_create_mailbox - Changed
alias_create_random1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
alias_delete1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Added
alias_delete_contact - Added
alias_delete_mailbox - Changed
alias_get_activity1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
alias_list1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Added
alias_list_contacts - Added
alias_list_domains - Added
alias_list_mailboxes - Added
alias_options - Changed
alias_toggle1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Added
alias_toggle_contact - Added
alias_update - Changed
archive_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_delete1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_delete_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_mark_read1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_move_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_move_to_label1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_remove_label1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
bulk_star1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
cancel_reminder1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
cancel_scheduled_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
check_escalation_status1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
check_reminders1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
clear_cache1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
create_folder1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
delete_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
delete_folder1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
download_attachment1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
empty_trash1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
extract_action_items1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
extract_meeting1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
forward_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
fts_rebuild1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
fts_search1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
fts_status1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_connection_status1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_contacts1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_correspondence_profile1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_email_analytics1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_email_by_id1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_email_stats1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_emails_by_label1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_folders1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_logs1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_server_version1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_thread1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_unread_count1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
get_volume_trends1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
list_labels1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
list_pending_reminders1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
list_proton_scheduled1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
list_scheduled_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
mark_answered1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
mark_email_read1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
mark_forwarded1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
move_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
move_to_folder1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
move_to_label1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
move_to_spam1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
move_to_trash1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
pass_get1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
pass_list1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
pass_search1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Added
pass_totp - Changed
remind_if_no_reply1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
remove_label1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
rename_folder1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
reply_to_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
request_permission_escalation1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
restart_server1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
save_draft1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
schedule_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
search_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
send_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
send_test_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
setup_status1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
shutdown_server1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
star_email1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
start_bridge1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
sync_emails1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
- Changed
sync_folders1 field changed- added
Input schema / properties / account_idAdded value: +{ + "description": "Optional account ID to route this call to (multi-account configs). Omit to use the active account. Configured account IDs are listed in the settings UI (Accounts tab).", + "type": "string" +}
76 tool updates
v3.0.77- First observed
alias_create_custom - First observed
alias_create_random - First observed
alias_delete - First observed
alias_get_activity - First observed
alias_list - First observed
alias_toggle - First observed
archive_email - First observed
bulk_delete - First observed
bulk_delete_emails - First observed
bulk_mark_read - First observed
bulk_move_emails - First observed
bulk_move_to_label - First observed
bulk_remove_label - First observed
bulk_star - First observed
cancel_reminder - First observed
cancel_scheduled_email - First observed
check_escalation_status - First observed
check_reminders - First observed
clear_cache - First observed
create_folder - First observed
delete_email - First observed
delete_folder - First observed
download_attachment - First observed
empty_trash - First observed
extract_action_items - First observed
extract_meeting - First observed
forward_email - First observed
fts_rebuild - First observed
fts_search - First observed
fts_status - First observed
get_connection_status - First observed
get_contacts - First observed
get_correspondence_profile - First observed
get_email_analytics - First observed
get_email_by_id - First observed
get_email_stats - First observed
get_emails - First observed
get_emails_by_label - First observed
get_folders - First observed
get_logs - First observed
get_server_version - First observed
get_thread - First observed
get_unread_count - First observed
get_volume_trends - First observed
list_labels - First observed
list_pending_reminders - First observed
list_proton_scheduled - First observed
list_scheduled_emails - First observed
mark_answered - First observed
mark_email_read - First observed
mark_forwarded - First observed
move_email - First observed
move_to_folder - First observed
move_to_label - First observed
move_to_spam - First observed
move_to_trash - First observed
pass_get - First observed
pass_list - First observed
pass_search - First observed
remind_if_no_reply - First observed
remove_label - First observed
rename_folder - First observed
reply_to_email - First observed
request_permission_escalation - First observed
restart_server - First observed
save_draft - First observed
schedule_email - First observed
search_emails - First observed
send_email - First observed
send_test_email - First observed
setup_status - First observed
shutdown_server - First observed
star_email - First observed
start_bridge - First observed
sync_emails - First observed
sync_folders
TDQS
Each tool serves a clearly distinct purpose, with well-defined differences between single and bulk operations, folder vs label moves, and explicit convenience wrappers. Overlaps like move_email and its convenience variants are documented as such, so agents can confidently select the right tool.
All tool names use a consistent verb_noun pattern in snake_case, with modifiers like 'bulk_' or 'check_' for clarity. Even convenience wrappers follow the pattern (e.g., move_to_trash, archive_email). No mixing of conventions or ambiguous verbs.
With 66 tools, the count is well above the recommended range for a coherent set. While many tools are justifiable for the domain, the proliferation of convenience wrappers (e.g., archive_email, move_to_trash) and separate bulk variants bloats the surface unnecessarily, making it harder for agents to navigate.
The tool set covers the full email lifecycle: CRUD, labels, folders, search, scheduling, reminders, contacts, analytics, and server management. Minor gaps exist, such as the absence of a single-email permanent deletion (only bulk empty_trash) and no tool for managing filters or rules, but these are reasonable omissions for a personal email server.
Maintenance
Related MCP Connectors
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Hosted email for AI agents: create inboxes, send, receive, and reply over MCP with scoped API keys
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceMCP server that enables Claude Code agents to send and read emails via SMTP/IMAP with per-agent credential isolation and audit logging.MIT- AlicenseNot gradedqualityAmaintenanceA self-hosted MCP server that gives AI agents full email superpowers.1MIT
- FlicenseNot gradedqualityBmaintenanceA lightweight MCP server providing AI agents a scoped, read-and-draft-only view into Proton Mail via Proton Bridge, with code-enforced restrictions preventing external access or sending.-
- AlicenseNot gradedqualityAmaintenanceA local MCP server that unifies email and calendar management across multiple providers, enabling AI agents to search, read, and write with explicit approval and local-first security.1Apache 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/chandshy/mailpouch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server