Provider-neutral email MCP server over Streamable HTTP
The server demonstrates solid fundamentals with clear tool naming (verb_noun pattern), well-structured input schemas using Zod, and explicit JSON Schema definitions. All 5 tools are properly registered with descriptions and input validation. However, output schemas are undocumented, LLMs cannot see what fields to expect from responses. Parameter descriptions are present but inconsistent in depth. Security is well-handled with account-based isolation and no exposed secrets. Error handling exists but lacks actionable guidance for LLM recovery.
Permanently delete a message returned by read_emails or search_emails.
Read messages through Gmail API or any standard IMAP mailbox.
Reply to a message through SMTP or Gmail API, with optional reply-all.
Search email. IMAP supports text plus from:, to:, cc:, subject:, since:, before:, and is: filters.
Send an email through the selected account using SMTP or Gmail API.
Output schemas are completely undocumented. No tool describes what fields it returns, forcing LLMs to call tools blind. This violates pattern:tool and pattern:response-shaper.
delete_email description lacks explicit mention that this is destructive and irreversible. Per pattern:command-tool, tools that modify state must clearly state what happens.
Error responses use generic toolError() helper that returns only error message text. No error classification (retryable vs user-fixable vs fatal), no actionable recovery guidance. Per pattern:recovery-guide, errors must tell LLMs what to do next.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 70 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 39 | - | v1 |
read_emails and search_emails return list results but lack pagination details. No documentation of total_count, next_cursor, or how large result sets are handled. Per pattern:paginated-result, list tools must support pagination.
attachments parameter in send_email lacks minimum array length and maxItems constraint documentation. Items can be specified by path OR content, but this conditional dependency is not documented per pattern:constrained-input.