A Gmail MCP server for Claude with attachment support and a server-enforced permission model.
Gmail-mcp demonstrates solid naming conventions (verb_noun pattern: list_roots, save_attachment, execute_pending) and comprehensive tool descriptions (avg 120 chars, all present). However, input schemas are partially visible, some tools show Zod schemas (SaveInput, StageInput) but others lack explicit parameter documentation in the provided code. Tool annotations are present (readOnlyHint, destructiveHint). Error handling is mentioned but recovery guidance is sparse. Output schemas are not documented in the visible code. The server handles sensitive operations (Gmail access, attachment staging) with approval workflows, but parameter validation details are incomplete.
Withdraw a pending or approved action before it executes. Use it to abandon anything a gated tool queued that you no longer want; it also works after the owner approved but before execute_pending.
Connect or reconnect a Google account under an alias. Completes in the owner's browser; opens the page when the client can, else returns its URL.
Run an action the owner approved in the browser, named by the action_id a gated tool returned. Claimable once; a replay is refused. If it answers pending_not_approved, the owner has not approved it yet.
Effective allow/ask/deny policy for an account after overrides. Call it to know which tools will return pending_approval before you try them; modifiers such as an attachment, an untrusted recipient or a system label raise a level further and are not shown here.
List connected Gmail accounts: alias, email, status, default flag. Never returns tokens.
Input schemas for save_attachment and stage_file are referenced (SaveInput, StageInput) but not fully visible in provided code. Cannot verify parameter types, descriptions, or constraints.
Output schemas are not documented. Tools return JSON responses but LLMs cannot predict field structure, types, or required fields for downstream tool chaining.
Error recovery guidance is minimal. Descriptions mention 'pending_approval' state but do not explain what the LLM should do if approval is denied or times out.
Parameter descriptions for get_policy's 'account' parameter are minimal ('optional account alias'). Does not explain what happens if the alias is invalid or what the default behavior is.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
List actions waiting on the owner, and approved ones not yet run. Use it to recover an action_id after a lost result, then execute_pending.
List owner-configured logical attachment roots and permissions.
Policy is edited in the browser only. Returns the policy page URL.
Verify and save an attachment handle under a writable logical root. Existing destinations are never overwritten.
Stage an immutable snapshot from a readable logical root. Retry the same request after browser approval. Supply a new idempotency_key to deliberately capture a new snapshot.
No pagination support visible in list_* tools. list_accounts and list_pending may return unbounded results, risking context window exhaustion.