GmailMCP is a Model Context Protocol server: one shared service registry exposed identically over CLI, MCP, and HTTP.
Critical gaps across all dimensions. Tool definitions are auto-generated (scripts/gen_tool_docs.py) with minimal descriptions (10-50 chars, well below 50-200 char baseline). All 34 tools lack parameter descriptions beyond 'User identifier (injected by server)' boilerplate. No output schemas documented. No error handling guidance. Naming is inconsistent: gmail_* vs inbox_* vs pdf_* vs webhook_* prefixes create cognitive load. Many tools combine multiple concerns (e.g., gmail_compose + gmail_send should be separate). No enums for constrained inputs (e.g., pdf_export format, webhook events). Security concern: user_id injected but no evidence of permission gates or audit logging. Composition is poor, tools like gmail_reply_to_thread require thread_id but no tool returns thread_id in a structured format for chaining.
Add an attachment to a draft
Archive an email thread
Create a new email draft
Establish OAuth connection to Gmail account
Apply curation rules to inbox for intelligent filtering
Delete an email draft
Disconnect from Gmail account
All 34 tools have minimal descriptions (10-50 chars, baseline 50-200). Descriptions like 'Establish OAuth connection to Gmail account' lack WHEN to use, prerequisites, or return value guidance. LLMs cannot reliably select tools without richer context.
Inferred effective spec: 2025-06-18+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 52 | 2025-06-18+ | v2 |
Download an email attachment
Retrieve a draft email
Retrieve a complete email thread
List all email drafts
List messages in the inbox
Mark an email thread as done/completed
Mark an email thread as read
Remove an attachment from a draft
Reply to an email thread
Send an email draft
Check current Gmail connection status
Unmark an email thread as done
Update an existing email draft
Start watching Gmail account for changes
Stop watching Gmail account for changes
Retrieve saved triage judgments for inbox curation
Save triage judgment to the curation ledger
Search through inbox curation ledger
Edit form fields in a PDF document
Export a PDF document
Open and parse a PDF document
Request signature on a PDF document
List active webhook subscriptions
Rotate webhook secret key
Get webhook configuration settings
Subscribe to webhook events
Unsubscribe from webhook events
No parameter descriptions beyond 'User identifier (injected by server)'. Parameters like 'limit' (gmail_list_inbox), 'format' (pdf_export), 'events' (webhook_subscribe), and 'judgment' (inbox_save_curation) lack type constraints, ranges, enums, or usage guidance. LLMs cannot validate inputs.
No output schemas documented. Tools like gmail_list_inbox, gmail_get_thread, and inbox_get_curation return unspecified structures. LLMs cannot plan downstream tool calls (e.g., gmail_reply_to_thread needs thread_id from gmail_get_thread, but return format is unknown).
Irreversible operations (gmail_send, gmail_discard_draft) lack confirmation or dry-run support. No error handling guidance. LLMs cannot recover from accidental sends or deletes.
Tool composition broken. gmail_compose creates a draft, gmail_send sends it, but no tool returns draft_id in a structured format. gmail_reply_to_thread requires thread_id, but gmail_list_inbox return format is undocumented. Forces wasteful discovery calls.