MCP server exposing Gmail and Google Calendar to Claude via OAuth — read, send, and organize email; manage calendar events; extract attachment text
Strong foundation with 23 well-named tools, comprehensive descriptions (avg 180 chars), and complete input schemas. All tools follow verb_noun naming convention. Descriptions are detailed and include usage context. However, output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions are thorough but lack explicit format constraints (e.g., ISO 8601 for dates, file path restrictions). Error handling guidance is minimal. Missing tool annotations (readOnlyHint, destructiveHint) despite clear risk classifications. No confirmation pattern for destructive operations (delete_label, delete_event).
Modifies labels for multiple emails at once in batches. More efficient than calling modify_email repeatedly. Processes emails in configurable batch sizes. Use the same label ID conventions as modify_email.
Checks if a proposed event time conflicts with existing calendar events. Returns whether conflicts exist and details of any conflicting events.
Creates a new event on a Google Calendar. Supports setting title, time, location, description, attendees, and reminders.
Creates a new custom Gmail label. Labels can be used to organize emails and are visible in the Gmail sidebar. After creation, use the returned label ID with modify_email or batch_modify_emails to apply it to messages.
Deletes a calendar event. The event is permanently removed from the calendar.
Output schemas not documented. LLMs cannot predict response structure for any tool. This forces agents to guess field names and types, increasing errors and wasting tokens on clarification.
Destructive operations (delete_label, delete_event) lack confirmation pattern. No dry-run or explicit confirmation step. Agents can accidentally delete resources without safeguard.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint metadata despite clear risk classifications (READ_ONLY, WRITE, DESTRUCTIVE). Clients cannot optimize execution or warn users.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Permanently deletes a Gmail label. Messages with this label will NOT be deleted — only the label itself is removed. System labels (INBOX, SENT, etc.) cannot be deleted. Use list_email_labels to find the label ID.
Downloads an email attachment to the local filesystem. Saves to ~/Downloads/gmail-attachments by default, or to a custom directory if savePath is provided. Returns the file path and size.
Creates a draft email without sending it. The draft will appear in Gmail's Drafts folder. Supports the same options as send_email (plain text, HTML, multipart, threading, attachments). Useful for composing emails that need review before sending.
Finds free time slots in a calendar within a specified time range. Returns a list of available time windows that are at least the specified duration long.
Retrieves the full details of a specific calendar event by ID. Returns all event metadata including attendees, reminders, and recurrence rules.
Retrieves a specific Gmail filter by ID. Returns the filter's criteria and actions.
Gets an existing label by name (case-insensitive match) or creates it if it doesn't exist. Returns the label with a 'created' boolean field indicating whether it was newly created.
Lists all available Google Calendars for the authenticated user. Returns calendar ID, name, description, and timezone.
Retrieves all available Gmail labels (both system and user-created). Returns label ID, name, type, and message/thread counts. Use this to discover label IDs needed for modify_email, batch_modify_emails, and filtering operations.
Lists events from a Google Calendar within a specified time range. Returns event ID, summary, start/end times, location, attendees, and description. Defaults to the primary calendar and next 7 days.
Lists all Gmail filters (rules that automatically organize, label, or process incoming emails). Returns filter ID, criteria, and actions.
Modifies an email's labels to organize, archive, mark as read/unread, star, or move between folders. Common label IDs: 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', 'SPAM', 'TRASH', 'SENT', 'DRAFT'. To archive: removeLabelIds=['INBOX']. To mark as read: removeLabelIds=['UNREAD']. To star: addLabelIds=['STARRED']. Custom label IDs can be obtained from list_email_labels.
Extracts text content from email attachments. Supports PDF (via pdf-parse), plain text, HTML, and CSV formats. Returns the extracted text content.
Retrieves the full content of a specific email by its message ID. Returns the complete email including headers (from, to, cc, subject, date, message-id), decoded body text, attachment metadata, and label IDs. Use search_emails first to find the message ID.
Searches for emails using Gmail search syntax. Returns a list of matching emails with metadata (from, to, subject, date, snippet, labels). Use Gmail query operators like 'from:', 'to:', 'subject:', 'has:attachment', 'after:', 'before:', 'is:unread', 'label:', 'in:inbox', etc. Example queries: 'from:[email protected] subject:invoice after:2024/01/01', 'is:unread has:attachment'.
Sends a new email or replies to an existing thread. Supports plain text, HTML, and multipart/alternative content. To reply to a thread, provide both 'inReplyTo' (the Message-ID header value) and 'threadId'. Supports file attachments via local file paths.
Updates an existing calendar event. Can modify title, time, location, description, attendees, and reminders.
Updates an existing Gmail label's name or visibility settings. Use list_email_labels to find the label ID first.
Date/time parameters lack explicit format constraints. 'timeMin', 'timeMax', 'start', 'end' accept ISO 8601 but descriptions do not state this. LLMs frequently miscalculate timestamp conversions.
File path parameter (savePath, attachments) lacks validation constraints. 'savePath' description mentions ~/Downloads/gmail-attachments but no regex or length limit. Path traversal risk not addressed.