FastMCP-based server for Gmail operations including sending emails, reading, searching, and managing labels
The Gmail MCP server provides 5 well-structured tools with proper naming (verb_noun pattern), documented input schemas with types and descriptions, and structured output specifications. All tools have clear descriptions and appropriate parameter documentation. However, several issues limit the score: (1) error handling lacks actionable guidance for the LLM, functions do not validate inputs early or provide recovery suggestions; (2) no output schema documentation in docstrings, return types are inferred from code rather than explicitly declared; (3) missing sensitive data handling guidance, no documentation of what happens if Gmail API calls fail or how to handle rate limits; (4) parameters lack format constraints and validation rules in descriptions; (5) no idempotency hints for retry-safe operations like send_email. The naming is strong (send_email, read_emails, get_email, search_emails, list_labels all follow verb_noun convention) and parameters are well-typed. Descriptions are adequate (40-100+ chars) but could be more LLM-optimized with dependency hints and error recovery guidance.
Get full email content by message ID.
List all Gmail labels.
Read recent emails from a Gmail label.
Search emails using Gmail query syntax.
Send an email via Gmail.
Output schemas are inferred from code, not explicitly documented in tool docstrings. LLMs must reverse-engineer return types from implementation rather than reading specifications.
No input validation guidance in parameter descriptions. Parameters lack format rules, ranges, or constraints. E.g., max_results has no min/max bounds; email strings lack validation rules; query parameter lacks syntax examples.
Error handling provides no actionable recovery guidance. Functions do not validate inputs before calling Gmail API, if an invalid email address, missing message ID, or malformed query is passed, the LLM receives a raw API error (likely a stack trace) with no suggestion for next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 61 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 52 | - | v1 |
Tool descriptions lack dependency hints. LLMs may not know that get_email requires a message_id from read_emails or search_emails, or that search_emails is more flexible than read_emails for label-free queries.
Pagination not implemented. read_emails and search_emails default to max_results=10, but no guidance on handling >10 results, no next_cursor or offset mechanism, and no total_count in response to indicate if more results exist.
No explicit documentation of irreversible side effects. send_email modifies state (sends a message) but the docstring does not warn the LLM that this is non-idempotent and has permanent consequences. No dry-run or confirmation option.
Parameter descriptions under 20 characters in several cases (e.g., 'The Gmail message ID.' for get_email's message_id), providing minimal LLM guidance on valid values or format.