MCP server for reading unread Gmail emails and creating threaded Gmail draft replies
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation and output schema clarity. get_unread_emails has a simple, well-named interface but lacks output schema documentation. create_draft_reply has a clear name and docstring but the mutual exclusivity constraint (original_message_id OR thread_id) is documented in the description rather than enforced via schema or validation. Neither tool documents return types or field structures. Parameter descriptions are minimal (e.g., 'Plain-text reply content' for reply_body lacks format/length constraints). No error handling guidance, no pagination support for potentially large result sets, and no tool annotations (readOnlyHint/destructiveHint). Naming follows verb_noun convention well; descriptions exist but are brief (under 100 chars each). Schemas present but incomplete, no documented output structure, no validation rules, no recovery guidance.
Create a correctly threaded Gmail draft reply. Provide either: - original_message_id, or - thread_id
Return unread Gmail emails.
Output schemas not documented. Neither tool specifies what fields are returned or their types. LLMs cannot plan downstream operations or extract required data.
Mutual exclusivity constraint (original_message_id OR thread_id) documented only in description text, not enforced in schema. LLMs may pass both or neither, causing silent failures.
No error handling guidance. Errors return raw dicts with no recovery hints. If Gmail API fails or credentials are invalid, LLM has no actionable next step.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Agents cannot distinguish safe reads from destructive writes without parsing descriptions.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | <=2025-11-25 | v2 |
get_unread_emails lacks pagination support. If user has >10 unread emails, results are truncated with no way to fetch more. Large result sets should support limit/offset and return total count.