MCP server for Gmail — read, send, reply, drafts, archive, label, unsubscribe
Gmail MCP server has solid tool coverage (14 tools) with consistent naming (verb_noun pattern) and complete input schemas. Descriptions are present but often generic (avg ~80 chars, below 194-char baseline). Parameter descriptions lack detail on constraints, formats, and dependencies. Output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages. Missing tool annotations (readOnlyHint, destructiveHint). Composition is good: tools are single-responsibility and chainable. Security: credentials handled server-side via OAuth2, but no audit logging visible.
Add one or more labels to an email message
Move multiple emails to trash by query or explicit message IDs with safety limits
Create a draft email message (not sent)
Create a Gmail filter with criteria and actions (requires gmail.settings.basic scope)
Find unsubscribe links in an email message (List-Unsubscribe header and body scanning)
Retrieve full details of a specific email message
List draft emails with optional search query
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields (e.g., what does search_emails return? Does it include sender, subject, snippet, message_id?). Forces agents to guess or make extra calls.
Parameter descriptions lack constraint details. 'max_results' says 'default: 20, max: 100' but no min. 'query' accepts Gmail syntax but no examples or link to Gmail query docs. 'label_names' is an array but no size limits. LLMs cannot validate inputs without explicit constraints.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions. batch_trash, send_email, send_draft, create_filter should be marked destructiveHint=true.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
List all available labels in the Gmail account
Remove one or more labels from an email message
Reply to an email message with optional reply-all
Search emails using Gmail query syntax
Send a previously created draft email
Send a new email message
Move a single email message to trash
Error handling is silent. No recovery guidance in tool descriptions. If batch_trash fails on 1 of 50 messages, what does the agent do? If send_email fails due to invalid recipient, does the agent retry or ask the user? No error classification (retryable vs user-fixable vs fatal).
Destructive operations lack confirmation/dry-run. batch_trash has dry_run=true (good), but send_email, send_draft, create_filter do not. Agents can accidentally send emails or create filters without a safety gate.