A local MCP server for GTD workflows — Todoist and Gmail integration for Claude
This GTD MCP server demonstrates solid definition quality with consistent naming patterns, comprehensive parameter descriptions, and structured output schemas. All 20 tools follow verb_noun naming conventions (search_gmail, read_gmail_message, archive_gmail_messages, etc.). Descriptions are present and moderately detailed (ranging 120-350 chars, within baseline). Parameter annotations use Pydantic Field() with descriptions and constraints (min/max for max_results, enums implicit in label operations). However, several gaps prevent a higher score: (1) Output schemas are documented in docstrings but not in formal JSON Schema format visible to clients; (2) Error handling is minimal, no recovery guidance or actionable error messages in tool definitions; (3) Some tools accept string parameters that could be enums (e.g., label_name in apply_gmail_label, label_name in remove_gmail_label); (4) Descriptions for some parameters lack examples of expected format (e.g., what does a valid Gmail message_id look like?). The toolset is well-composed, no tools combine multiple responsibilities, and chaining is supported (search results provide IDs that downstream tools accept). Security is handled server-side (credentials via env vars, not exposed as params). Overall: B/B+ grade work, good foundations, but missing polish in error messaging and schema formalization.
Apply a label to Gmail messages.
Archive Gmail messages by removing the INBOX label. Messages remain accessible via search and labels, just removed from inbox.
Search for Gmail messages and archive all results in one operation. This is the most powerful cleanup tool — clears matching mail from inbox in a single call. Use specific queries to target exactly what you want.
Mark a Todoist task as complete. The task will be moved to completed status. For recurring tasks, this advances to the next occurrence.
Create a new Gmail label.
Create a new task in Todoist. Creates a task with the given content in the specified project. Optionally attach labels, a due date, and a description.
Output schemas documented in docstrings but not formally exposed in JSON Schema format. Clients must parse return type comments rather than receiving structured schema metadata.
String parameters that accept a fixed set of values (label_name in apply_gmail_label/remove_gmail_label, project names) should use enum constraints rather than relying on description text. This prevents LLM hallucination of invalid values.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 59 | - | v1 |
Get completed tasks from Todoist within a date range. Returns tasks completed between `since` and `until` (inclusive). Ideal for weekly review metrics — see how many tasks were completed and when.
Get all tasks from a Todoist project. Returns tasks with: id, content, description, labels, due, priority, project_id.
List all Gmail labels. Returns both system labels (INBOX, SENT, TRASH, etc.) and user-created labels. Use label names with apply_gmail_label() and remove_gmail_label().
List all personal Todoist labels. Returns every label with its ID, name, and color. Labels are referenced by name in task operations.
List all Todoist projects. Returns every project in the user's account with its ID and name. Use this to discover valid project names for other tools.
Mark Gmail messages as read.
Mark Gmail messages as unread.
Move a task to a different Todoist project.
Read a full Gmail message including the body text.
Read all messages in a Gmail thread.
Remove a label from Gmail messages.
Search Gmail messages matching a query. Uses standard Gmail search syntax. Returns message summaries (id, thread_id, subject, from, date, snippet). Use read_gmail_message() for the full body.
Star Gmail messages. Adds the STARRED label to messages, making them
Update fields on an existing Todoist task. Only specified fields are changed; others remain untouched. Note: setting labels replaces all existing labels on the task.
Error handling guidance is absent from tool definitions. Descriptions do not explain what errors may occur, which are retryable, or how LLMs should recover (e.g., 'If label not found, call list_gmail_labels() to discover available labels').
Several tools (mark_gmail_read, mark_gmail_unread, star_gmail_message) have minimal descriptions (under 70 chars) that lack context about when to use them vs. related tools or what constitutes success.
Destructive operations (bulk_archive_gmail, complete_task, remove_gmail_label) lack confirmation/dry-run mechanisms. Agents cannot preview consequences before executing irreversible actions.
Parameter descriptions sometimes lack format guidance. For example, message_id, thread_id, and task_id descriptions do not explain the expected format or length, forcing LLMs to guess.