Todoist MCP Server
Provides tools for managing Todoist tasks, projects, labels, and comments via the REST and Sync APIs, enabling task creation, updates, deletion, completion, moving, batch operations, and querying completed tasks.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Todoist MCP Servercreate a task to buy groceries with high priority"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Todoist MCP Server
A local MCP server for Todoist task management, designed for use with Claude.
Wraps both the Todoist REST v2 and Sync API v1 to provide comprehensive task management capabilities through the Model Context Protocol.
Features
Task CRUD — create, read, update, complete, delete, and move tasks
Batch operations — update multiple tasks in a single API call via the Sync API
Project management — list projects, resolve by name (case-insensitive)
Labels — create, rename, delete, and apply labels to tasks
Comments — read and add comments on tasks (Markdown supported)
Completed tasks — query tasks completed within a date range (weekly review metrics)
Graceful degradation — server starts without Todoist tools if API token is missing
Related MCP server: Todoist MCP Server
Setup
1. Get your Todoist API token
Go to Todoist Developer Settings and copy your API token.
2. Install
git clone https://github.com/stevesimpson418/todoist-mcp-server.git
cd todoist-mcp-server
# Install dependencies (creates .venv/ in the project directory)
uv syncNew to uv?
uv syncreadspyproject.toml, creates a.venv/virtualenv inside the project folder, and installs all dependencies into it. You don't need to activate it —uv run <command>handles that automatically.
3. Configure environment
cp .env.example .env
# Edit .env and add your TODOIST_API_TOKEN4. Connect to Claude
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
Tip: Run
uv run which pythonfrom the project directory to get the exact path forcommand.
{
"mcpServers": {
"todoist": {
"command": "/absolute/path/to/todoist-mcp-server/.venv/bin/python",
"args": ["-m", "todoist_mcp_server.server"],
"env": {
"TODOIST_API_TOKEN": "your_token_here"
}
}
}
}Adding to Claude Code CLI
Use the claude mcp add command to register the server. This works from any directory.
claude mcp add --scope user todoist-mcp-server \
--transport stdio \
--env TODOIST_API_TOKEN=your_token_here \
-- /path/to/todoist-mcp-server/.venv/bin/python -m todoist_mcp_server.serverReplace /path/to/todoist-mcp-server with the actual path where you cloned the repo.
Tip: Run
uv run which pythonfrom the project directory to get the exact.venv/bin/pythonpath for the command.
The --scope user flag saves to ~/.claude.json so the server is available across all projects.
Without it, the command defaults to local scope (tied to whatever directory you run it from).
To scope it to a single project instead, use --scope project which writes to .mcp.json in
the project root.
To verify the server is registered:
claude mcp listRestart Claude Code after adding. The Todoist tools should appear in the /mcp menu.
Note: Claude Code CLI uses a different configuration from Claude Desktop. The
claude mcp addcommand is the recommended way to register MCP servers — do not add them to~/.claude/settings.jsonas that file is used for permissions and hooks only.
Updating
To pull the latest version and update dependencies:
cd /path/to/todoist-mcp-server
git pull
uv syncRestart Claude Desktop or Claude Code CLI after updating.
Available tools
Tool | Description |
| List all projects |
| Get tasks from a project |
| List all labels |
| Query completed tasks by date range |
| Get comments on a task |
| Create a new task |
| Update task fields |
| Move task to another project |
| Mark task as complete |
| Permanently delete a task |
| Batch update multiple tasks |
| Add a comment to a task |
| Create a new label |
| Rename a label |
| Delete a label |
Usage Examples
Weekly review — see what you accomplished:
1. get_completed_tasks(since="2026-03-28", until="2026-04-04") → completed this week
2. list_todoist_projects() → see all projects
3. get_project_tasks(project_name="Inbox") → triage leftover inbox tasksReorganise tasks across projects:
1. get_project_tasks(project_name="Inbox") → find tasks to sort
2. move_task(task_id="123456", project_name="Home Renovation") → move to the right project
3. batch_update_tasks(tasks=[
{"id": "234567", "labels": ["waiting-on"]},
{"id": "345678", "priority": 3}
]) → bulk tidy-upQuick capture with context:
1. create_task(
content="Review pull request #42",
project_name="Work",
due_string="tomorrow 10am",
priority=3
)
2. add_task_comment(task_id="456789", content="See https://github.com/org/repo/pull/42")Development
# Install dev dependencies
uv sync --dev
# Run tests
uv run pytest -v
# Run tests with coverage
uv run pytest --cov=todoist_mcp_server --cov-report=term-missing
# Lint
uv run ruff check src/ tests/
# Format
uv run ruff format src/ tests/
# Install git hooks
lefthook installLocal .env file
When running the server manually outside Claude Desktop/Code (e.g., for development or
debugging), you can create a .env file in the project root so the server picks up
the API token without passing environment variables:
TODOIST_API_TOKEN=your_token_hereThis is only needed for local development. The Claude Desktop and Claude Code CLI configs
pass this value directly via the env block.
Releases
This project uses release-please for automated versioning and releases. The version is determined by Conventional Commits:
fix:commits bump the patch version (e.g. 0.1.0 → 0.1.1)feat:commits bump the minor version (e.g. 0.1.1 → 0.2.0)BREAKING CHANGEin the commit footer bumps the major version
When commits land on main, release-please opens (or updates) a Release PR that:
Bumps the version in
pyproject.tomlUpdates
CHANGELOG.mdwith grouped entries
Merging the Release PR creates a git tag and GitHub Release automatically.
Packaging & Distribution
This server is currently distributed as source via git. To install:
git clone https://github.com/stevesimpson418/todoist-mcp-server.git
cd todoist-mcp-server
uv syncThis is the standard distribution model for local-stdio MCP servers today. The project is already configured for wheel builds via hatchling, so future distribution options include:
PyPI — publish to PyPI, then install with
uv tool install todoist-mcp-serverorpip install todoist-mcp-server. Would require adding a publish workflow to CI.uvx — once on PyPI,
uvx todoist-mcp-serverruns the server without cloning the repo. Claude Desktop/Code config would point to the uvx-managed binary instead of a local.venv.
License
MIT
Available Tools
15 toolsadd_task_commentA
Add a comment to a Todoist task.
Creates a new comment on the specified task. Supports Markdown formatting.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The comment text (supports Markdown) | |
| task_id | Yes | The Todoist task ID to comment on |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses that this tool creates a comment (mutation) and supports Markdown formatting. However, it lacks details about idempotency, rate limits, permission requirements, or whether comments are appended.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise with two clear sentences. It front-loads the core purpose and adds a key feature (Markdown support) without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 required params, output schema present), the description adequately covers purpose and key feature. However, it omits guidance on when to use and behavioral nuances, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes both parameters adequately. The description mentions Markdown support for content, which is also in the schema, adding no new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a comment') and the resource ('Todoist task'). It distinguishes from sibling tools like get_task_comments (reading) and create_task (creating tasks, not comments).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool vs alternatives, such as get_task_comments for viewing comments or other tools. The description does not mention prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
batch_update_tasksA
Batch update multiple Todoist tasks in a single API call.
Uses the Todoist Sync API for efficiency — processes all operations in one request. Each operation can update fields and/or move a task to a different project. This is ideal for triage workflows where you need to process many tasks at once.
| Name | Required | Description | Default |
|---|---|---|---|
| operations | Yes | List of operations. Each dict must include 'id' (task ID). Optional fields: 'content' (str), 'labels' (list of label names), 'due_date' (str, natural language or YYYY-MM-DD), 'description' (str), 'project' (project name to move to). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It mentions using the Todoist Sync API and processing all operations in one request, but does not disclose potential issues like partial failures, atomicity, or rate limits. The behavioral insight is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core action, then mechanism, then use case. Every sentence serves a distinct purpose with no redundancy or filler, achieving high efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (per context signals), the description does not need to explain return values, but it also omits discussion of error handling or operation results. For a batch tool, completeness is moderate—sufficient for basic use but lacking depth for robust agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond the schema by explaining the structure of each operation item, listing optional fields with formats (e.g., 'due_date' as natural language or YYYY-MM-DD). This meaningfully aids parameter understanding, earning above the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Batch update multiple Todoist tasks in a single API call', providing a specific verb-resource combination. It distinguishes from siblings like 'update_task' (single) and 'move_task' (just moving), and uses terms like 'triage workflows' to further differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description includes 'ideal for triage workflows where you need to process many tasks at once', giving clear context for when to use. However, it does not explicitly state when not to use or mention alternatives like 'update_task' for single updates, so it lacks exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
complete_taskA
Mark a Todoist task as complete.
The task will be moved to completed status. For recurring tasks, this advances to the next occurrence.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The Todoist task ID to complete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full responsibility. It discloses that the task moves to 'completed status' and for recurring tasks, it 'advances to the next occurrence.' This covers the primary behavioral traits, though it doesn't mention potential side effects like notifications or permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence captures the core action, and the second adds crucial recurring-task behavior. Perfectly front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, full schema coverage, and presence of an output schema (which the description doesn't need to detail), the description completely informs the agent of the tool's effect and special case (recurring tasks). No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already describes the task_id parameter. The description does not add meaning beyond what the schema provides (e.g., no format or source hints). Baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Mark a Todoist task as complete') and distinguishes from sibling tools like delete_task or update_task. The description specifies the state change and handles recurring tasks, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use (to mark a task complete) but does not explicitly state when not to use or provide alternatives. Given the clear context, it's adequate but lacks guidance on exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | Labels to apply, by name. Use list_todoist_labels() for available labels. | |
| content | Yes | The task title/content | |
| project | No | Project name to create the task in (case-insensitive). Defaults to 'Inbox'. Use list_todoist_projects() for valid names. | Inbox |
| due_date | No | Due date — natural language ('tomorrow', 'next Monday') or date string ('2026-03-15'). | |
| description | No | Optional longer description for the task. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses that the project defaults to 'Inbox', case-insensitive matching, natural language due dates, and optional labels/description. This adds meaningful behavioral context beyond a simple 'create' action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs with no fluff. It front-loads the main action and then lists optional details. Not overly structured but efficient for its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 5 parameters (1 required) and an output schema exists, the description covers all parameters implicitly, explains defaults for project, and mentions optional fields. It lacks error handling or prerequisite info but is adequate for a create tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter is well-documented in the schema (e.g., content, project, due_date). The description only reiterates that labels, due date, and description are optional, adding minimal new meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it creates a new task in Todoist with content, project, labels, due date, and description. The verb 'create' and resource 'task' are specific, and the description distinguishes it from siblings like update_task, complete_task, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for creating tasks but lacks explicit guidance on when to use this tool versus alternatives like update_task or batch_update_tasks. No exclusions or context about when not to use are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_todoist_labelB
Create a new personal label in Todoist.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Label name to create | |
| color | No | Label color. Valid values: berry_red, red, orange, yellow, olive_green, lime_green, green, mint_green, teal, sky_blue, light_blue, blue, grape, violet, lavender, magenta, salmon, charcoal. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided; description only says 'create' without disclosing side effects, permissions, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no unnecessary words, front-loaded with purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple create tool with 2 parameters and an output schema, the description is minimal but covers the basic purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the description adds no extra meaning beyond what's already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'create' and the resource 'personal label in Todoist', distinguishing it from siblings like delete, rename, and list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives, nor any prerequisites or context for creation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_taskADestructive
Permanently delete a Todoist task.
This action is irreversible. Consider complete_task() instead if you want to keep a record of the task.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The Todoist task ID to delete |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the 'destructiveHint' annotation by explicitly stating the action is 'irreversible.' This reinforces the destructive nature and helps the agent understand the permanence. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, consisting of two sentences that front-load the key information. There is no redundant or unnecessary text, and every sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, destructive operation), the description completely covers the necessary context: what the tool does, its irreversibility, and an alternative for a non-destructive outcome. The presence of an output schema reduces the need for return value explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, and the schema already describes the parameter 'task_id' with a clear description. The tool description does not add any additional parameter-specific semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Permanently delete a Todoist task.' It uses a specific verb and resource, and explicitly distinguishes from the sibling tool 'complete_task' by advising to use that alternative if keeping a record is desired.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on when not to use this tool by suggesting 'complete_task()' as an alternative for record-keeping. However, it does not mention other relevant contexts or alternatives among the sibling tools, such as batch updates or moving tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_todoist_labelADestructive
Permanently delete a Todoist label.
This removes the label from all tasks that have it. This action is irreversible.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | The label ID to delete. Use list_todoist_labels() to find IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description details 'removes from all tasks' and 'irreversible,' providing full behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences, front-loaded with purpose, minimal and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Fully covers purpose, effects, and irreversibility for a one-parameter tool with existing annotations and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds value beyond the schema by advising agents to use list_todoist_labels to find IDs, enriching the single parameter's semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states 'Permanently delete a Todoist label,' specifying the action and resource. Distinct from siblings like rename or create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the side effect of removing the label from all tasks and emphasizes irreversibility, guiding agents to use with caution. Does not explicitly list alternatives like renaming.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_completed_tasksARead-only
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.
Example: get_completed_tasks(since="2026-03-12", until="2026-03-19")
Returns: [{"id": "123", "content": "Buy milk", "project_id": "456", ...}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of completed tasks per page (1-200). | |
| since | Yes | ISO date or datetime for the start of the range (inclusive). e.g. '2026-03-12' or '2026-03-12T00:00:00'. Todoist API limits the range to 3 months. | |
| until | Yes | ISO date or datetime for the end of the range (inclusive). e.g. '2026-03-19' or '2026-03-19T23:59:59'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true. The description adds that results are inclusive of the date range and provides an example return object, giving behavioral context beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Concise 4-sentence description with clear sections: purpose, scope, usage suggestion, example, and return format. Every sentence adds value with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description sufficiently covers functionality. It includes an example return and usage suggestion, though it omits mentioning the 3-month API limit (present only in schema).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 3 parameters with 100% description. The description repeats the date range concept and shows an example call, but adds no new semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves completed tasks within a date range, using a specific verb and resource. It distinguishes from sibling tools like get_project_tasks by focusing on completed items and date filtering.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description suggests use for 'weekly review metrics' but does not explicitly contrast with alternative tools (e.g., get_project_tasks) or provide when-not-to-use guidance. Usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_tasksARead-only
Get all tasks from a Todoist project.
Returns tasks with: id, content, description, labels, due, priority, project_id.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Project name as it appears in Todoist (case-insensitive). Use list_todoist_projects() to see available projects. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true. The description adds the specific return fields and that the project name is case-insensitive. However, it doesn't disclose how tasks are filtered (e.g., active vs. all) or behavior for missing projects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences front-load the purpose and list key return fields. Every word serves a purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple one-parameter read tool with an output schema and annotations, the description covers the essential purpose and return fields. However, it omits whether 'all tasks' includes completed ones (likely not, given get_completed_tasks sibling) and order of results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already describes the 'project' parameter comprehensively. The tool description adds no extra parameter meaning, so baseline of 3 is appropriate since schema coverage is 100%.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get all tasks from a Todoist project,' specifying the verb and resource. It also lists the returned fields, distinguishing it from sibling tools like get_completed_tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like get_completed_tasks or update_task. The only hint is in the parameter description suggesting to use list_todoist_projects for project names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_task_commentsARead-only
Get all comments on a Todoist task.
Returns all comments attached to the specified task, ordered by creation time.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | The Todoist task ID to get comments for |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds that comments are ordered by creation time, providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the purpose and include an important behavioral detail (ordering). No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, no nested objects, output schema present), the description is complete—it states the purpose, scope, and ordering.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with the task_id parameter fully described. The description does not add additional meaning beyond what the schema provides, resulting in a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Get all comments on a Todoist task', providing a specific verb and resource. It distinguishes itself from siblings like 'add_task_comment' which is for creating comments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance on when to use this tool versus alternatives like 'add_task_comment' or other task retrieval tools. The context implies reading, but no when-not-to-use or alternative descriptions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todoist_labelsARead-only
List all personal Todoist labels.
Returns every label with its ID, name, and color. Labels are referenced by name in task operations.
Example: list_todoist_labels()
Returns: [{"id": "111", "name": "Home", "color": "blue"}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true, and the description adds that it returns all labels with ID, name, and color, and notes that labels are referenced by name in task operations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with three sentences, an example, and a return format. Every sentence adds value, and the main action is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema present, the description is complete. It specifies what is listed (all labels), the fields returned (ID, name, color), and how labels are used.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, and schema coverage is 100%. The description adds no parameter info because none exist, which is appropriate. Baseline score of 4 for zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists all personal Todoist labels, with specific verb 'list' and resource 'labels'. It distinguishes from sibling tools like create_todoist_label or delete_todoist_label by focusing on read-only listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a usage example and explains what is returned. While it does not explicitly state when to use vs alternatives, the context of listing all labels is straightforward and distinct from create/rename/delete operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_todoist_projectsARead-only
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.
Example: list_todoist_projects()
Returns: [{"id": "12345", "name": "Inbox"}, {"id": "67890", "name": "Work Tasks"}, ...]
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description confirms a read-only operation. It adds context that it returns ID and name, but doesn't discuss rate limits or auth, which is acceptable given the tool's simplicity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: purpose, usage guide, example with return format. No wasted words; essential information front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with an output schema, the description is fully adequate: it explains the purpose, usage, and provides a concrete example of the return format.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters, so schema coverage is 100%. The description adds an example and return format, providing extra clarity beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all Todoist projects' and specifies it returns every project with ID and name, distinguishing it from sibling tools like task/label utilities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to discover valid project names for other tools', providing clear context for when to use it. No explicit exclusions or alternatives, but sufficient for this simple tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_taskB
Move a task to a different Todoist project.
| Name | Required | Description | Default |
|---|---|---|---|
| project | Yes | Target project name (case-insensitive). Use list_todoist_projects() for valid names. | |
| task_id | Yes | The Todoist task ID to move |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must disclose behavioral traits. It only states the action 'Move' but fails to describe side effects, permissions, required states (task must exist, project must exist), or error conditions. The description is insufficient for an agent to anticipate the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence without any redundancy. It is front-loaded and efficient, earning its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, no nesting) and presence of an output schema, the description is adequate but incomplete. It lacks details on execution context (e.g., required permissions, behavior on duplicate projects). Still, for a straightforward move operation, it provides a minimally viable description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a description (e.g., project includes case-insensitivity and suggestion to use list_todoist_projects). The tool description adds no additional meaning beyond the schema, meeting the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Move a task to a different Todoist project' clearly states the verb (move) and resource (task, different project), distinguishing it from siblings like update_task which modifies fields, or complete_task which changes status. The purpose is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus siblings like batch_update_tasks or update_task. There are no conditions, prerequisites, or exclusions mentioned, leaving the agent without context for proper selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_todoist_labelB
Rename an existing Todoist label.
| Name | Required | Description | Default |
|---|---|---|---|
| label_id | Yes | The label ID to rename. Use list_todoist_labels() to find IDs. | |
| new_name | Yes | New name for the label |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose behavioral traits such as side effects on tasks or reversibility. It only states the action without any context about permissions or consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence with no wasted words. However, it could be slightly more informative without becoming verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity and presence of an output schema, the description is minimally adequate. It fails to mention that the label must exist or that only the name changes, but it does not introduce errors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description adds no extra meaning beyond what the schema already provides. The schema includes a helpful usage hint for label_id, which the description does not duplicate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (rename) and resource (Todoist label). It succinctly conveys what the tool does and distinguishes it from sibling tools like create, delete, and list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. It does not mention prerequisites, such as needing to list labels first, or scenarios where renaming is preferred over creating a new label.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| labels | No | New labels (replaces existing). Use label names, not IDs. Leave empty to keep current. | |
| content | No | New task title/content. Leave empty to keep current. | |
| task_id | Yes | The Todoist task ID to update | |
| due_date | No | New due date — natural language or date string. Leave empty to keep current. | |
| description | No | New description text. Leave empty to keep current. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses an important side effect: setting labels replaces all existing labels. However, it does not mention error handling, permissions, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences that front-load the purpose and then provide critical behavioral details. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and no annotations, the description covers the essential behavior for a simple update tool. It could mention what happens if the task does not exist, but it is generally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents all parameters. The description adds value by clarifying the label replacement behavior, which is not fully captured in the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Update fields on an existing Todoist task' with a specific verb and resource, distinguishing it from siblings like create_task, delete_task, and complete_task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains that only specified fields are changed and labels replace all existing, but it does not explicitly state when to use this tool versus alternatives like batch_update_tasks or other update methods.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool has a distinct purpose: task CRUD, comment operations, label management, and project listing. There is no overlap that would confuse an agent; even similar tools like update_task and batch_update_tasks are clearly differentiated by scope.
All tools use snake_case verb_noun patterns, which is consistent. However, there is a minor inconsistency: some tools include 'todoist' (e.g., create_todoist_label) while others do not (e.g., create_task). This is a small deviation from a pure pattern.
15 tools cover the main Todoist entities (tasks, comments, labels, projects) without being overwhelming. The count is well-scoped for the server's purpose.
The tool set is missing several key operations: no create/delete/rename projects, no get single task by ID, no delete or update comments. These gaps would force agents to work around missing functionality, causing potential failures.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
Related MCP Servers
- AlicenseAqualityCmaintenanceAn MCP server that integrates Claude with Todoist, enabling natural language task management including creating, updating, completing, and deleting tasks.5554392MIT
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol server that enables advanced task and project management in Todoist via Claude Desktop and other MCP-compatible clients.522MIT
- AlicenseBqualityCmaintenanceAn MCP server that connects Claude with Todoist for complete task and project management through natural language.86184243MIT
- AlicenseBqualityDmaintenanceA comprehensive MCP server that provides full integration between Claude and Todoist, enabling task, project, section, and label management through 24 different tools with the complete Todoist API.30186MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/stevesimpson418/todoist-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server