MCP server for Todoist task management integration
Server has 6 tools with complete schemas and descriptions, but quality is inconsistent. Tool names follow verb_noun convention (get_projects, create_task, delete_task). Descriptions are present but generic, most lack context on WHEN to use the tool or what happens on failure. Parameters are typed and mostly described, but descriptions often lack constraints (e.g., priority enum values stated in description but not enforced in schema for create_task/update_task). Output schemas are not documented, LLMs cannot predict response structure. Error handling is minimal: most tools raise generic exceptions without recovery guidance. get_tasks has good filtering parameters but returns unstructured list[str] instead of typed objects. No tool annotations (readOnlyHint, destructiveHint) despite clear risk levels. Composition is reasonable, tools are single-purpose, but missing idempotency guarantees and confirmation patterns for destructive ops.
Mark a task as done
Create a new task
Delete a task by its ID
Get all todo projects. These are like folders for tasks in Todoist
Fetch user's tasks. These can be filtered by project, labels, time, etc. If no filters are provided, all tasks are returned.
Update an attribute of a task given its ID. Any attribute can be updated.
Output schemas not documented. get_tasks returns list[str] but code shows dict objects with id/title/priority/due fields. LLMs cannot predict response structure or chain to downstream tools.
Destructive tools (delete_task, complete_task) lack confirmation or dry-run patterns. No tool annotations (destructiveHint) to signal irreversibility to LLMs. Agents may accidentally delete tasks.
Error handling is minimal. Tools raise generic exceptions ('Couldn't delete task', 'Couldn't create task') without recovery guidance. LLMs cannot determine if error is retryable, user-fixable, or fatal.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Parameter constraints not enforced in schema. create_task and update_task describe priority as 1-4 in docstring but schema has no enum constraint. LLMs may pass invalid values.
Descriptions lack context on WHEN to use tools and dependencies. E.g., get_tasks says 'Filter tasks by project' but doesn't explain that project_name requires a prior get_projects call if user only has a name.