Todoist MCP Server — tasks, projects, sections, labels, comments, incremental sync, batch commands
Project description
todoist-blade-mcp
A high-performance Model Context Protocol server for Todoist. Dual API strategy (REST v2 + Sync v9), token-efficient output, and a write-gated safety model.
Why this over the official Todoist MCP?
| Capability | Official | todoist-blade-mcp |
|---|---|---|
| API coverage | REST v2 only | REST v2 + Sync v9 |
| Batch commands | One op per call | Up to 100 ops in a single todoist_batch call via Sync API |
| Incremental sync | Not supported | Delta tokens — only fetch what changed since last sync |
| Output format | JSON blobs | Pipe-delimited, null-omitted — 40-60% fewer tokens |
| Write safety | Open | Write-gated: mutations require explicit TODOIST_WRITE=true |
| Filter queries | Basic | Full Todoist filter syntax (#Work & due before: tomorrow) |
| Productivity stats | Not exposed | Karma, streaks, daily/weekly goals |
| Completed tasks | Not exposed | Full completion history (Pro accounts) |
| Quick add | Not exposed | Natural language parsing (Buy milk tomorrow p1 #Shopping) |
| Tool count | ~15 | 30 |
The key differentiator is the Sync v9 integration. No other Todoist MCP server uses it. This unlocks batch commands (bulk-create 50 tasks in one call), incremental sync (delta tokens eliminate redundant fetches), and access to endpoints REST v2 simply doesn't expose.
Features
- 30 tools across 7 categories — projects, sections, tasks, comments, labels, sync, productivity
- Dual API client — REST v2 for simple CRUD, Sync v9 for batch operations and incremental sync
- Token-efficient formatters — pipe-delimited output with null omission, not verbose JSON
- Write-gated safety — all mutations disabled by default; enable with
TODOIST_WRITE=true - Destructive confirmation — delete operations require explicit
confirm=trueparameter - Filter query support — full Todoist filter syntax in
tasks_listandtasks_search - Natural language quick-add — dates, priorities, labels, and projects parsed from plain text
- HTTP transport with auth — Bearer token middleware for remote deployments
Quick Start
# Clone
git clone https://github.com/groupthink-dev/todoist-blade-mcp.git
cd todoist-blade-mcp
# Install
pip install -e .
# Run (read-only by default)
export TODOIST_API_TOKEN="your-api-token"
todoist-blade-mcp
To enable write operations:
export TODOIST_WRITE=true
Tools
Projects (6)
| Tool | Description | Gated |
|---|---|---|
projects_list |
List all projects with hierarchy | |
projects_read |
Get project details by ID | |
projects_create |
Create a new project | write |
projects_update |
Update project name, colour, etc. | write |
projects_delete |
Delete a project | write + confirm |
projects_collaborators |
List project collaborators |
Sections (4)
| Tool | Description | Gated |
|---|---|---|
sections_list |
List sections in a project | |
sections_create |
Create a section | write |
sections_update |
Rename a section | write |
sections_delete |
Delete a section | write + confirm |
Tasks (9)
| Tool | Description | Gated |
|---|---|---|
tasks_list |
List tasks with filter query support | |
tasks_read |
Get task details by ID | |
tasks_search |
Search with advanced Todoist filter syntax | |
tasks_create |
Create a task with full metadata | write |
tasks_update |
Update task fields | write |
tasks_complete |
Mark a task complete | write |
tasks_reopen |
Reopen a completed task | write |
tasks_delete |
Delete a task | write + confirm |
tasks_quick_add |
Natural language task creation | write |
Comments (4)
| Tool | Description | Gated |
|---|---|---|
comments_list |
List comments on a task or project | |
comments_create |
Add a comment | write |
comments_update |
Edit a comment | write |
comments_delete |
Delete a comment | write |
Labels (3)
| Tool | Description | Gated |
|---|---|---|
labels_list |
List personal and shared labels | |
labels_create |
Create a label | write |
labels_delete |
Delete a label | write |
Sync (2)
| Tool | Description | Gated |
|---|---|---|
todoist_sync |
Incremental sync with delta tokens — only returns changes since last sync | |
todoist_batch |
Execute up to 100 commands in a single Sync API call | write |
Productivity (2)
| Tool | Description | Gated |
|---|---|---|
todoist_stats |
Karma score, streaks, daily/weekly goals | |
todoist_completed |
Completion history with date ranges (Pro) |
Filter Query Examples
tasks_list and tasks_search accept Todoist filter syntax:
today # Due today
overdue | today # Overdue or due today
#Work & due before: tomorrow # Work project, due before tomorrow
p1 & no date # Priority 1 with no due date
@waiting & !subtask # Label "waiting", exclude subtasks
assigned to: me & due: week # Assigned to me, due this week
created before: -30 days # Created in the last 30 days
Security Model
| Layer | Behaviour |
|---|---|
| Read-only default | TODOIST_WRITE=false — all mutations return an error |
| Write gate | Set TODOIST_WRITE=true to enable create/update/delete/complete tools |
| Delete confirmation | projects_delete, sections_delete, tasks_delete require confirm=true |
| Token scoping | Server uses only the permissions granted to your Todoist API token |
| HTTP auth | Bearer token middleware for remote/HTTP transport deployments |
Configuration
Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"todoist": {
"command": "todoist-blade-mcp",
"env": {
"TODOIST_API_TOKEN": "your-api-token",
"TODOIST_WRITE": "true"
}
}
}
}
Claude Code
Add to .mcp.json in your project root:
{
"mcpServers": {
"todoist": {
"command": "todoist-blade-mcp",
"env": {
"TODOIST_API_TOKEN": "your-api-token",
"TODOIST_WRITE": "true"
}
}
}
}
Environment Variables
| Variable | Required | Default | Description |
|---|---|---|---|
TODOIST_API_TOKEN |
Yes | — | Todoist API token (Settings > Integrations > Developer) |
TODOIST_WRITE |
No | false |
Enable write operations (create, update, delete, complete) |
TODOIST_BATCH_LIMIT |
No | 100 |
Max commands per todoist_batch call |
TODOIST_TRANSPORT |
No | stdio |
Transport mode: stdio or http |
TODOIST_HTTP_PORT |
No | 8080 |
Port for HTTP transport |
TODOIST_HTTP_TOKEN |
No | — | Bearer token for HTTP transport auth |
Architecture
src/todoist_blade_mcp/
├── server.py — FastMCP server, 30 @mcp.tool decorators
├── client.py — Dual API client (REST v2 + Sync v9), delta tokens
├── formatters.py — Token-efficient output (pipe-delimited, null omission)
├── models.py — Config, write-gate, batch limits
└── auth.py — Bearer token middleware for HTTP transport
REST v2 handles individual CRUD — get a task, create a project, post a comment. Straightforward request/response.
Sync v9 handles everything REST can't. Incremental sync uses a sync_token (delta token) so subsequent calls only return what changed. Batch mode packs up to 100 heterogeneous commands (create tasks, move sections, complete items) into a single API call and returns per-command results.
Formatters convert API responses to pipe-delimited text with null fields omitted. A task that would be 800 tokens as formatted JSON becomes ~300 tokens. Over a multi-turn conversation this compounds significantly.
Development
# Install in development mode
make install-dev
# Run tests
make test
# Lint
make lint
# Type check
make typecheck
# Format
make fmt
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file todoist_blade_mcp-0.2.0.tar.gz.
File metadata
- Download URL: todoist_blade_mcp-0.2.0.tar.gz
- Upload date:
- Size: 109.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ef8472a327632b19066121d39a12926244c2e67722ad7dc97c2246f442c046dd
|
|
| MD5 |
4d970d79d62a76d9f16a91470009d31e
|
|
| BLAKE2b-256 |
f747e5977ad8de6c49e8a5f5f09b167e5c617567ce78d518bec399c9545165c1
|
Provenance
The following attestation bundles were made for todoist_blade_mcp-0.2.0.tar.gz:
Publisher:
publish.yml on Groupthink-dev/todoist-blade-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todoist_blade_mcp-0.2.0.tar.gz -
Subject digest:
ef8472a327632b19066121d39a12926244c2e67722ad7dc97c2246f442c046dd - Sigstore transparency entry: 1396176260
- Sigstore integration time:
-
Permalink:
Groupthink-dev/todoist-blade-mcp@da71cacf0692f46d0f5840b932f74177a6c7ade6 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Groupthink-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da71cacf0692f46d0f5840b932f74177a6c7ade6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file todoist_blade_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: todoist_blade_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 23.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7846600051ef8f48b2f2620a6cd759166befddeb5e4ff3e7bc41ce34f9a80e36
|
|
| MD5 |
e29d13a5092067e12328fbdae842972d
|
|
| BLAKE2b-256 |
c744dd7fa513e639954897ec170fb514c33b8ea98d74e463318abb7d03c12fa7
|
Provenance
The following attestation bundles were made for todoist_blade_mcp-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on Groupthink-dev/todoist-blade-mcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
todoist_blade_mcp-0.2.0-py3-none-any.whl -
Subject digest:
7846600051ef8f48b2f2620a6cd759166befddeb5e4ff3e7bc41ce34f9a80e36 - Sigstore transparency entry: 1396176269
- Sigstore integration time:
-
Permalink:
Groupthink-dev/todoist-blade-mcp@da71cacf0692f46d0f5840b932f74177a6c7ade6 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/Groupthink-dev
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@da71cacf0692f46d0f5840b932f74177a6c7ade6 -
Trigger Event:
push
-
Statement type: