mail-mcp
This server is a production-ready email MCP server that lets AI agents read, search, send, and manage email across multiple providers and protocols (IMAP, SMTP, Microsoft Graph API, and Exchange Web Services).
Read email: list accounts/mailboxes, check mailbox status, search messages with cursor pagination, fetch parsed messages (text/HTML/attachments), fetch raw RFC822 source, and download individual attachments to disk.
Send email: send new messages, reply (with threading headers and optional original attachments), forward messages, and verify SMTP connectivity — via SMTP, Graph API, or EWS.
Manage mailboxes: create, rename, delete mailboxes; copy, move, delete, append, and update flags on messages.
Bulk operations: move, delete, or update flags on up to 500 messages at once; search-and-move and search-and-delete in one call.
Multi-account and multi-provider: configure Gmail, iCloud, Zoho, Fastmail, Microsoft 365, Hotmail/Outlook, or any IMAP/SMTP server; use
account_idto target specific accounts.Attachments: send files from disk or inline base64; download received attachments to disk with optional inline base64 for small files.
Setup assistance:
get_setup_guideprovides provider-specific configuration instructions.
Provides tools for interacting with Gmail accounts, including reading, searching, sending, replying, forwarding, and downloading attachments, with Gmail-specific sent-mail handling to avoid duplicates.
Provides tools for interacting with Zoho Mail accounts, including reading, searching, sending, replying, forwarding, and downloading attachments, with provider-aware sent-mail handling to prevent duplicate copies.
Most email MCP servers only do IMAP reads. This one does everything: read, search, send, reply, forward, bulk operations, Microsoft Graph API, and Exchange Web Services — with real OAuth2, multi-account, and multi-provider support. Written in Rust for speed and safety.
What's New in v0.4.12
Community release — both changes came from external contributors. Thank you!
iCloud mailbox aliases + reads no longer mark messages as read by @felipefdl in #16. Short mailbox names now resolve to each provider's real folder (
Sent→Sent Messageson iCloud /[Gmail]/Sent Mailon Gmail,Trash→Deleted Messages, and so on, multi-language) in search, copy, and move. Raw message fetches now useBODY.PEEK[], so reading a message through the MCP no longer sets\Seenas a side effect — with aBODY[]fallback for servers that rejectPEEK(the deprecatedRFC822item, removed in #23, stays out). Validated against a real iCloud mailbox by the author; includes alias-resolution tests and iCloud setup docs.Optimized multi-stage Dockerfile + docker-compose by @monssefbaakka in #5. cargo-chef layer caching, TARGETARCH-aware musl cross-builds (amd64/arm64), and a
scratchruntime image — 16.9 MB, down from 25.5 MB — verified to respond to MCP initialize/tools-list over stdio. The toolchain pin was bumped to Rust 1.90 (the codebase's let-chains require >= 1.88).
Related MCP server: outlook-mcp-server
What's New in v0.4.11
Community bugfix release — both fixes came from external contributors. Thank you!
Fixed: save-to-Sent silently failed on strict IMAP servers (iCloud and others) by @dominikknafelj in #26, reported in #25. The
\Seenflag introduced in v0.4.10 was sent without the RFC 3501 parenthesized flag-list syntax (APPEND "Sent" \Seen …instead ofAPPEND "Sent" (\Seen) …), becauseasync-imapinterpolates the flags argument verbatim. Strict servers rejected the APPEND and the sent copy was lost — while the tool still reportedstatus: ok. Flags are now normalized before hitting the wire, andsmtp_send_message/smtp_reply_message/smtp_forward_messageresponses include a newsaved_to_sentfield (true/false, ornullwhen saving is disabled) so callers can detect archival failures. @tordable diagnosed and fixed the same root cause concurrently in #24.Fixed: message reads returned empty on iCloud by @tdabasinskas in #23. Raw message fetches used the deprecated
RFC822item, which iCloud accepts but leaves unpopulated. Fetches now use the IMAP4rev1BODY[]item — same\Seensemantics, works everywhere — with a mock-server regression test pinning the wire format.
What's New in v0.4.10
Community release — all three changes came from external contributors. Thank you!
NetEase IMAP compatibility (126.com / 163.com / yeah.net) by @pep-27 in #21. NetEase servers reject mailbox access from clients that don't identify themselves. mail-mcp now sends the RFC 2971
IDcommand after authentication whenever the server advertises theIDcapability. Includes mock-server regression tests and NetEase setup docs indocs/account-setup.md.MAIL_SMTP_<ID>_FROM_EMAIL— sender address override by @arwack in #19. For shared/group mailboxes where SMTP authenticates with a personal account but the From address should be the group address. Applies to send, reply (including reply-all self-address detection) and forward; falls back to_USERwhen unset.Sent-mail copies are now marked
\Seenby @ray-of-darkness in #9. Copies the MCP appends to the Sent folder after SMTP send no longer show up as unread.
What's New in v0.4.9
New tool
imap_get_attachment— download a single attachment to disk. Until now the only ways to reach attachment bytes wereimap_get_message(which returns attachment metadata and optional extracted PDF text, never the binary) andimap_get_message_raw(capped at 1 MB and base64-encoded into the response). A 7 MB email with X-ray images could not be retrieved at all — over the cap, and dumping it into the response would blow up the model's context anyway.How it works: call
imap_get_attachmentwith themessage_idplus a selector — eitherpart_id(the valueimap_get_messagereports for each attachment) orfilename. The server fetches the full message (no size cap on the server side), extracts and decodes just that one part, and writes it to disk, returning{ file_path, filename, content_type, part_id, size_bytes }. The binary never enters the response, so context stays small. The saved path feeds straight into a local reader (e.g. an image-description tool or a PDF reader).Where files land:
output_dirargument if given, else theMAIL_ATTACHMENT_DOWNLOAD_DIRenvironment variable, else the system temp dir. Filenames are sanitized (basename only, control characters stripped) to prevent path traversal, and prefixed with the message UID and part id to avoid collisions.Optional inline base64: set
include_base64: trueto also get the bytes in the response, but only when the attachment is at mostmax_inline_bytes(default 256 KiB). Off by default.
What's New in v0.4.8
SAVE_SENTis now per-account with a provider-aware default. Previously, saving a copy of outgoing mail to the Sent folder via IMAP APPEND was controlled by a single global flag,MAIL_SMTP_SAVE_SENT. The problem: providers that already save sent mail server-side (Gmail, Zoho) ended up with two identical copies in Sent, while a generic SMTP server or Office 365 (which do not auto-save on SMTP submission) lost the copy entirely when the flag wasfalse.Provider-aware default (when nothing is configured):
Gmail (
smtp.gmail.com): saves server-side and deduplicates by Message-ID → the MCP does not append (false).Zoho (
smtp.zoho.com): saves server-side but does not deduplicate → the MCP does not append (false), avoiding the duplicate.Office 365 / generic SMTP: do not auto-save on SMTP submission → the MCP does append (
true), or the sent copy would be lost.
Per-account override:
MAIL_SMTP_<ID>_SAVE_SENT=true|falsetakes priority over everything. The globalMAIL_SMTP_SAVE_SENTstill works as a coarse override (wins over the provider default, loses to the per-account override).Precedence: per-account → global → provider-aware default.
Provider | Auto-saves server-side | MCP default |
Gmail | Yes (with dedupe) |
|
Zoho | Yes (no dedupe) |
|
Office 365 (SMTP) | No |
|
Generic SMTP / relays | No |
|
What's New in v0.4.7
Critical fix —
graph_send_messagesilently dropped attachments on threaded replies. When called within_reply_to+attachments, thecreateReply → PATCH → sendflow included the attachments in the PATCH against/me/messages/{id}. Microsoft Graph treatsMessage.attachmentsas a navigation property and silently discards the field on PATCH (2xx response, no error), so the message went out as single-parttext/htmlwith no file. The MCP returnedstatus: okand the caller assumed success. Invisible data loss.The fix: in
send_via_reply(), attachments are now uploaded one by one toPOST /me/messages/{draft_id}/attachmentsbetween the PATCH and the send. Files < 3 MB go inline (JSON with base64contentBytes); files ≥ 3 MB usecreateUploadSessionwith 4 MB chunked PUTs. Theattachmentsfield was removed from thePatchDraftRequeststruct so the regression cannot be reintroduced by a type-correct edit.No change to flows that already worked.
send_via_sendmail(new messages withoutin_reply_to) usesPOST /me/sendMailwithattachmentsinline in the JSON — Graph DOES accept the field on that endpoint and never dropped it. That path is untouched.Regression test added:
patch_draft_request_never_serializes_attachmentsfails if anyone re-adds the field to the struct.Reference:
BUG_GRAPH_ATTACHMENTS.mdat the repo root documents the full reproduction, root cause, and the empirical evidence behind the fix.
What's New in v0.4.6
Server-side enforcement of HARD RULE #1. Three releases of prompt-only hardening (v0.4.3 → v0.4.4 → v0.4.5) still left LLMs occasionally leaking literal
</body_text><parameter name="body_html">markup into the recipient's inbox. v0.4.6 adds a real validator that rejects the tool call before any SMTP / Graph / EWS attempt ifbody_textorbody_htmlcontains tool-call wrapper syntax. The check is wired into all 5 send paths (smtp_send_message,smtp_reply_message,smtp_forward_message,graph_send_message,ews_send_message).The forbidden markers are case-insensitive and tightly scoped — only the pseudo-tags that have no legitimate use in human correspondence:
<body_text>,</body_text>,<body_html>,</body_html>,<function_calls>,</function_calls>,<invoke name=,</invoke>, and<parameter name="body_*">. Generic technical content that happens to mention<parameter>for an XML schema or<invoke>in a code example still passes.HARD RULE #1 wording updated to announce the server-side rejection, so the LLM knows it's a hard contract — not a suggestion it can ignore.
No breaking changes for clean callers: well-behaved messages send exactly as before.
What's New in v0.4.5
serverInfonow reportsname="mail-mcp"+ the crateversion(the framework previously returned its ownrmcp 0.16.0, which never changes between releases). Useful for verifying the active version with/mcp, and so any client-side cache keyed by (server, version) invalidates on each bump.MCP instructions reorganized: the 3 critical anti-concatenation rules (which in v0.4.3 and v0.4.4 sat at the end of the block and could be lost to truncation / diluted attention) now appear as HARD RULE #1, #2, #3 at the TOP, right after the title. Consolidated into 3 short paragraphs (previously 3 long sections, ~1500 characters combined).
No functional changes to the server. Same SMTP/IMAP/EWS/Graph, same tool set, same behavior. Only the text exposed to the client changed.
Important for these rules to take effect
Clients that resume a session with claude --continue (or /resume) do
NOT refresh the MCP system_prompt — they keep the one from that
session's first handshake. If your session predates v0.4.5, the rules won't
reach your context even if the on-disk binary is updated. To receive them,
start a NEW session in the project (not --continue).
What's New in v0.4.4
Preview hygiene rule in MCP
instructions: when the LLM shows the user the email preview before sending, it should render ONE clean version of the body (markdown-style bullets, bold, links as text + URL) and state that the message will go multipart — but it must NOT dump the raw HTML source (<p>,<strong>,<a href>...) into the preview. Two reasons:The human reviewer wants to read the message, not audit markup — showing the HTML is noise.
Exhibiting both the plain-text string AND the HTML string side by side in the preview is exactly the context that has historically led LLMs to concatenate them in the eventual tool call (the bug v0.4.3 documented). Hiding the HTML source from the preview removes the temptation.
Complements the PREVIEW DOES NOT EQUAL TOOL CALL rule introduced in v0.4.3.
What's New in v0.4.3
Server-side guidance against malformed tool calls. The MCP
instructionsblock now explicitly tells the calling LLM thatbody_textandbody_htmlare TWO SEPARATE JSON fields and must NEVER be concatenated. Previous wording ("send BOTH body_text AND body_html") was ambiguous and some LLMs interpreted it as "concatenate both with<body_text>...</body_html>pseudo-tags inside a singlebody_textstring". When that happens, the recipient sees garbled duplicated content, AND any later Claude session that opens the saved copy via this MCP gets a Usage Policy block (the leaked<invoke>...</invoke>looks like a prompt-injection attempt to safety filters). The new instruction shows a CORRECT vs WRONG example and bans pseudo-tags / tool-call wrapper syntax inside email fields.
What's New in v0.4.2
Release pipeline fixed: the
publish-npmjob in the CI release workflow has been disabled. It was inherited from the upstream fork and tried to publish to@bradsjm/mail-imap-mcp-rs, a scope this org does not own — every release was 404-ing on that step. See "Releasing" below for the full explanation and how to re-enable npm publishing if needed.Auto-trigger releases on tag push:
.github/workflows/release.ymlnow fires onpush: tags: ['v*'], so taggingvX.Y.Zand pushing is all it takes to cut a release.workflow_dispatchis retained as a manual escape hatch.Cleanup: removed the dangling
init-npm-placeholder.ymlworkflow (also referenced the fork's npm scope).docs: README gains a "Releasing" section documenting the new flow and the npm decision.
What's New in v0.4.1
Fix:
save_to_sent_foldernow archives the exact RFC822 bytes that were sent (vialettre.formatted()), instead of a hand-rolled text-only stub. The Sent-folder copy keeps the HTML body, the multipart/alternative structure, and the RFC 2047-encoded subject — no more???where accents used to be, and HTML is no longer silently dropped.Improved: localized Sent-folder detection —
Enviado[s],Elementos enviados,Enviadas,Itens enviados,Envoyés,Éléments envoyés,Gesendet,Posta inviata,Verzonden,Wysłane, plus nested variants. Previously only English names were recognized, so Zoho/localized IMAP accounts fell through to a non-existent"Sent"folder.Improved:
smtp_forward_messageacceptsbody_html(was hardcoded to plain-text only).Improved: EWS send gains
bcc,in_reply_to,references(via<t:InternetMessageHeaders>), plus full recipient + subject-length validation — now at parity with the SMTP and Graph send paths.Improved: Graph API threading fallbacks now log.
WARNwhen the message-lookup HTTP call fails (rate limit, 5xx, permissions) so operators see threading degraded due to a real error;DEBUGwhen the original message is legitimately not found.Refactor: EWS XML parsing migrated from substring matching to
quick-xml. Fixes a latent namespace-collision bug (<soap:Body>vs<t:Body>), correctly decodes XML entities and CDATA, and handles attribute values containing=(common in base64-like EWS item IDs).Cleanup: zero warnings on
cargo build --release.Tests: 64 (up from 47).
Why This Project
mail-mcp | Typical email MCP | |
IMAP read/write | 18 tools | 3-5 tools |
SMTP send/reply/forward | Yes | No or broken |
Microsoft Graph API | Yes | No |
EWS (Exchange Web Services) | Yes | No |
OAuth2 (XOAUTH2) | Native | No |
Multi-account | Yes | Single account |
Microsoft 365 + Hotmail | Both work | Usually neither |
Language | Rust (fast, safe) | TypeScript/Python |
Tests | 64 unit + integration | Mocks only |
Warnings in release build | 0 | Varies |
Feature Matrix
Provider | IMAP | SMTP | Graph API | EWS | OAuth2 | Multi-account |
Microsoft 365 (enterprise) | Yes | Admin-dependent | Yes | Yes | Yes | Yes |
Hotmail / Outlook.com | Yes | Blocked by MS | Yes | Yes | Yes | Yes |
Gmail | Yes | Yes | — | — | Yes | Yes |
Apple iCloud | Yes | Yes | — | — | — | Yes |
Zoho | Yes | Yes | — | — | — | Yes |
Fastmail | Yes | Yes | — | — | — | Yes |
Any IMAP/SMTP server | Yes | Yes | — | — | — | Yes |
EWS is the simplest way to add Microsoft accounts — single OAuth2 token for both reading and sending. Works even on tenants that block Graph API and IMAP.
Quickstart — Let Claude Code do it
Copy and paste this prompt into Claude Code and it will install, compile, and configure everything for you:
Install and configure the mail-mcp MCP server from https://github.com/tecnologicachile/mail-mcp
1. Clone the repo, build with cargo build --release
2. Add the MCP server to .claude.json with the binary path
3. For Microsoft accounts: use EWS (simplest) — run device code flow with
client_id d3590ed6-52b3-4102-aeff-aad2292ab01c and scope
https://outlook.office365.com/EWS.AccessAsUser.All offline_access
Then configure MAIL_EWS_<ID>_USER and MAIL_EWS_<ID>_REFRESH_TOKEN
4. For Gmail: configure MAIL_IMAP + MAIL_SMTP with App Password from
https://myaccount.google.com/apppasswords
5. For Zoho: configure MAIL_IMAP + MAIL_SMTP with standard password
6. Enable write/send: MAIL_IMAP_WRITE_ENABLED=true, MAIL_SMTP_WRITE_ENABLED=true
My email accounts to configure:
- <your-email@example.com>Replace the last line with your email(s). Claude Code will guide you through each step including the OAuth2 device code flow for Microsoft accounts.
Manual Setup (2 minutes)
git clone https://github.com/tecnologicachile/mail-mcp.git
cd mail-mcp
cargo build --releaseAdd to your MCP client config (Claude Code, Cursor, etc.):
{
"mcpServers": {
"mail": {
"command": "./target/release/mail-mcp",
"env": {
"MAIL_IMAP_DEFAULT_HOST": "imap.gmail.com",
"MAIL_IMAP_DEFAULT_USER": "you@gmail.com",
"MAIL_IMAP_DEFAULT_PASS": "your-app-password",
"MAIL_SMTP_DEFAULT_HOST": "smtp.gmail.com",
"MAIL_SMTP_DEFAULT_PORT": "587",
"MAIL_SMTP_DEFAULT_USER": "you@gmail.com",
"MAIL_SMTP_DEFAULT_PASS": "your-app-password",
"MAIL_SMTP_DEFAULT_SECURE": "starttls",
"MAIL_IMAP_WRITE_ENABLED": "true",
"MAIL_SMTP_WRITE_ENABLED": "true"
}
}
}
}That's it. Your AI agent can now read, search, send, reply, and manage emails.
Microsoft Account? Use Graph API
Microsoft blocks SMTP on personal accounts. Use Graph API instead:
{
"env": {
"MAIL_IMAP_DEFAULT_HOST": "outlook.office365.com",
"MAIL_IMAP_DEFAULT_USER": "you@hotmail.com",
"MAIL_IMAP_DEFAULT_PASS": "your-app-password",
"MAIL_OAUTH2_DEFAULT_PROVIDER": "microsoft",
"MAIL_OAUTH2_DEFAULT_CLIENT_ID": "9e5f94bc-e8a4-4e73-b8be-63364c29d753",
"MAIL_OAUTH2_DEFAULT_CLIENT_SECRET": "none",
"MAIL_OAUTH2_DEFAULT_REFRESH_TOKEN": "<your-token>"
}
}Get your token in 1 minute with device code flow. See Account Setup Guide.
31 MCP Tools
Read (9 tools)
Tool | What it does |
| List all accounts with capabilities (IMAP, SMTP, Graph, EWS) |
| List IMAP accounts |
| Test connectivity and auth |
| List folders |
| Message counts |
| Search with cursor pagination |
| Parsed message (text, HTML, attachments) |
| RFC822 source |
| Download one attachment to disk (bypasses the raw size cap) |
Write (11 tools)
Tool | What it does |
| Add/remove flags |
| Copy (cross-account supported) |
| Move to folder |
| Delete with confirmation |
| Create folder |
| Delete folder |
| Rename folder |
| Append raw message |
| Move up to 500 at once |
| Delete up to 500 at once |
| Flag up to 500 at once |
Send (5 tools)
Tool | What it does |
| Send email (text/HTML, CC/BCC) |
| Reply with threading headers |
| Forward with original inline |
| Test SMTP connectivity |
| Send via Microsoft Graph API (with reply threading) |
EWS — Exchange Web Services (3 tools)
Tool | What it does |
| Search emails via EWS (inbox, sent, drafts, etc.) |
| Get full email content via EWS |
| Send email via EWS |
Attachments
Send files with any send tool. Two modes:
// Large files — MCP reads from disk (recommended)
"attachments": [{"file_path": "/path/to/report.pdf"}]
// Small files — inline base64
"attachments": [{"filename": "note.txt", "content_type": "text/plain", "content_base64": "SGVsbG8="}]Filename and MIME type are auto-detected from the file path. Reply with include_original_attachments: true to forward original attachments.
Downloading an attachment from a received message: use imap_get_attachment
with the message_id and a part_id (from imap_get_message) or filename.
It writes the decoded file to disk and returns the path — no size cap, and the
binary stays out of the response. Set the default download directory with
MAIL_ATTACHMENT_DOWNLOAD_DIR (falls back to the system temp dir), or pass
output_dir per call.
Bulk Operations (2 tools)
Tool | What it does |
| Search + move matches |
| Search + delete matches |
Setup Helper (1 tool)
Tool | What it does |
| Provider-specific setup instructions (Microsoft OAuth2, Gmail/iCloud App Passwords, Zoho, etc.) |
Multi-Account
Configure as many accounts as you need:
# Gmail
MAIL_IMAP_GMAIL_HOST=imap.gmail.com
MAIL_IMAP_GMAIL_USER=me@gmail.com
MAIL_IMAP_GMAIL_PASS=app-password
# Apple iCloud (App-Specific Password from appleid.apple.com)
MAIL_IMAP_ICLOUD_HOST=imap.mail.me.com
MAIL_IMAP_ICLOUD_USER=you@icloud.com
MAIL_IMAP_ICLOUD_PASS=app-specific-password
MAIL_SMTP_ICLOUD_HOST=smtp.mail.me.com
MAIL_SMTP_ICLOUD_USER=you@icloud.com
MAIL_SMTP_ICLOUD_PASS=app-specific-password
MAIL_SMTP_ICLOUD_SECURE=starttls
# Microsoft 365
MAIL_IMAP_WORK_HOST=outlook.office365.com
MAIL_IMAP_WORK_USER=me@company.com
MAIL_OAUTH2_WORK_PROVIDER=microsoft
MAIL_OAUTH2_WORK_CLIENT_ID=your-client-id
MAIL_OAUTH2_WORK_CLIENT_SECRET=none
MAIL_OAUTH2_WORK_REFRESH_TOKEN=your-token
# Zoho
MAIL_IMAP_DEFAULT_HOST=imap.zoho.com
MAIL_IMAP_DEFAULT_USER=info@mydomain.com
MAIL_IMAP_DEFAULT_PASS=password
MAIL_SMTP_DEFAULT_HOST=smtp.zoho.com
MAIL_SMTP_DEFAULT_USER=info@mydomain.com
MAIL_SMTP_DEFAULT_PASS=password
MAIL_SMTP_DEFAULT_SECURE=starttlsUse account_id in tool calls: "account_id": "gmail", "account_id": "icloud", "account_id": "work", "account_id": "default".
Security
TLS enforced on all connections (except localhost proxies)
Passwords in SecretString — never logged or returned in responses
Write operations gated — require explicit
MAIL_IMAP_WRITE_ENABLED=trueSend operations gated — require explicit
MAIL_SMTP_WRITE_ENABLED=trueDelete confirmation — requires
confirm: trueHTML sanitized with ammonia (prevents XSS)
Bounded outputs — body text, HTML, attachments truncated to configurable limits
OAuth2 tokens cached with 10-minute refresh margin
No secrets in responses — credentials never exposed via MCP tools
Configuration Reference
IMAP (per account)
Variable | Required | Default | Description |
| Yes | — | IMAP server |
| No | 993 | IMAP port |
| Yes | — | Username |
| Yes* | — | Password (*optional with OAuth2) |
| No | true | Use TLS |
SMTP (per account)
Variable | Required | Default | Description |
| Yes | — | SMTP server |
| No | 587 | SMTP port |
| Yes | — | Username |
| No | — | Password (optional with OAuth2) |
| No | starttls |
|
| No | = | Sender address when it differs from the SMTP auth username (e.g. shared/group mailboxes) |
OAuth2 (per account)
Variable | Required | Default | Description |
| Yes | — |
|
| Yes | — | OAuth2 client ID |
| Yes | — | Client secret ( |
| Yes | — | Refresh token |
Graph API OAuth2 (per account)
Variable | Required | Default | Description |
| Yes | — |
|
| Yes | — | OAuth2 client ID |
| Yes | — | Client secret ( |
| Yes | — | Refresh token (Mail.Send scope) |
EWS — Exchange Web Services (per account, simplest for Microsoft)
Variable | Required | Default | Description |
| Yes | — | Email address |
| Yes | — | OAuth2 refresh token (EWS scope) |
| No |
| OAuth2 client ID |
| No |
| Client secret |
Tip: EWS only needs 2 variables (USER + REFRESH_TOKEN). Client ID defaults to Microsoft Office which has all permissions pre-approved.
Global Settings
Variable | Default | Description |
| false | Enable IMAP write operations |
| false | Enable SMTP/Graph send operations |
| false | Save sent emails to IMAP Sent folder (enable if your provider doesn't auto-save on send — e.g. Gmail does, Zoho doesn't always) |
| 30000 | SMTP TCP/TLS/auth timeout (connect phase) |
| 300000 | SMTP DATA transmission timeout (5 min — accommodates large attachments) |
| (deprecated) | Legacy single timeout. Honored as fallback for |
| 30000 | TCP connection timeout |
| 15000 | TLS/greeting timeout |
| 300000 | Socket I/O timeout |
Roadmap
IMAP read operations (search, fetch, parse)
IMAP write operations (copy, move, delete, flags)
IMAP bulk operations (up to 500 per call)
Cursor-based pagination with TTL
SMTP send, reply, forward
Microsoft Graph API (sendMail)
OAuth2 XOAUTH2 (Google + Microsoft)
Separate Graph API tokens for enterprise
Multi-account via environment variables
PDF text extraction from attachments
HTML sanitization (ammonia)
Provider setup documentation with direct links
Attachment sending (SMTP/Graph)
Reply with original attachments
CDATA sanitization (Zoho bug fix)
Email confirmation protocol (preview before send)
Token-optimized instructions (75% reduction)
On-demand setup guide tool
EWS (Exchange Web Services) — single token for read + send on Microsoft
EWS with Microsoft Office Client ID (works on restricted tenants)
Graph API threading —
createReplyflow for proper conversation threadingHTML formatting guidance — LLM prefers multipart (text + HTML) for human emails
Sent folder archiving preserves full MIME — byte-identical copy of what the recipient received (v0.4.1)
Localized Sent folder detection — Spanish / Portuguese / French / German / Italian / Dutch / Polish (v0.4.1)
EWS feature parity with SMTP/Graph — BCC, threading headers, recipient validation (v0.4.1)
EWS XML parser via
quick-xml— correct entity/CDATA/namespace handling (v0.4.1)
Next — Local cache with instant search
SQLite + FTS5 local email cache — instant searches (<10ms vs 3-10s)
Incremental sync — UIDVALIDITY + last UID delta sync
Connection pooling — persistent IMAP sessions per account
Cross-account search — search all accounts at once
Email statistics — counts, top senders, activity by date
Future
Docker image
npm/npx distribution
Draft management
Contact search
IMAP IDLE (real-time notifications)
Hosted documentation site
Documentation
Guide | Description |
Step-by-step per provider, OAuth2, App Passwords, Azure Client ID | |
Complete tool definitions and schemas | |
Stable message identifier format | |
Pagination behavior and expiration | |
Security features and best practices | |
Timeouts and performance tuning |
Development
cargo test # 64 unit + integration tests
cargo fmt -- --check # formatting
cargo clippy --all-targets -- -D warnings # lintingSee AGENTS.md for contributor guidelines.
Releasing
Releases are automated via cargo-dist. To ship a new version:
Bump
version = "X.Y.Z"inCargo.toml(the release workflow enforces that this matches the pushed tag).Commit the bump + any release notes to
main.Tag and push:
git tag vX.Y.Z git push origin main --tagsThe
push: tags: ['v*']trigger in.github/workflows/release.ymlcompiles binaries for Linux / macOS (Intel + Apple Silicon) / Windows, generates installer scripts (.sh,.ps1), creates the GitHub Release, and attaches all artifacts with SHA256 checksums.If anything fails you can re-run the workflow manually from the Actions tab (the
workflow_dispatchtrigger is preserved as an escape hatch).
npm publishing is intentionally disabled. The upstream fork was
configured to publish as @bradsjm/mail-imap-mcp-rs, a scope this
organization does not own, which caused every release to 404 on npm publish. The npm tarball is still generated and attached to each GitHub
Release so users can install via npm install ./mail-mcp-npm-package.tar.gz
manually. To enable npm registry publishing for this fork: create an npm
org (e.g. @tecnologicachile), configure Trusted Publishing on
npmjs.com pointing at this repo, set publish-jobs = ["npm"] in
dist-workspace.toml, and run dist generate --allow-dirty to restore
the publish-npm job in release.yml.
Contributing
Contributions welcome! Check out the issues for good first issues.
License
MIT License — see LICENSE for details.
Available Tools
31 toolsews_get_messageA
Get full email content via Exchange Web Services using an EWS item ID.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | EWS Item ID | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Get full email content' transparently indicates a read operation with no side effects, and 'full' clarifies the scope beyond the schema's 'get message details'. However, it does not address auth requirements, error behavior, or EWS-specific constraints, so it is only partially transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence of 13 words with the verb and resource front-loaded. Every word earns its place, and there is no redundant filler or restatement of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, no nested objects), and the output schema plus full parameter schemas cover invocation details. The only gap is the missing explicit link to ews_search_messages as the source of item IDs, but the prerequisite is implied by 'using an EWS item ID'.
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 both parameters are already documented. The description adds little beyond reinforcing that item_id is the EWS identifier. It does not mention account_id, so it adds no significant semantic value over 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 states a specific verb ('Get'), resource ('full email content'), and method ('via Exchange Web Services'), plus the required input ('EWS item ID'). This clearly distinguishes it from siblings like imap_get_message or graph_send_message by protocol and operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied: 'via Exchange Web Services' tells the agent this is the EWS option, and 'using an EWS item ID' implies the caller must already have an item ID (likely from ews_search_messages). However, no alternatives are named and no explicit when-to-use/when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ews_search_messagesA
Search emails via Exchange Web Services. Preferred for Microsoft accounts. Supports inbox, sent, drafts, deleted, junk folders.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum messages to return (1..50, default 10) | |
| folder | No | Folder name (inbox, sent, drafts, deleted, junk) | |
| offset | No | Offset for pagination (default 0) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It conveys a read-style search operation and lists supported folders, but it does not mention whether messages are marked read, permission requirements, pagination behavior, or search syntax. This is adequate but has clear gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the protocol, preferred account type, and folder scope with no filler. The key action and context are front-loaded before the supporting folder list.
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 and schema surprisingly expose no search query or criteria parameter, yet the tool is named 'search_messages'. An agent has no way to know what text/filters to provide or how the search is performed, which is a critical gap for invoking it correctly. The output schema helps with return shape but not with the missing search input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters (limit, folder, offset, account_id). The description adds only the folder enumeration, which mostly duplicates the folder parameter's allowed values. No additional parameter-level meaning is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search emails') over a named protocol ('Exchange Web Services') and delimits the resource scope to well-known mail folders. This distinguishes it from IMAP-based search siblings like imap_search_messages and from ews_get_message, which focuses on retrieving a specific message.
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?
'Preferred for Microsoft accounts' provides a clear context for when this EWS tool should be selected, especially alongside IMAP and Graph siblings. It does not name an explicit alternative or exclusion condition, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ews_send_messageA
Send email via Exchange Web Services. Works on Microsoft tenants that block SMTP and Graph API.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients (optional, max 50) | |
| to | Yes | Recipient email addresses (1..50) | |
| bcc | No | BCC recipients (optional, max 50) | |
| subject | Yes | Email subject | |
| body_html | No | HTML body | |
| body_text | No | Plain text body | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| references | No | References header for threading (optional) | |
| in_reply_to | No | In-Reply-To message ID for threading (optional) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits on its own. It only states that it sends email via EWS, but does not mention prerequisites (e.g., account setup), potential side effects (e.g., sent vs drafts), error handling, rate limits, or authentication requirements. The absence of such details leaves a significant gap for a mutation tool.
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 with no filler. The purpose is front-loaded with the verb and resource, and the differentiator (blocked SMTP/Graph) is included without excess.
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 9 parameters, all described in the schema, and an output schema present, the description is minimal but does not introduce critical missing context. It fails to mention any constraints like attachment support, account requirements, or explicit alternatives, but the schema covers parameters. The description is adequate but not thorough for a tool with many siblings.
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% since every parameter has a description in the input schema. The description adds no parameter-specific information beyond the schema, so it meets the baseline for well-documented schemas.
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 'Send' and the resource 'email via Exchange Web Services'. It also distinguishes from SMTP and Graph API by noting it works on tenants that block those, effectively separating it from sibling send tools like graph_send_message and smtp_send_message.
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 when to use: when SMTP and Graph API are blocked. It provides a condition but does not explicitly name alternatives or say 'use this instead of X when Y'. The implication is clear enough for an agent to infer, but it could be more direct.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_setup_guideA
Get detailed setup instructions for email providers (Microsoft OAuth2, Gmail, Zoho, etc.)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. 'Get detailed setup instructions' clearly signals a read-only, side-effect-free retrieval operation. It could add detail about whether instructions are static or fetched externally, but for a zero-parameter guide lookup the behavior is adequately 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?
The description is a single 12-word sentence that front-loads the verb and resource, then adds illustrative provider names. Every word contributes to conveying meaning; there is no filler 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?
For a parameterless tool with an output schema present, the description fully covers the purpose and scope. The output schema handles return-value details, so nothing an agent needs to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the description carries no parameter-documentation burden. Per the baseline for an empty parameter list, 4 is appropriate; the description correctly implies that no provider selection is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Get detailed setup instructions for email providers') with concrete examples (Microsoft OAuth2, Gmail, Zoho). It is the only sibling tool whose purpose is obtaining setup guidance, so an agent can immediately distinguish it from the message-operation and account-verification tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the use context clear: use this tool when you need setup instructions for email providers. It does not explicitly state when not to use it or name alternatives, but there are no competing siblings for this purpose, so the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graph_send_messageA
Send email via Microsoft Graph API (required for personal hotmail/outlook.com accounts where SMTP is blocked)
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients (optional, max 50) | |
| to | Yes | Recipient email addresses (1..50) | |
| bcc | No | BCC recipients (optional, max 50) | |
| subject | Yes | Email subject (1..998 characters) | |
| reply_to | No | Reply-To address (optional) | |
| body_html | No | HTML body (at least one of body_text or body_html required) | |
| body_text | No | Plain text body (at least one of body_text or body_html required) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| references | No | References header for threading (optional) | |
| attachments | No | File attachments (optional, base64-encoded) | |
| in_reply_to | No | In-Reply-To message ID for threading (optional) | |
| save_to_sent | No | Save to Sent Items folder (default: true) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries much of the behavioral burden. The top-level description only says 'via Microsoft Graph API', while the schema's own description adds that it uses POST /me/sendMail and requires OAuth2 with Mail.Send. The behavior is available to the agent through the schema, but the description itself adds no extra behavioral insight.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single imperative sentence with a tightly scoped parenthetical manages to convey both the action and the prime usage condition with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The combination of the compact description and the rich schema (100% param coverage, output schema, nested attachment definition) gives the agent everything needed to invoke it. The only thing absent from the description/schema is an explicit comparison to smtp_send_message, but the attention-grabbing definition 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 description does not mention any of the 12 parameters, but the schema provides 100% description coverage for every field, so the baseline of 3 applies. The schema fully describes recipients, subject, bodies, attachments, and threading fields.
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?
States a specific verb and target (send email via Microsoft Graph API) and immediately gives the critical use-case context (required when SMTP is blocked for personal hotmail/outlook.com accounts). This clearly separates it from sibling SMTP/EWS/IMAP senders.
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 parenthetical gives a clear condition for choosing this tool: personal hotmail/outlook.com accounts where SMTP is blocked. It does not explicitly name the preferred alternative (e.g., smtp_send_message) or describe when NOT to use it, 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.
imap_append_messageB
Append a raw RFC822 message to a mailbox
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | Target mailbox name | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| raw_message | Yes | Raw RFC822 message content (as UTF-8 string) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It only restates the basic action and does not mention side effects, authentication/account requirements, whether the mailbox must exist, message flags, or error conditions. The 'raw RFC822' wording hints at no transformation, but that is minimal.
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 front-loaded sentence with no filler or redundant phrasing. Every word contributes to the core operation, making it easy to parse quickly.
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 append operation with fully documented parameters and an output schema available, the description is minimally viable. However, it omits operational context such as precondition of mailbox existence, account selection behavior, and whether the append modifies or preserves the raw message, so an agent may still make incorrect assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are already documented with clear meaning (mailbox name, raw RFC822 content as UTF-8, account identifier with default). The description adds no parameter semantics beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb-resource pair: append a raw message to a mailbox. It is distinct from sibling operations like imap_move_message, imap_copy_message, and the send_message tools, since 'append' uniquely means inserting a message into an IMAP mailbox.
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 no guidance on when to use this tool versus alternatives such as smtp_send_message or graph_send_message, nor does it mention whether the mailbox must already exist via imap_create_mailbox. The only implied usage is the action itself, with no explicit context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_bulk_deleteC
Delete up to 500 messages in one operation
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Explicit confirmation required (must be `true`) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_ids | Yes | List of stable message identifiers (all must be from the same mailbox) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the behavioral burden, and it only says 'Delete'. It does not state that deletion is irreversible, that `confirm` must be true, or what happens to a batch if some IDs are invalid. The 'up to 500' limit is helpful but insufficient for a destructive operation.
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 compact sentence that front-loads the core action and limit. It is appropriately terse, though the lack of any usage context slightly limits its informational payoff.
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?
This is a destructive bulk operation with no annotations, multiple closely related sibling tools, a confirmation parameter, and a batch limit; the description alone does not provide enough context for an agent to safely select and invoke it. It omits when to use it, its destructive implications, and how confirmation is handled, despite having an output schema to cover 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 description coverage is 100%, and the property descriptions already explain the required confirm flag and message ID constraint. The tool description adds little beyond the word 'bulk', so it meets the baseline but does not enrich the parameter semantics.
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 names a concrete action ('Delete') and a resource dimension ('up to 500 messages in one operation'), which conveys the bulk nature of the tool. However, it does not explicitly distinguish this from imap_search_and_delete, which can also delete multiple messages, or clarify that target messages are supplied by message IDs.
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 about when to use imap_bulk_delete instead of imap_delete_message, imap_search_and_delete, or imap_bulk_move. The schema notes that message IDs must be from the same mailbox, but no explicit when-to-use or alternative-selection cues are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_bulk_moveB
Move up to 500 messages to a mailbox in one operation
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_ids | Yes | List of stable message identifiers (all must be from the same mailbox) | |
| destination_mailbox | Yes | Destination mailbox name |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavior disclosure. It exposes the 500-message cap but does not state that moving removes messages from the source mailbox, what happens on partial failure, or whether the operation is atomic. With no annotations, this is a meaningful gap.
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 begins with the action and resource, includes the key limit, and has no filler. It is well-structured and high-value for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema are rich, covering parameter meanings and return structure, so the description does not need to restate those. However, with no annotations, the description is still too thin: it does not help an agent decide when to use this over imap_move_message or imap_search_and_move, and it does not communicate source-removal consequences or error-handling expectations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters and all constraints (including that message_ids must come from the same mailbox), so schema coverage is 100% and the baseline is 3. The description's only extra contribution is the batch limit, which is a useful clarification but not beyond what provenance the schema 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?
Description says 'Move up to 500 messages to a mailbox in one operation', which is a specific verb (move), resource (messages), and scope (up to 500, one mailbox). This clearly distinguishes it from siblings like imap_move_message (single message) and imap_search_and_move (search-then-move).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not state when or when not to use this tool. It is not compared with imap_move_message, imap_search_and_move, or other alternatives, and there is no prerequisite or context direction. The only implied guidance is the bulk limit, which is not enough to help an agent pick between tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_bulk_update_flagsC
Update flags on up to 500 messages in one operation
| Name | Required | Description | Default |
|---|---|---|---|
| add_flags | No | Flags to add (e.g., `\\Seen`, `\\Flagged`) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_ids | Yes | List of stable message identifiers (all must be from the same mailbox) | |
| remove_flags | No | Flags to remove |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral transparency. It mentions the limit of 500 messages, which is good, but it does not disclose that the operation is a write/mutation, whether it is reversible, what happens on partial failures, or whether it requires authentication. The description gives a minimal hint of scope but lacks deeper behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, efficient and to the point. It front-loads the key action and limit. However, it is under-specified in other dimensions, relying heavily on the schema, which is acceptable for conciseness. It earns a 4 because it is appropriately sized for a simple tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 4 parameters and no annotations, the description is incomplete. It does not mention any error handling, partial updates, or the need for at least one of add_flags or remove_flags. The output schema exists but the description does not explain what the response contains. For a bulk operation, it should provide more context about batched behavior and side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description itself does not add any meaning beyond the schema. The schema already explains that 'message_ids' must be from the same mailbox and 'add_flags' and 'remove_flags' are optional. The description does not clarify the relationship between add_flags and remove_flags (e.g., whether at least one must be set) or provide examples. It adds no value beyond the schema, so I dock to 2.
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 says 'Update flags on up to 500 messages in one operation', which identifies the action (update flags) and the resource (messages), but it does not distinguish this tool from its sibling 'imap_update_message_flags'. Given the sibling exists, the description should specify the bulk nature as a differentiator; it does state 'up to 500 messages' but lacks explicit contrast. This is clear but not fully differentiating.
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. Siblings like 'imap_update_message_flags' suggest a single-message alternative, but the description does not mention it or any conditions for choosing one over the other. There is no mention of limitations like 'message_ids must be from same mailbox' (that is in schema), and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_copy_messageC
Copy a message to mailbox
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier | |
| destination_mailbox | Yes | Destination mailbox name | |
| destination_account_id | No | Destination account (if omitted, copies within same account) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full behavioral burden, and it is only a single clause. It does not state whether the source message remains intact (the key difference from imap_move_message), whether the destination mailbox must already exist, whether duplicates are allowed, or what error states exist. The cross-account capability appears in the schema description, not the tool description; the tool description itself discloses almost no behavior beyond the verb 'copy'.
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?
At six words, the description is maximally front-loaded and has no filler; every word earns a place. The brevity reads as telegraphic rather than distilled ('to mailbox' lacks an article), but there is no redundancy or burying of the key action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex operation that supports cross-account copies and has no annotations, the one-sentence description is too thin. An agent still has to guess what happens when the destination exists, whether the source is preserved, and how conflicts are handled; although the output schema covers return shape, the behavioral envelope is largely missing beyond the schema's parameter notes.
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%, and each of the 4 parameters (account_id, message_id, destination_mailbox, destination_account_id) has a type, description, and default/nullability. The tool description adds nothing about parameters, but with the schema carrying full weight, the baseline of 3 applies. Cross-account semantics are effectively explained in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the specific verb (copy) plus resource (message) and destination (mailbox), so the core purpose is unambiguous. It distinguishes from siblings mainly through the semantics of 'copy' as opposed to imap_move_message or imap_delete_message, but the differentiation is implicit rather than explicit.
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 no guidance on when to use this tool over alternatives like imap_move_message, imap_append_message, or ews tools, and no exclusions or prerequisites. The schema description mentions 'same-account or cross-account copies,' which is scope context but not routing guidance. An agent must infer when copy rather than move or append is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_create_mailboxC
Create a new mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
| mailbox_name | Yes | Name of the mailbox to create (e.g., `Archive/2024`, `Projects/Active`) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full burden of behavioral disclosure. It discloses the core mutation but says nothing about behavior when the mailbox already exists, whether nested folders are auto-created, or what side effects occur on the selected account.
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 with no filler and the action is front-loaded. It is efficient, but it sacrifices potentially useful behavioral context for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, has only two parameters, full schema coverage, and an output schema, so a terse description is viable. Still, it lacks guidance on duplicate handling, nested folder behavior, or account selection implications, making it minimally complete rather than fully helpful.
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%, and both account_id and mailbox_name already have meaningful descriptions, including an example of hierarchical mailbox naming. The tool description adds no extra parameter semantics, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation (create) and the resource (mailbox/folder), so an agent can tell it is the creation counterpart to imap_delete_mailbox and imap_rename_mailbox. However, it does not explicitly differentiate from siblings beyond the word 'new', so it is clear but minimally differentiated.
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 usage context is provided beyond the self-evident purpose of creation. There is no mention of prerequisites, when to prefer this over other mailbox operations, or conditions such as avoiding duplicate mailbox names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_delete_mailboxC
Delete a mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Explicit confirmation required (must be `true`) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| mailbox_name | Yes | Name of the mailbox to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description surfaces only that the operation deletes a mailbox/folder, but there are no annotations for readOnly or destructive behaviorconstant, and it does not disclose that deletion is irreversible or what happens to contained messages. Behavioral bar is higher in the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with zero filler; the action and target are 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 destructive tool with no safety annotations, the description is too thin. It omits irreversibility, impact on contained messages, and any distinction from near-siblings like imap_bulk_delete or imap_search_and_delete. The output schema partially compensates, but key behavioral context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameter detail is given beyond the target object. The schema presumably defines mailbox/folder and account parameters, so this is acceptable minimalism, but the description does not clarify essential usage semantics like which identifier is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action as deleting a mailbox/folder)Skip, which is specific enough to distinguish from message-level tools like imap_delete_message. It does not explicitly contrast with sibling mailbox operations, but the verb and target resource are 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?
No guidance is given on when to use this tool versus alternatives such as imap_rename_mailbox, imap_bulk_delete, or imap_search_and_delete. The description is limited to what the tool does, not when it is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_delete_messageC
Delete a message
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes | Explicit confirmation required (must be `true`) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It states the action (delete) and the confirm requirement, but does not disclose whether deletion is permanent, whether it moves to trash, whether it requires specific permissions, or what the output/return value is. The confirm parameter is mentioned in the schema, so the description adds little beyond that.
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 short ('Delete a message'), which is concise but under-specified. It front-loads the core action but omits important context. The schema description repeats the tool name and confirm requirement, adding some structure but not much 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's destructive nature and the presence of many sibling deletion tools, the description is incomplete. It does not explain the deletion semantics (permanent vs trash), the confirm flag's purpose beyond the schema, or how this differs from imap_bulk_delete and imap_search_and_delete. The output schema exists but the description doesn't reference what happens after deletion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters. The description adds no additional parameter meaning beyond what the schema provides. Baseline 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a message' states a clear verb and resource, but it does not differentiate from sibling tools like imap_bulk_delete or imap_search_and_delete, which also delete messages. The input schema's description adds a bit more context ('Requires explicit confirm=true') but the tool description itself is minimal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives like imap_bulk_delete or imap_search_and_delete. The schema mentions the confirm requirement, but there is no explicit context about when this tool is appropriate or when a sibling should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_get_attachmentA
Download one attachment to disk
| Name | Required | Description | Default |
|---|---|---|---|
| part_id | No | MIME part id to fetch (e.g. `1.2`), as shown by `imap_get_message`. Takes precedence over `filename` when both are given. | |
| filename | No | Attachment filename to fetch (case-insensitive). Used when `part_id` is omitted. | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier | |
| output_dir | No | Directory to save the attachment into. Overrides the server default (`MAIL_ATTACHMENT_DOWNLOAD_DIR`, else the system temp dir). | |
| include_base64 | No | Also return the raw bytes as base64 in the response, but only if the attachment is at most `max_inline_bytes`. Off by default to protect the context window. | |
| max_inline_bytes | No | Size ceiling (bytes) for inline base64. Ignored unless `include_base64` is `true`. Defaults to 262144 (256 KiB). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the text carries the burden. The schema-filled description explains the non-trivial behavior: it writes decoded bytes to disk and returns a path, keeps large binaries out of the response, and only inlines base64 when explicitly requested via include_base64 with a size ceiling (max_inline_bytes), "off by default to protect the context window." Small gaps remain (overwrite policy, error when the attachment is not found), but the core side effects 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?
A single seven-word sentence that front-loads the purpose with zero filler; all the detail efficiently lives in the schema. If anything it is almost too terse on its own (it doesn't mention file-side returns), but it does its part alongside the schema and is appropriately sized.
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 and 100% parameter documentation, an agent can invoke this tool: message_id is required, part selection by part_id or filename is described, defaults and environment-behavior are given, and the inline-base64 safety contract is stated. The only real ambiguity is that neither part_id nor filename is explicitly required — an agent could call it with only message_id; a brief 'supply one of part_id/filename' line would make the contract airtight.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well-documented: part_id takes precedence over filename, filename is case-insensitive, output_dir falls back to environment variables or system temp, max_inline_bytes defaults to 256 KiB. The description itself adds no extra meaning beyond these, which is consistent with the baseline-3 rule for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description is a compact, specific claim: 'Download one attachment to disk' — a verb, a resource, and a destination. It distinguishes this tool from siblings like imap_get_message and imap_get_message_raw (which fetch the message, not an attachment) and from ews_get_message, so an agent can pick the right tool from the name/description alone.
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?
There is no explicit when-to-use or when-not-to-use guidance and no mention of alternatives in the description. The schema hints at the workflow implied by 'as shown by imap_get_message' (list a message's attachments first), but that is an implicit pointer rather than a stated selection rule, so the agent must infer the usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_get_messageC
Get parsed message details
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier (format: `imap:{account}:{mailbox}:{uidvalidity}:{uid}`) | |
| include_html | No | Include sanitized HTML body | |
| body_max_chars | No | Maximum body characters (100..20000, default 2000) | |
| include_headers | No | Include headers in response | |
| include_all_headers | No | Include all headers (if `true`, overrides curated header list) | |
| extract_attachment_text | No | Extract text from PDF attachments | |
| attachment_text_max_chars | No | Maximum attachment text length (100..50000, requires `extract_attachment_text=true`) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It only states 'Get parsed message details', without disclosing whether the operation has side effects (e.g., marking messages as read), what happens on missing messages, or any rate limits/auth requirements. The phrase 'parsed' hints at processing, but most behavioral context is left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler words, so it is concise. However, it is so minimal that it does little more than restate the tool's function; there is no structured context beyond the one phrase.
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 8 parameters, no annotations, and many sibling tools, the one-sentence description is insufficient. The output schema covers return values, but the description does not explain how this tool fits among `imap_get_message_raw`, `imap_get_attachment`, `ews_get_message`, or when the various enrichment flags are appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The tool description itself adds no parameter-level meaning; all parameter semantics are already 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 ('Get') and resource ('parsed message details'), making the core function clear. However, it does not distinguish itself from sibling tools such as `imap_get_message_raw` or `ews_get_message`, so the agent cannot tell exactly what makes this variant 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?
There is no mention of when to choose this tool over alternatives like `imap_get_message_raw`, `imap_get_attachment`, or `ews_get_message`. No conditions, exclusions, or routing advice are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_get_message_rawB
Get bounded RFC822 source
| Name | Required | Description | Default |
|---|---|---|---|
| max_bytes | No | Maximum message bytes to return (1024..1000000, default 200000) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The word 'bounded' and the schema's max_bytes parameter indicate that the returned source may be truncated by a byte limit, which adds some behavioral clarity. However, with no annotations, the description does not disclose side effects, error behavior when max_bytes is exceeded, or authentication/state assumptions.
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 short, front-loaded phrase that communicates the core operation without redundant filler. It could add more context without becoming bloated, but it is concise and clear.
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 getter with a well-described schema PB and output schema, the description covers the basic operation. It omits when to use raw source versus imap_get_message or imap_get_attachment, and does not state that output may be truncated, which is relevant for an agent fetching a bounded raw message. Overall, this is serviceable but missing some decision-relevant 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?
The input schema describes all three parameters, including the required message_id and the max_bytes range/default, so parameter meaning is well covered. The tool description adds only the 'bounded' concept, which maps to max_bytes, but the schema carries most of the semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get bounded RFC822 source,' which clearly identifies the operation as retrieving raw, size-limited email source. It does not explicitly contrast this with sibling tools like imap_get_message or imap_get_attachment, so its differentiation is implied rather than stated.
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?
There is no guidance on when an agent should choose this tool over the similar siblings imap_get_message or imap_get_attachment. The description states what it does but not the intended use cases or prerequisites (e.g., needing the raw RFC822 source rather than a parsed representation).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_list_accountsA
List configured IMAP accounts (use list_all_accounts for full capabilities view)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral disclosure burden. 'List configured IMAP accounts' implies a read-only operation, but it does not clarify whether this validates connections, requires authentication, or how it differs from a full capabilities view beyond the sibling reference.
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 concise phrase with a useful sibling pointer. Every word earns its place and the key action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool, the description is mostly complete: it names the resource and the distinction from list_all_accounts. The lack of detail about whether this performs any connectivity checks or what the output shape looks like is a minor gap, but the output schema likely covers the latter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is trivial. With no inputs to document, the description does not need to add parameter-level detail. Baseline of 4 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 'List configured IMAP accounts' with a specific verb and resource. It distinguishes itself from the sibling list_all_accounts by pointing to it as the 'full capabilities' option, which differentiates the two without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides one routing hint: use list_all_accounts for a full capabilities view. However, it does not explain when to choose imap_list_accounts over imap_verify_account or other listing-related tools, nor does it state any limitations of this view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_list_mailboxesB
List mailboxes for an account
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosure. The verb 'list' implies read-only behavior, but the description does not explicitly state side effects, safety, or whether data is modified. It adds no behavioral detail beyond the bare action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no superfluous words. It is perfectly sized for a simple list operation, with the action and scope 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?
The tool has only one optional parameter, an output schema is present, and the operation is a straightforward list. The description adequately conveys the purpose, and the output schema covers return details. It does not, however, explain that the list is scoped to the given account ID, though that is 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?
The account_id parameter is fully documented in the input schema with a default value of 'default'. The description only says 'for an account' and adds no supplementary meaning to the parameter. Since schema coverage is 100%, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'list' and names the resource 'mailboxes' for an account, making the action unmistakable. It does not explicitly differentiate from sibling tools like imap_list_accounts or imap_mailbox_status, but the resource is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance about when to use this tool versus alternatives, no mention of related operations such as listing accounts or checking mailbox status, and no exclusions. The agent receives no contextual direction beyond the description itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_mailbox_statusA
Get mailbox message counts (total, unseen, recent) without selecting it
| Name | Required | Description | Default |
|---|---|---|---|
| mailbox | Yes | Mailbox name to check status of | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It explicitly states that the mailbox is not selected, which is a meaningful side-effect guarantee. It also indicates the return focus (message counts) even though the output schema already exists. It does not cover errors or authentication, but for a simple read-only status tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler. It front-loads the action and resource, then adds the key behavioral differentiator ('without selecting it'). Every word contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with a complete output schema and a clear, low-risk behavior, the description is fully adequate. It explains what the tool returns, confirms the no-selection behavior, and the schema covers all invocation details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents both parameters (mailbox and account_id). The description adds no parameter-specific meaning beyond the schema, and that is acceptable because the parameters are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Get mailbox message counts') and narrows the scope to total, unseen, and recent counts. It distinguishes itself from sibling message-fetching and search tools (e.g., imap_get_message, imap_search_messages) by stating it does not select the mailbox.
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 phrase 'without selecting it' gives clear context that this is a lightweight, side-effect-free status check, which tells the agent when to use it instead of operations that require mailbox selection. It does not explicitly name alternatives or exclusions, but the context is clear enough for correct routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_move_messageC
Move a message to mailbox
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier | |
| destination_mailbox | Yes | Destination mailbox name |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for disclosing side effects, yet it only says 'Move a message to mailbox.' It does not state that the message is removed from the source mailbox, whether the destination must already exist, or any error/permission consequences. The same-account limitation is additionally hidden in the schema 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 a single front-loaded sentence with no wasted words. It is appropriately compact, though it sacrifices useful behavioral context for brevity.
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 mutating operation with no annotations, the description is too thin. It omits the same-account limitation and the destructive effect on the source mailbox, leaving the agent to discover these from the schema description or infer them from the tool name. The output schema covers return shape, so that part is not a gap.
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%, and all three parameters already have meaningful descriptions, so the schema carries the parameter-level semantic weight. The tool description adds no additional parameter detail beyond this.
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 operation: moving a message to a mailbox, with a specific verb and resource. It does not explicitly distinguish itself from siblings like imap_bulk_move or imap_copy_message, so it stops short of full 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 gives no guidance on when to use this tool over imap_bulk_move, imap_search_and_move, or imap_copy_message. The same-account constraint appears only in the schema description, not in the tool description, so an agent must infer usage from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_rename_mailboxC
Rename a mailbox/folder
| Name | Required | Description | Default |
|---|---|---|---|
| to_name | Yes | New mailbox name | |
| from_name | Yes | Current mailbox name | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only repeats the mutation implied by the name and does not mention effects on messages, permission requirements, reversibility, or error conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, short sentence with no filler and the core action is front-loaded. It is efficient, though it sacrifices potentially useful context for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple rename operation, the description plus the complete schema is roughly adequate. However, with no annotations and no usage guidance, the agent is left to assume behavioral details such as whether the mailbox must be empty or whether the operation is reversible.
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 fully documents all three parameters (from_name, to_name, account_id), giving 100% coverage. The description adds no parameter-level meaning, but the schema already provides the necessary context, so the 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?
The description uses a specific verb ('Rename') and a clear resource ('mailbox/folder'), which distinguishes it from sibling move/create/delete tools. It is slightly terse but not tautological or misleading.
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?
There is no guidance on when to use this tool versus imap_create_mailbox or imap_delete_mailbox, nor any mention of prerequisites or side effects. The agent must infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_search_and_deleteC
Search messages and delete matches in one operation (up to 500)
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by To header | |
| from | No | Filter by From header | |
| limit | No | Maximum messages to delete (1..500, default 500) | |
| query | No | Full-text search query | |
| confirm | Yes | Explicit confirmation required (must be `true`) | |
| mailbox | Yes | Source mailbox to search (e.g., `INBOX`) | |
| subject | No | Filter by Subject header | |
| end_date | No | Filter to messages before this date (YYYY-MM-DD) | |
| last_days | No | Filter to messages from last N days | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| start_date | No | Filter to messages on or after this date (YYYY-MM-DD) | |
| unread_only | No | Filter to unread messages only |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the behavioral burden. It correctly signals destructive intent ('delete') and the 500-message cap, but does not state that deletion is permanent or how confirm=true gates execution. For a destructive combined operation this is a significant gap.
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?
One short sentence front-loads the purpose and the cap; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (12 params, required confirmation, destructive + search behavior), yet the description is a single phrase. It omits irreversible delete semantics, the confirm gate, how matching works across criteria, and what the response/outcome looks like.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents each parameter well, so the description does not need to duplicate them. It adds nothing about how filters combine or matching semantics, but with ~90% schema coverage the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the operation: search messages and delete matches in one combined action, including the 500-message cap. It distinguishes this from pure search or pure delete tools, though it does not explicitly name a sibling tool.
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 phrase 'in one operation' hints at the use case (avoiding separate search-then-delete calls), but there is no guidance on when to choose this vs. search_messages, mailbox requirements, or safety steps like requiring confirm=true. No conditions or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_search_and_moveA
Search messages and move matches to a mailbox in one operation (up to 500)
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by To header | |
| from | No | Filter by From header | |
| limit | No | Maximum messages to move (1..500, default 500) | |
| query | No | Full-text search query | |
| mailbox | Yes | Source mailbox to search (e.g., `INBOX`) | |
| subject | No | Filter by Subject header | |
| end_date | No | Filter to messages before this date (YYYY-MM-DD) | |
| last_days | No | Filter to messages from last N days | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| start_date | No | Filter to messages on or after this date (YYYY-MM-DD) | |
| unread_only | No | Filter to unread messages only | |
| destination_mailbox | Yes | Destination mailbox name |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must convey behavioral details. It discloses the operation (search and move), the limit of 500 messages per call, and that it returns up to 500 messages. It does not mention whether moved messages are flagged as read or if the operation is reversible, but the provided details are reasonable for the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise, just two sentences in the main description. The schema description expands with details but the tool's description is front-loaded with the primary purpose and key limitation. 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 complexity (12 parameters, output schema present, and schema covering all parameters), the description is sufficient. It does not explain the output schema contents, but that is likely documented in the output schema itself. It adequately explains the combined operation and the limit, which is the most critical constraint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are fully documented in the schema. The description adds context by mentioning the limit (500) and the single call nature, but does not add further meaning beyond the schema. Therefore baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Search messages and move matches to a mailbox in one operation'. The verb and resource are specific, and the schema description adds context about combining search and move. It is distinguishable from siblings like imap_search_messages and imap_bulk_move, though it doesn't explicitly name the alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage context by stating it combines search + bulk move to avoid round-trip overhead, which suggests it is used when needing to move search results in bulk. However, it does not explicitly state when to prefer this over separate imap_search_messages + imap_bulk_move calls, so guidance is clear but not comprehensive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_search_messagesC
Search messages with cursor pagination
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Filter by To header | |
| from | No | Filter by From header | |
| limit | No | Maximum messages to return (1..50, default 10) | |
| query | No | Full-text search query | |
| cursor | No | Pagination cursor from previous search result | |
| mailbox | Yes | Mailbox to search (e.g., `INBOX`, `Sent`, `Archive`) | |
| subject | No | Filter by Subject header | |
| end_date | No | Filter to messages before this date (YYYY-MM-DD) | |
| last_days | No | Filter to messages from last N days | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| start_date | No | Filter to messages on or after this date (YYYY-MM-DD) | |
| unread_only | No | Filter to unread messages only | |
| include_snippet | No | Include subject snippet in results | |
| snippet_max_chars | No | Maximum snippet length (50..500, requires `include_snippet=true`) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It only mentions cursor pagination; it does not disclose read-only semantics, result ordering, default limits, or what the cursor means for follow-up calls.
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?
One short sentence, front-loaded with verb and resource. Concise, though arguably too terse for a multi-criteria search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 parametersiki and cursor pagination, the 5-word description leaves out search semantics, filter combinations, result ordering, and cursor behavior. Output schema may cover return values but not calling context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers 100% of parameters with descriptions, so baseline 3 applies. The description adds no parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Search messages') and adds a distinguishing behavioral detail ('cursor pagination'). It does not explicitly differentiate from sibling search tools, but the core purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives, how filters combine, or how pagination should be driven. The description is purely declarative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_update_message_flagsC
Add or remove IMAP flags
| Name | Required | Description | Default |
|---|---|---|---|
| add_flags | No | Flags to add (e.g., `\Seen`, `\Flagged`, `Important`) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message identifier | |
| remove_flags | No | Flags to remove |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral details, but it only says flags can be added or removed. It does not state whether existing unlisted flags remain unchanged, exactly when both add and remove are allowed together, or what errors or side effects may occur.
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 front-loaded sentence with no filler, making it appropriately concise. It is slightly too terse to be fully self-sufficient, but it structurally keeps the essential operation at the front.
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?
While the input/output schemas cover parameter and return semantics, the description omits the contextual layer: no guidance on single-message versus bulk use, no side-effect disclosure, and no distinction from the highly similar sibling `imap_bulk_update_flags`. Given the number of IMAP siblings, this is a meaningful completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters already document `add_flags`, `remove_flags`, `message_id`, and `account_id`. The description adds no parameter-level detail beyond restating the add/remove operation, so the 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?
The description clearly states the operation as adding or removing IMAP flags, so the action and resource are identifiable. However, it does not distinguish single-message behavior from the sibling `imap_bulk_update_flags`, leaving some differentiation to inference.
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 no when-to-use or when-not-to-use guidance, and names no alternatives. Nothing indicates when to choose this tool over `imap_bulk_update_flags`, `imap_search_and_delete`, or other flag-related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
imap_verify_accountC
Verify account connectivity and capabilities
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It mentions verification but does not state whether this performs network calls, requires authentication, or has side effects. It also doesn't describe the output format (despite an output schema existing, the description could clarify typical outcomes like success/failure or connection details). This is inadequate for a tool with potentially significant network behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence, which is concise)Skip. However, it is under-specified; it does not front-load critical details like the requirement of an account_id or the fact that it checks connectivity. Every word is used, but the sentence is too terse to be truly helpful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having an output schema (which mitigates return-value explanation), the description is incomplete for a tool checking connectivity and capabilities. It should mention that it verifies network access, authentication, and likely returns a report of capabilities. With no annotations and minimal description, an agent lacks essential context to use this tool effectively.
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 100% for the single parameter (account_id), and the description provided in the schema is complete. However, the tool description itself adds no additional meaning beyond the schema. Since coverage is 100%, a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Verify account connectivity and capabilities' states a clear verb and resource, but it is too generic and does not distinguish this tool from its siblings like imap_list_accounts or smtp_verify_account. The purpose is understandable but lacks specificity about what exactly is verified (e.g., IMAP server reachable, authentication works) and does not convey the scope of 'capabilities'.
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?
There is no guidance on when to use this tool versus alternatives. With siblings like imap_list_accounts (listing accounts) and smtp_verify_account (similar verification but for SMTP), the description gives no context about choosing between them. An agent would have to infer that this is for IMAP-specific verification, but no exclusions or alternative mentions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_all_accountsA
List all configured email accounts with their capabilities (IMAP, SMTP, Graph API, EWS). Use this to know which send/read tools to use per account.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and it does solid work: it discloses what the tool returns (accounts plus capabilities) and the implied read-only nature of a listing operation. It could add notes on account source or result structure, but the output schema covers much of the remaining detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The primary action and resource are front-loaded, and the usage guidance is delivered in a short second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless listing tool with an output schema, the description is complete: it names the resource, the returned capability dimensions, and the decision-support purpose. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and 100% schema description coverage, so there is nothing for the description to clarify. The baseline of 4 applies, and the description adds no parameter-related content, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a clear resource ('all configured email accounts'), and the key differentiator: it reports per-account capabilities for IMAP, SMTP, Graph API, and EWS. This clearly distinguishes it from sibling tools like imap_list_accounts, which is protocol-scoped.
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 the agent when to use the tool: to know which send/read tools to use per account. It does not explicitly enumerate alternatives or exclusions, but the purpose is specific enough that an agent can select it correctly without confusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smtp_forward_messageB
Forward an existing message via SMTP
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Forward recipients (1..50) | |
| body_html | No | Optional cover note (HTML). Unlike `body_text`, this is sent as-is — the original message is NOT auto-quoted into the HTML part. If you need an HTML forward with the original embedded, compose it yourself and use `smtp_send_message`. | |
| body_text | No | Optional cover note (plain text). The original message is appended below as a quoted block. | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message ID of the message to forward |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavioral disclosure. It only says 'Forward an existing message via SMTP' and does not disclose how the original is fetched, how the body is handled, what side effects occur (sending a new email), or any failure modes. Behavioral traits are left to the schema or the agent’s guesses.
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, front-loaded sentence with no repetitive or unnecessary words. It efficiently says what the tool does without restating the name verbatim. The one-sentence structure is ideal for clarity and quick scanning.
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 schema is rich (100% coverage, detailed parameter descriptions) and an output schema exists, so return values need not be described. However, the description lacks usage context (when to use vs smtp_reply_message, prerequisites, and consequential behavior), which is not fully compensated by the parameter descriptions. It is minimally complete but not genuinely helpful for a human–agent decision.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter coverage with detailed descriptions for each field. The description itself adds no semantic meaning beyond the schema, which is sufficient at the baseline level for a fully-covered schema. Nothing is repeated or expanded in the description text, so no bonus is earned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Forward') and resource ('existing message via SMTP'), which is sufficient to distinguish it from smtp_send_message or smtp_reply_message. However, it does not explicitly call out or differentiate from these siblings, so it lacks the explicit cross-tool comparison that would earn a 5.
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 no guidance on when to choose this tool over alternatives. It does not mention conditions, prerequisites, or exclude smtp_send_message / smtp_reply_message. Some schema parameters hint at alternatives, but the description text itself offers no usage direction, which is a clear gap given the sibling wave.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smtp_reply_messageA
Reply to an existing message via SMTP (fetches original for proper threading)
| Name | Required | Description | Default |
|---|---|---|---|
| body_html | No | Reply body (HTML, optional) | |
| body_text | Yes | Reply body (plain text) | |
| reply_all | No | Reply to all recipients (default: false, reply to sender only) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| message_id | Yes | Stable message ID of the message to reply to | |
| attachments | No | Additional file attachments (optional, base64-encoded) | |
| include_original_attachments | No | Include original email's attachments in the reply (default: false) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It explains that the tool fetches the original message via IMAP to construct proper reply headers (In-Reply-To, References, Re: Subject), which is a meaningful behavioral detail beyond a simple 'sends a reply.' However, it does not cover error cases, side effects of sending, or whether the operation is safe or reversible. Given the disclosure of the threading implementation, this is above the baseline of 3 but not a full 5 because it omits potential pitfalls (e.g., failure if original not found, sending failure).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, information-dense sentence that leads with the action and immediately adds the key threading detail. There is no fluff or redundancy. Every word contributes to clarifying the tool's purpose and distinguishing it from alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (7 parameters, nested attachment object, output schema present), the description is largely complete: it defines the purpose and key behavior. However, it does not explicitly address sibling selection (e.g., 'use this instead of smtp_send_message when replying') or mention dependencies like IMAP availability. The schema fills parameter details, but the description could better position the tool among the 31 siblings. It is complete enough for a competent agent but leaves some room for clearer guidance.
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 all seven parameters (message_id, body_text, body_html, reply_all, account_id, attachments, include_original_attachments) are already documented with their meanings and defaults. The description adds context about the threading behavior but does not enhance the understanding of any specific parameter. Since the schema carries the weight, a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Reply') and resource ('an existing message via SMTP'), and adds a concrete differentiator ('fetches original for proper threading'). This clearly distinguishes it from smtp_send_message (new message) and smtp_forward_message (forwarding), leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (to reply to an existing message) but does not explicitly contrast it with alternatives like smtp_send_message or smtp_forward_message. There is no 'use this instead of...' guidance, nor mention of prerequisites such as the original message being accessible via IMAP. Usage is clear from the name and phrasing, but the description does not actively route the agent away from siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smtp_send_messageB
Send a new email via SMTP
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | CC recipients (optional, max 50) | |
| to | Yes | Recipient email addresses (1..50) | |
| bcc | No | BCC recipients (optional, max 50) | |
| subject | Yes | Email subject (1..998 characters) | |
| reply_to | No | Reply-To address (optional) | |
| body_html | No | HTML body (at least one of body_text or body_html required) | |
| body_text | No | Plain text body (at least one of body_text or body_html required) | |
| account_id | No | Account identifier (defaults to `"default"`) | default |
| references | No | References header for threading (optional) | |
| attachments | No | File attachments (optional, base64-encoded) | |
| in_reply_to | No | In-Reply-To message ID for threading (optional) |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description carries the full disclosure burden. It only says it sends an email via SMTP and does not mention that delivery is irreversible, that an authenticated SMTP account may be required, or that external network delivery implies potential rate limits/failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler words. Everything present is directly useful for purpose, and it does not restate the schema or over-explain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool this complex (11 parameters, no annotations), the description is minimal and provides little beyond the basic purpose. The schema and output schema fill in almost everything about parameters and return values; the main remaining gap is the broader usage context and side-effect disclosure, which is already reflected in the Usage and Transparency scores.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has full coverage of parameter descriptions, so the baseline of 3 applies. The description adds no parameter-specific meaning itself, but the schema descriptions already explain usage, required fields, limits, and attachments, so the agent is not left without parameter 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 states a specific verb and resource ('send a new email via SMTP'), and the words 'new' and 'SMTP' help distinguish it from reply/forward and from Graph/EWS sending siblings. It does not name sibling tools, but the phrasing is specific enough for an agent to identify the tool's basic role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase 'send a new email via SMTP' — the agent can infer it is for new outbound messages rather than replies/forwards. However, there is no explicit when-to/when-not-to guidance and no mention of alternative sending tools like smtp_reply_message, smtp_forward_message, or Graph/EWS senders.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smtp_verify_accountA
Test SMTP account connectivity and authentication
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Account identifier (defaults to `"default"`) | default |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | Tool-specific data payload |
| meta | Yes | Execution metadata (timestamp, duration) |
| summary | Yes | Human-readable summary of the operation outcome |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The word 'test' implies a read-only, non-mutating operation, but no annotations are present and the description does not explicitly state that no message is sent or that only connectivity/auth credentials are checked. It gives a reasonable behavioral hint without fully owning the transparency burden.
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 short and front-loaded, with no filler words. It is appropriately concise for a simple tool, though it could have included a little more operational context without becoming bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an available output schema, the description is largely adequate. The main missing context is usage guidance and explicit side-effect clarity, which would make it 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?
There is only one optional parameter, account_id, and the schema fully describes it, including its default value. The description adds no extra meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ('Test') and names the specific resource ('SMTP account') and the exact concern ('connectivity and authentication'). It clearly separates this from sending/forwarding/reply tools and from the equivalent IMAP verification tool.
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 the intended use: verify an SMTP account's reachability and credentials. However, it does not explicitly mention alternatives such as imap_verify_account, prerequisites like prior setup/configuration, 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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
31 tool updates
v0.4.12- First observed
ews_get_message - First observed
ews_search_messages - First observed
ews_send_message - First observed
get_setup_guide - First observed
graph_send_message - First observed
imap_append_message - First observed
imap_bulk_delete - First observed
imap_bulk_move - First observed
imap_bulk_update_flags - First observed
imap_copy_message - First observed
imap_create_mailbox - First observed
imap_delete_mailbox - First observed
imap_delete_message - First observed
imap_get_attachment - First observed
imap_get_message - First observed
imap_get_message_raw - First observed
imap_list_accounts - First observed
imap_list_mailboxes - First observed
imap_mailbox_status - First observed
imap_move_message - First observed
imap_rename_mailbox - First observed
imap_search_and_delete - First observed
imap_search_and_move - First observed
imap_search_messages - First observed
imap_update_message_flags - First observed
imap_verify_account - First observed
list_all_accounts - First observed
smtp_forward_message - First observed
smtp_reply_message - First observed
smtp_send_message - First observed
smtp_verify_account
TDQS
Scored across 31 tools
The same core operations (send, search, get, delete, move, update flags) are repeated across ews_, graph_, imap_, and smtp_ tools, and the IMAP delete/move/flag tools have overlapping single, bulk, and search-and-act variants. The protocol prefixes and provider notes help, but an agent still has to determine which of several similarly named tools applies to a given task and account.
Most tools cleanly follow a protocol_verb_noun pattern (ews_get_message, imap_create_mailbox, smtp_forward_message). A few outliers like list_all_accounts, imap_list_accounts, imap_mailbox_status, and get_setup_guide break the pattern, but they are easy to understand and not chaotic.
At 31 tools, the surface is heavier than necessary, largely because the same operations are reimplemented per protocol and augmented with bulk/search-and-act variants that could be consolidated. The multi-protocol scope justifies some breadth, but the number will tax an agent's tool-selection decisions.
The set covers the full email lifecycle: send/reply/forward, search/read, move/copy/delete, flag updates, attachment retrieval, mailbox CRUD, account verification, and setup guidance. No major dead-end operation appears to be missing for a mail-focused MCP server.
Maintenance
Related MCP Connectors
Programmable email inbox for AI agents — JMAP, PoW auth, stdio MCP server.
- mailOAuthcom.anymailmcp
Read, send, organize, watch email on any IMAP mailbox: Gmail, iCloud, OVH, Zoho, Fastmail + CalDAV.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Read, send, file and search email in any Gmail, Microsoft 365 or IMAP mailbox, plus its calendar.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMulti-account IMAP/SMTP email MCP server with 22 tools — read, send, search, organize, thread, attachments, and batch operations. Features connection pooling, rate limiting, retry with backoff, and OAuth2 device-code flow. Written in Go.2MIT
- FlicenseAqualityDmaintenanceA lightweight MCP server for personal Microsoft Outlook/Hotmail accounts, enabling email search, reading, attachment management, and folder operations via Microsoft Graph API with OAuth device-code flow.61-
- AlicenseNot gradedqualityCmaintenanceCross-platform MCP server and CLI for email operations, including send, read, search, and contact management, compatible with Gmail, Outlook, Yahoo, and any IMAP/SMTP providers.8 npm1MIT
- AlicenseAqualityDmaintenanceLocal MCP server for multi-account IMAP/SMTP email (iCloud + Gmail via app-specific passwords). Never marks mail read. Cross-folder search, idempotent sends, TLS verified.8MIT