A comprehensive Model Context Protocol (MCP) server for the Todoist API. Provides full access to tasks, projects, labels, sections, and comments with support for all task properties including priorities, due dates, labels, subtasks, and more.
- Complete Task Management: Create, read, update, delete, complete, and reopen tasks
- Full Task Properties Support: Content, description, due dates (natural language or specific), priority (1-4), labels, duration estimates, subtasks, assignees, and more
- Project Management: Create and manage projects with colors, hierarchies, and view styles
- Label Management: Create and organize labels for cross-project task categorization
- Section Management: Organize tasks within projects using sections
- Comment Management: Add and manage comments on tasks and projects
- Rate Limiting: Built-in rate limit handling (450 requests per 15 minutes)
- Error Handling: Comprehensive error handling with meaningful error messages
- Node.js (v18 or higher)
- npm
- A Todoist account with API token
- Log in to your Todoist account
- Go to Settings → Integrations → Developer
- Copy your API token
- Set it as an environment variable:
TODOIST_API_TOKEN
# Clone or download this repository
cd todoist-mcp
# Install dependencies
npm install
# Build the project
npm run buildAdd this to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"todoist": {
"command": "node",
"args": [
"E:\\my drive\\programs and files\\dev\\todoist MCP\\build\\index.js"
],
"env": {
"TODOIST_API_TOKEN": "your_api_token_here"
}
}
}
}Replace the path with your actual installation path and add your Todoist API token.
Set the TODOIST_API_TOKEN environment variable and run:
node build/index.jsGet all active tasks with optional filtering.
Parameters:
project_id(optional): Filter by projectsection_id(optional): Filter by sectionlabel(optional): Filter by label namefilter(optional): Custom filter string (e.g., 'today', 'p1', 'overdue')lang(optional): Language code for filter parsing
Example:
{
"filter": "today",
"project_id": "2203306141"
}Get a single task by ID with all properties.
Parameters:
task_id(required): Task ID
Create a new task with comprehensive properties.
Parameters:
content(required): Task titledescription(optional): Task descriptionproject_id(optional): Project IDsection_id(optional): Section IDparent_id(optional): Parent task ID for subtaskspriority(optional): 1-4, where 4 is urgentlabels(optional): Array of label namesdue_string(optional): Natural language due date (e.g., "tomorrow at 14:00")due_date(optional): YYYY-MM-DD formatdue_datetime(optional): RFC3339 formatdue_lang(optional): Language for parsing due_stringassignee_id(optional): User ID to assignduration(optional): Duration amountduration_unit(optional): "minute" or "day"
Example:
{
"content": "Buy groceries",
"description": "Milk, eggs, bread",
"priority": 3,
"labels": ["shopping", "urgent"],
"due_string": "tomorrow at 14:00"
}Update an existing task.
Parameters:
task_id(required): Task ID- All other parameters from
create_task(optional)
Mark a task as complete. Recurring tasks move to next occurrence.
Parameters:
task_id(required): Task ID
Reopen a completed task.
Parameters:
task_id(required): Task ID
Permanently delete a task.
Parameters:
task_id(required): Task ID
Get all projects.
Get a single project by ID.
Parameters:
project_id(required): Project ID
Create a new project.
Parameters:
name(required): Project nameparent_id(optional): Parent project ID for nested projectscolor(optional): Color name (e.g., "blue", "red")is_favorite(optional): Booleanview_style(optional): "list" or "board"
Update an existing project.
Parameters:
project_id(required): Project ID- All other parameters from
create_project(optional)
Permanently delete a project and all its tasks.
Parameters:
project_id(required): Project ID
Get all labels.
Get a single label by ID.
Parameters:
label_id(required): Label ID
Create a new label.
Parameters:
name(required): Label namecolor(optional): Color nameorder(optional): Position in listis_favorite(optional): Boolean
Update an existing label.
Parameters:
label_id(required): Label ID- All other parameters from
create_label(optional)
Permanently delete a label.
Parameters:
label_id(required): Label ID
Get all sections, optionally filtered by project.
Parameters:
project_id(optional): Project ID
Get a single section by ID.
Parameters:
section_id(required): Section ID
Create a new section.
Parameters:
name(required): Section nameproject_id(required): Project IDorder(optional): Position in project
Update an existing section.
Parameters:
section_id(required): Section IDname(required): New section name
Delete a section (tasks are not deleted).
Parameters:
section_id(required): Section ID
Get comments for a task or project.
Parameters:
task_id(optional): Task IDproject_id(optional): Project ID
Get a single comment by ID.
Parameters:
comment_id(required): Comment ID
Create a new comment.
Parameters:
content(required): Comment texttask_id(optional): Task IDproject_id(optional): Project IDattachment(optional): File attachment object
Update an existing comment.
Parameters:
comment_id(required): Comment IDcontent(required): Updated comment text
Permanently delete a comment.
Parameters:
comment_id(required): Comment ID
# Watch mode for development
npm run watch
# Build
npm run buildThe Todoist API has the following rate limits:
- 450 requests per 15 minutes per user
The server automatically tracks requests and throws an error if the limit is exceeded.
All tools provide meaningful error messages when operations fail. Common errors include:
- Missing or invalid API token
- Rate limit exceeded
- Invalid task/project/label IDs
- Invalid parameter values
MIT
Contributions are welcome! Please feel free to submit issues or pull requests.
This server uses Todoist REST API v2.
Built using the Model Context Protocol SDK and the Todoist REST API.