MCP server for Gmail — read, search, send, label, filter, attachments
gmail-mcp has well-structured tool definitions with consistent naming (verb_noun pattern), clear descriptions (avg ~120 chars), and complete input schemas. All 17 tools are explicitly registered with type-safe schemas. However, output schemas are not documented, error handling lacks recovery guidance, and several tools lack parameter constraints (enums, ranges). No tool annotations (readOnlyHint/destructiveHint) despite clear risk stratification. Parameter descriptions are adequate but could specify formats/constraints more explicitly. Missing idempotency guidance for write operations.
Move emails to trash by IDs. Emails in trash are auto-deleted after 30 days.
Create a draft email without sending it. Optionally a reply draft if replyToMessageId is provided. Supports file attachments.
Create a Gmail filter to automatically label, archive, or mark-read incoming emails. Criteria: from, to, subject, query (Gmail search syntax). Actions: addLabels, removeLabels, archive, markRead.
Create a new Gmail label. Supports nested labels with "/" separator (e.g., "Projects/Infrastructure").
Delete a Gmail label by name. Cannot delete system labels. Emails in the label are NOT deleted.
Forward an email to another recipient. Original message is quoted. Original attachments are included by default.
Output schemas not documented. LLMs cannot plan downstream calls or extract required fields (e.g., what fields does gmail_search return? Is there pagination?). Violates pattern:tool requirement.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk stratification (READ_ONLY, WRITE, DESTRUCTIVE). Agents cannot distinguish safe from dangerous operations. Violates pattern:tool-annotation.
gmail_create_filter has no required parameters despite needing at least one criterion (from/to/subject/query). LLMs may call with empty criteria. Add 'oneOf' constraint or document mutual requirement.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Download an attachment from a message. Specify by attachmentId or filename. If savePath is provided, saves to disk; otherwise returns base64 data.
Get a single email by ID, including full body text.
Get all messages in a thread by thread ID.
List all attachments in a message with their IDs, filenames, types and sizes.
List all Gmail filters in the account.
List all labels in the Gmail account.
Mark emails as read or unread.
Add or remove labels on one or more emails. Use label names (not IDs). To archive, use removeLabels: ["INBOX"].
Reply to an email by message ID. Set replyAll to true to reply to all recipients. Supports file attachments.
Search emails using Gmail query syntax (e.g., 'is:unread', 'from:[email protected]', 'after:2026/01/01 label:work').
Send a new email. Supports optional CC, BCC, and file attachments from local paths.
Pagination not documented for list tools (gmail_search, gmail_list_labels, gmail_list_filters). No mention of limit defaults, max values, or cursor/offset support. Large result sets risk context window exhaustion.
Error handling not documented. No guidance on recovery (e.g., 'User not found, try search_users first'). Agents cannot self-correct on failures. Violates pattern:recovery-guide.