MCP server for email management with IMAP/SMTP support, caching, and full-text search capabilities
mcp-email has 8 tools with complete input schemas and descriptions present in internal/tools/registry.go. Naming follows verb_noun convention consistently (list_*, fetch_*, send_*, search_*, get_*, save_*, sync_*). Descriptions are adequate (ranging 40-150 chars) but lack depth about when to use each tool or LLM-optimized guidance. Parameters have types and descriptions, meeting basic requirements. However, parameter descriptions are brief and lack format/range guidance. Output schemas are not documented, LLMs cannot understand what fields to expect from tool responses. Error handling is not visible in the code provided. No tool annotations (readOnlyHint/destructiveHint) despite clear semantic differences between read and write operations. No output schema documentation. Search tool has good parameter coverage but descriptions could guide LLM selection better. Most tools default account to 'optional, uses default' which is reasonable, but sync_emails lacks clarity on what 'all folders' means.
Fetch emails from a specific folder
Get full details of a specific cached email
List all configured email accounts
List all folders in an email account
Save an email as a draft
Search for emails in the cache using various criteria
Send an email via SMTP
Synchronize emails from IMAP server to local cache
Output schemas are completely undocumented. LLMs cannot determine what fields to expect from tool responses (e.g., what does list_accounts return? Is it {accounts: [{name, email}]} or {account_list: [...]}?). This forces trial-and-error and risks incorrect field mapping on downstream calls.
Tool annotations (readOnlyHint/destructiveHint/idempotentHint) are completely absent. The spec declares these tools with READ_ONLY vs WRITE risk labels in metadata, but the MCP tool definitions do not declare them. LLMs cannot determine which tools are safe to retry, which require confirmation, or which have side effects.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 55 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 23 | 2024-11-05+ | v1 |
Parameter descriptions lack format guidance and validation constraints. E.g., search_emails accepts date_from/date_to as ISO 8601 strings but does not state format in the description. 'from' and 'to' sequence numbers in fetch_emails are unexplained, what is the valid range? What does sequence number mean (IMAP UID, position, ID)?
No error handling or recovery guidance visible in code. Tools likely fail (e.g., 'account not found', 'folder does not exist', 'SMTP error'), but no guidance on what to do next. Should the LLM retry? Call list_accounts to discover valid names? Try a different folder?
Tool descriptions lack context about WHEN to use each tool. E.g., when should an LLM call search_emails vs fetch_emails? What is the difference between get_email and fetch_emails? Is get_email for cached emails only? Does fetch_emails cache them? LLMs must infer from the name alone.
send_email and save_draft accept 'attachments' as local file paths or URLs, but no validation or format guidance. How large can files be? What formats are supported? What does 'URL' mean, any HTTP URL, or only certain origins?
search_emails has a 'limit' parameter (default 100, max 1000) documented in the description, but JSON schema does not enforce max constraint. LLMs may pass invalid values expecting server-side validation.