Gmail MCP has clear verb-based naming (gmail_list_messages, gmail_send_message) and reasonable parameter schemas with type definitions. However, descriptions are generic and lack LLM-optimization guidance. Parameter descriptions exist but are minimal (10-30 chars). Output schemas are not formally documented, responses are inferred from code. Error handling returns structured objects but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Missing idempotency guidance for write operations. Baseline: avg tool description ~194 chars; these average ~60 chars. Avg params per tool: 4 (matches baseline). No pagination support despite list operations.
Get details of a specific Gmail message.
List Gmail messages with optional search query.
Mark Gmail messages as read.
Search Gmail messages with specific criteria.
Send a Gmail message.
Descriptions lack LLM-optimization guidance. 'List Gmail messages with optional search query' (60 chars) is functional but does not explain WHEN to use this vs gmail_search_messages, what the output structure is, or dependencies. Baseline: A+ tools average 194 chars with explicit WHAT/WHEN/RETURN guidance.
No output schema documentation. Code returns structured dicts (success, count, messages, error) but LLMs cannot see this in the tool definition. Agents must infer output shape from trial-and-error. Baseline: 100% of A+ tools document return types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). gmail_send_message and gmail_mark_as_read modify state but lack destructiveHint. Agents cannot distinguish safe-to-retry from irreversible operations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | 2026-07-28+ | v2 |
Error handling returns structured errors but lacks recovery guidance. 'Failed to list messages: <exception>' tells the agent nothing actionable. Should suggest 'Try gmail_search_messages with specific filters' or 'Check NANGO_CONNECTION_ID environment variable'.
No pagination support. gmail_list_messages and gmail_search_messages accept max_results but return no cursor/offset for continuation. Large result sets will be truncated silently, and agents cannot fetch next page.