Gmail MCP server - list, search, read, and label email from Claude or any MCP client
Gmail MCP has clear, well-structured tool definitions with complete schemas and descriptions. All 7 tools are explicitly registered with proper JSON Schema. Naming follows verb_noun convention (list_, search_, read_, create_, modify_, get_). Descriptions are concise (50 - 150 chars) and explain WHAT each tool does. However, several parameter descriptions lack actionable constraints (e.g., max_results has no min/max bounds, query lacks format guidance). Output schemas are not documented, LLMs cannot predict response structure. Error handling is generic (catch-all exception → JSON error). No tool annotations (readOnlyHint, destructiveHint) despite clear read/write distinction. Missing idempotency guidance for write operations.
Create a new Gmail label.
Download and return attachment content. Get attachment_id from read_email response.
List recent emails with metadata (subject, from, date, snippet). Optionally filter by label or search query.
List all Gmail labels (system labels like INBOX, UNREAD plus user-created labels).
Add or remove labels on an email. Use label IDs like 'UNREAD', 'INBOX', 'TRASH', 'SPAM', or custom label IDs. Use 'READ' as a convenience alias to mark as read.
Get the full content of an email including headers and body text. Also lists any attachments.
Output schemas not documented. LLMs cannot predict response structure (fields, types, pagination). Forces agents to guess what data is returned.
Parameter constraints missing. max_results lacks min/max bounds (1 - 100 stated in description but not in schema). query parameter has no format guidance or examples of valid Gmail syntax.
No tool annotations. modify_email and create_label are write operations but lack destructiveHint. read_email and list_emails lack readOnlyHint. Agents cannot distinguish safe from risky calls.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Search emails using Gmail query syntax. Examples: 'from:github', 'subject:invoice is:unread', 'after:2024/1/1'.
Generic error handling. All exceptions caught and returned as JSON error strings. No recovery guidance (e.g., 'message_id not found, try search_emails first'). No error classification (retryable vs fatal).
modify_email naming ambiguous. 'modify' is vague, does it change labels, mark read, archive, or all? Better: split into add_labels, remove_labels, mark_as_read as separate tools or clarify in description what 'modify' means.