py-todoist-mcp
This server enables AI assistants to manage Todoist tasks and projects through the Model Context Protocol (MCP).
Task Management:
List tasks — Retrieve all tasks, optionally filtered by project ID or a Todoist filter string (e.g., "today", "overdue", "#work")
Get a task — Fetch full details of a single task by its ID
Create a task — Add a new task with content, description, due date, priority (1–4), project assignment, and labels
Update a task — Modify an existing task's content, description, due date, priority, or labels
Complete a task — Mark a task as done by its ID
Delete a task — Permanently remove a task by its ID
Project Management:
List projects — Retrieve all Todoist projects
Get a project — Fetch full details of a single project by its ID
Create a project — Add a new project with a name, optional color, and optional parent project (for nesting)
Update a project — Modify a project's name, color, or favorite status
Delete a project — Permanently remove a project by its ID
Allows AI assistants to manage Todoist tasks and projects, including capabilities to create, read, update, complete, and delete tasks, manage nested projects, and query data using Todoist's filter syntax.
Click on "Deploy 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., "@py-todoist-mcp Create a new task 'Call the dentist' for tomorrow at 3pm"
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.
py-todoist-mcp
A Python MCP (Model Context Protocol) server for Todoist integration, enabling AI assistants to manage tasks and projects via the Model Context Protocol.
Features
Task Management: Create, read, update, complete, and delete tasks
Project Management: Manage Todoist projects with support for nested projects
Filter Support: Query tasks using Todoist's powerful filter syntax
Error Handling: Robust error handling with user-friendly messages
Structured Logging: Comprehensive logging for debugging and monitoring
Related MCP server: MCP Todo.txt Integration
Prerequisites
Python 3.13 or higher
uv for Python package management
A Todoist API token
Installation
1. Install with uv
uv tool install git+https://github.com/chris-jelly/py-todoist-mcp.gitThis installs todoist-mcp into an isolated environment and makes it available globally on your PATH.
2. Set up your API token
The server reads TODOIST_API_TOKEN from the environment. Add it to your shell profile (~/.bashrc, ~/.zshrc, etc.):
# Add to your shell profile
export TODOIST_API_TOKEN="your-api-token-here"To obtain your Todoist API token:
Log in to Todoist
Go to Settings → Integrations → Developer
Copy your API token
Note: Avoid placing your API token directly in MCP configuration files. These files are easy to accidentally commit or share. The server will pick up the token from your environment automatically.
Configuration
OpenCode
Add the following to ~/.config/opencode/opencode.json. This uses uvx to run the server directly from the git repo — no local install required:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"todoist": {
"type": "local",
"command": ["uvx", "--from", "git+https://github.com/chris-jelly/py-todoist-mcp.git", "todoist-mcp"],
"environment": {
"TODOIST_API_TOKEN": "{env:TODOIST_API_TOKEN}"
}
}
}
}If you've already installed the package locally (via uv tool install), you can use the simpler form:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"todoist": {
"type": "local",
"command": ["todoist-mcp"]
}
}
}Codex
Add the following to your Codex configuration file (location varies by installation):
{
"mcpServers": {
"todoist": {
"command": "todoist-mcp"
}
}
}Usage
Once configured, you can use natural language to interact with Todoist:
Task Examples
"Show me all my tasks"
"List my tasks for today"
"Create a task 'Buy groceries' due tomorrow with priority 1"
"Get details for task ID 123456"
"Update task 123456 to be due next Monday"
"Mark task 123456 as complete"
"Delete task 123456"Project Examples
"List all my projects"
"Create a new project called 'Work'"
"Get details for project ID 987654"
"Update project 987654 color to blue"
"Delete project 987654"Filter Examples
"Show me overdue tasks"
"List tasks in project work"
"Get tasks labeled urgent"Available Tools
Task Tools
Tool | Description |
| List tasks with optional filters (project_id, filter_string) |
| Get a single task by ID with full details |
| Create a new task with content, description, due_date, priority, project_id, labels |
| Update task attributes by ID |
| Mark a task as complete by ID |
| Delete a task by ID |
Project Tools
Tool | Description |
| List all projects |
| Get a single project by ID with full details |
| Create a new project with name, color, parent_id |
| Update project attributes by ID |
| Delete a project by ID |
Development
Setup
git clone git@github.com:chris-jelly/py-todoist-mcp.git
cd py-todoist-mcp
uv syncRunning the server locally
uv run todoist-mcpCode Quality
This project uses Ruff for linting and formatting:
# Format code
ruff format .
# Check for linting errors
ruff check .
# Fix auto-fixable issues
ruff check . --fixProject Structure
py-todoist-mcp/
├── src/todoist_mcp/
│ ├── __init__.py
│ ├── main.py # Entry point
│ ├── server.py # FastMCP server setup
│ ├── client.py # Todoist API client
│ ├── utils.py # Logging and error handling
│ └── tools/
│ ├── __init__.py
│ ├── tasks.py # Task management tools
│ └── projects.py # Project management tools
├── pyproject.toml
└── README.mdLicense
MIT License - see LICENSE file for details.
Contributing
Contributions are welcome! Please ensure:
All code passes
ruff lintandruff formatchecksFollow the existing code patterns and conventions
Add tests for new functionality
Update documentation as needed
Troubleshooting
Server won't start
Verify
TODOIST_API_TOKENis set correctlyCheck that Python 3.13+ is installed:
python --versionEnsure uv is installed:
uv --version
Authentication errors
Verify your API token is correct and hasn't expired
Check that your Todoist account is active
Ensure the token has appropriate permissions
AI Assistant not connecting
For Opencode:
Verify the configuration JSON syntax
Check the Opencode logs:
~/.config/opencode/logs/Run
opencode --versionto ensure it's installed correctlyRestart Opencode after configuration changes
For Codex:
Verify the configuration JSON syntax
Check Codex output for error messages
Restart Codex after configuration changes
Available Tools
11 toolstodoist_add_projectB
Create a new project in Todoist.
Args: name: The project name. color: Optional color for the project (e.g., "red", "blue", "#ff9900"). parent_id: Optional parent project ID for nested projects.
Returns: A confirmation message with the created project ID.
Inputs: name (required), color, parent_id. Returns: result
todoist_add_taskB
Create a new task in Todoist.
Args: content: The task content/name. description: Optional task description. due_date: Optional due date string (e.g., "tomorrow", "2024-01-15", "next Monday"). priority: Optional priority (1-4, where 4 is highest). project_id: Optional project ID to assign the task to. labels: Optional list of label names to apply.
Returns: A confirmation message with the created task ID.
Inputs: content (required), description, due_date, priority, +2 more. Returns: result
todoist_complete_taskA
Mark a task as complete.
Args: task_id: The ID of the task to complete.
Returns: A confirmation message.
Inputs: task_id (required). Returns: result
todoist_delete_projectA
Delete a project by ID.
Args: project_id: The ID of the project to delete.
Returns: A confirmation message.
Inputs: project_id (required). Returns: result
todoist_delete_taskB
Delete a task by ID.
Args: task_id: The ID of the task to delete.
Returns: A confirmation message.
Inputs: task_id (required). Returns: result
todoist_get_projectA
Get a single project by ID.
Args: project_id: The ID of the project to retrieve.
Returns: A formatted string containing the project details.
Inputs: project_id (required). Returns: result
todoist_get_projectsB
Get a list of all projects from Todoist.
Returns: A formatted string containing the list of projects.
Inputs: no named parameters. Returns: result
todoist_get_taskB
Get a single task by ID.
Args: task_id: The ID of the task to retrieve.
Returns: A formatted string containing the task details.
Inputs: task_id (required). Returns: result
todoist_get_tasksB
Get a list of tasks from Todoist with optional filters.
Args: project_id: Optional project ID to filter tasks by project. filter_string: Optional filter/query string (e.g., "today", "overdue", "#work").
Returns: A formatted string containing the list of tasks.
Inputs: project_id, filter_string. Returns: result
todoist_update_projectB
Update an existing project in Todoist.
Args: project_id: The ID of the project to update. name: Optional new project name. color: Optional new color for the project. is_favorite: Optional flag to mark project as favorite.
Returns: A confirmation message.
Inputs: project_id (required), name, color, is_favorite. Returns: result
todoist_update_taskB
Update an existing task in Todoist.
Args: task_id: The ID of the task to update. content: Optional new task content. description: Optional new description. due_date: Optional new due date string. priority: Optional new priority (1-4). labels: Optional new list of label names.
Returns: A confirmation message.
Inputs: task_id (required), content, description, due_date, +2 more. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 11 tools
Every tool has a clearly distinct purpose targeting specific resources (projects or tasks) and actions (add, get, update, delete, complete). The naming convention makes it immediately obvious which resource and operation each tool handles, with no overlap or ambiguity between tools.
All tools follow a perfect 'todoist_verb_noun' pattern with consistent snake_case throughout. The verbs (add, get, update, delete, complete) are consistently applied to the appropriate nouns (project, projects, task, tasks), creating a highly predictable and readable naming scheme.
With 11 tools, this server provides comprehensive coverage for Todoist project and task management. The count is well-scoped for the domain, offering full CRUD operations for both projects and tasks plus additional useful operations like task completion and filtered task listing.
The tool surface provides complete CRUD/lifecycle coverage for both projects and tasks in Todoist. It includes all essential operations: create, read (single and list), update, and delete for both resource types, plus task completion and filtered task retrieval. There are no obvious gaps for the stated Todoist integration purpose.
Maintenance
Related MCP Connectors
Official Todoist MCP server. Manage tasks and projects. Hosted, no API key needed.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol server that enables advanced task and project management in Todoist via Claude Desktop and other MCP-compatible clients.99 npm2MIT
- AlicenseBqualityDmaintenanceA server implementation that enables LLMs to programmatically manage tasks in Todo.txt files using the Model Context Protocol (MCP), supporting operations like adding, completing, deleting, listing, searching, and filtering tasks.1111 npm9ISC
- AlicenseBqualityDmaintenanceA Model Context Protocol server implementation compatible with Todoist API, allowing AI agents to interact with task management functionality through standardized MCP tools.518 npm1MIT
- AlicenseAqualityDmaintenanceAn unofficial MCP server that enables AI agents to create and list tasks in Todoist using natural language. It supports task details such as due dates, priorities, and labels, while allowing for project-based filtering.3MIT