MCP server for Gmail — read, write, archive, label, unsubscribe
The server provides clear, well-named tools with proper parameter schemas and descriptions. All 7 tools are explicitly registered with Zod schemas and non-empty descriptions. However, output schemas are NOT documented, responses are returned as JSON strings without declaring their structure. Error messages lack recovery guidance (critical gap). Parameter descriptions are generally good but could better explain dependencies and constraints. The 'batch_process' tool hints at batch functionality but lacks structured output documentation. No input validation guidance or error classification present.
Apply a label to an email. Creates the label if it does not already exist.
Archive an email by removing it from the inbox. The email remains accessible via search or All Mail.
Fetch a batch of emails matching a query for triage. Returns structured data so you can decide which actions to take on each email. Use account='all' to scan all accounts.
Get the full content of a specific email including body, headers, and any unsubscribe links found.
List all connected Gmail accounts. Use the email addresses returned here as the 'account' parameter in other tools.
Search and list emails. Supports Gmail search syntax (is:unread, from:, newer_than:7d, etc). Use account='all' to search across all connected accounts.
Output schemas not documented. All tools return JSON strings without declaring field structure, forcing LLMs to parse unstructured text. Agents cannot plan downstream calls or validate response fields.
Error handling lacks recovery guidance. Errors like 'Account not connected' or 'Failed to get access token' do not tell the LLM what action to take next (e.g., 'Try /setup page'). Some errors are descriptive but most are raw exception messages.
batch_process description is vague about output structure. States 'Returns structured data so you can decide which actions to take' but does not document the structure of that data (field names, types, per-item success/failure info).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Attempt to unsubscribe from a mailing list. Tries List-Unsubscribe header (HTTP and mailto), then scans the email body for unsubscribe links.
Parameter dependencies and constraints not fully documented. For example, 'message_id' is required but it's unclear whether it must be a valid Gmail ID format or whether the tool gracefully handles invalid IDs. The 'query' parameter accepts Gmail search syntax but does not document invalid syntax behavior.
No idempotency guidance. Destructive operations (archive_email, apply_label) should document whether retry-safety is guaranteed. If apply_label with the same label_name twice is idempotent, this should be stated explicitly.
unsubscribe_email description lacks detail on fallback behavior. States 'Tries List-Unsubscribe header (HTTP and mailto), then scans body' but does not explain what the tool returns if unsubscribe fails, or what success looks like.