A Model Context Protocol server for Google Workspace (Gmail and Calendar)
This server registers 8 tools with explicit schemas and descriptions visible in src/index.ts. All tools follow verb_noun naming convention (list_emails, search_emails, send_email, modify_email, list_events, create_event, update_event, delete_event). Descriptions are present and substantive (most 30-80 chars, adequate for tool selection). Input schemas are fully specified with type definitions and parameter descriptions. However, there are critical gaps: (1) Output schemas are NOT documented anywhere, the code does not declare what each tool returns, forcing LLMs to guess at response structure; (2) Error handling is minimal, no recovery guidance, no error classification, no actionable error messages; (3) No support for idempotency hints or destructive operation safeguards (e.g., delete_event has no confirmation step despite being destructive); (4) Parameters could be more constrained (e.g., email tools accept free-form 'query' strings with no validation hints beyond examples); (5) OAuth credentials are injected via environment variables (good pattern), but there is no audit logging, permission checks, or scope declarations. The server is functional but lacks production-grade error handling and output documentation.
Create a new calendar event
Delete a calendar event
List recent emails from Gmail inbox
List upcoming calendar events
Modify email labels (archive, trash, mark read/unread)
Search emails with advanced query
Send a new email
Output schemas are not documented. Tools return API responses from Google APIs (gmail.list, calendar.events.list, etc.) but the MCP server does not declare what fields or structure LLMs should expect. Forces LLMs to infer response types and wastes tokens extracting irrelevant fields.
delete_event is destructive but has no confirmation step, dry-run option, or warning. Agents can permanently delete calendar events without user confirmation, risking data loss.
Error handling is minimal. Code does not validate inputs, does not provide recovery guidance, and does not categorize errors as retryable vs fatal. On failure, LLMs receive raw API errors with no context for next steps.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 22 | - | v1 |
Update an existing calendar event
No input validation. 'query' parameters in list_emails and search_emails accept free-form strings with only narrative examples ('from:alice@example.com'). LLMs may pass invalid Gmail query syntax without validation feedback.
No permission checks or scope declarations. Tools do not verify the agent has authorization to send emails, modify events, or delete calendar items. No audit logging of who called what tool.
Descriptions for destructive/write tools lack clarity on side effects. 'Modify email labels' does not explain that archive/trash are irreversible actions. 'Delete a calendar event' does not warn that deletion is permanent.
No pagination support. list_emails and list_events accept maxResults but do not return pagination tokens or total counts. If results exceed maxResults, LLM cannot fetch the next page.
'modify_email' is vague. Does it only modify labels? Can it mark as read/unread? Update other metadata? Description mentions archive, trash, read/unread but schema only shows addLabels/removeLabels. Ambiguity could cause LLM misuse.
No idempotency support. Repeated calls to send_email or create_event will send duplicate emails or create duplicate events. No idempotency key or deduplication mechanism.
Email recipient parameters accept comma-separated strings but do not validate email format. 'to' parameter could receive invalid email addresses without early feedback.