MCP Hub
Back to servers

todoist-v1-mcp-server

A clean, reliable MCP (Model Context Protocol) server for Todoist — built on the Todoist unified API v1.

glama
Updated
Apr 16, 2026

todoist-v1-mcp-server

A clean, reliable MCP (Model Context Protocol) server for Todoist — built on the Todoist unified API v1.

Why this exists

The official Todoist web MCP (todoist-ai) has a known persistent disconnection bug on the Anthropic side that requires reconnecting daily. Community alternatives are either built on the deprecated REST API v2 or have schema validation bugs that cause failures when Todoist returns additional fields as their API evolves.

This server:

  • Targets the current Todoist API v1 (not deprecated v2)
  • Uses stdio transport — no cloud dependency, no daily reconnections
  • Uses the modern MCP SDK registerTool() API (not the deprecated setRequestHandler pattern)
  • Never enforces strict output schemas on API responses — Todoist can add new fields freely without breaking anything
  • Zero SDK wrapper dependency — direct HTTP calls via axios, so there's no intermediary library drifting from the API

Tools (20 total)

Tasks

ToolDescription
todoist_get_tasksList/filter tasks — supports Todoist filter strings like "today", "overdue", "p1", "#ProjectName", "7 days"
todoist_get_taskGet a single task by ID
todoist_create_taskCreate a task with natural language due dates ("tomorrow", "every monday", etc.)
todoist_update_taskUpdate any field; pass clear_due_date: true to remove a due date
todoist_complete_taskMark a task as done
todoist_reopen_taskReopen a completed task
todoist_delete_taskPermanently delete a task

Projects

ToolDescription
todoist_get_projectsList all projects
todoist_get_projectGet a single project by ID
todoist_create_projectCreate a project (with color, view style, parent)
todoist_update_projectUpdate a project
todoist_delete_projectPermanently delete a project and all its tasks

Sections

ToolDescription
todoist_get_sectionsList sections within a project
todoist_create_sectionCreate a section
todoist_update_sectionRename a section
todoist_delete_sectionDelete a section

Labels

ToolDescription
todoist_get_labelsList all personal labels
todoist_create_labelCreate a label
todoist_update_labelUpdate a label
todoist_delete_labelDelete a label

Setup

1. Get your Todoist API token

Go to Todoist → Settings → Integrations → Developer and copy your API token.

2. Install and build

git clone https://github.com/christulino/todoist-v1-mcp-server
cd todoist-v1-mcp-server
npm install
npm run build

3. Configure Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "todoist": {
      "command": "node",
      "args": ["/absolute/path/to/todoist-v1-mcp-server/dist/index.js"],
      "env": {
        "TODOIST_API_TOKEN": "your_api_token_here"
      }
    }
  }
}

Restart Claude Desktop. You should see "todoist" in the connected MCP servers.

4. Configure Claude Code (optional)

claude mcp add todoist -- node /absolute/path/to/todoist-v1-mcp-server/dist/index.js

Then set the env var:

export TODOIST_API_TOKEN=your_api_token_here

Or add it to your shell profile.

Usage examples

Once connected, Claude can handle natural language like:

  • "What's on my plate today?" → uses todoist_get_tasks with filter: "today"
  • "Add a task to call the dentist next Tuesday" → uses todoist_create_task
  • "Mark the dentist task as done" → uses todoist_complete_task
  • "Show me everything overdue" → uses todoist_get_tasks with filter: "overdue"
  • "Create a project called Home Renovation" → uses todoist_create_project
  • "What projects do I have?" → uses todoist_get_projects

Todoist filter syntax

The filter parameter in todoist_get_tasks supports Todoist's full natural language filter syntax:

FilterMeaning
todayDue today
overduePast due
7 daysDue in the next 7 days
p1Priority urgent
#ProjectNameTasks in a specific project
@labelnameTasks with a specific label
no due dateTasks without a due date
today | overdueToday or overdue (combine with |)
today & @waitingToday AND labeled 'waiting'

Full filter documentation: https://todoist.com/help/articles/introduction-to-filters

Requirements

  • Node.js 18+
  • A Todoist account (free tier works)

Development

npm run dev   # tsx watch mode with auto-reload
npm run build # compile TypeScript
npm start     # run compiled server

Testing

The test suite hits the live Todoist API and runs a full CRUD cycle across tasks, projects, sections, and labels. All test data is prefixed with [mcp-test] and cleaned up automatically.

TODOIST_API_TOKEN=your_token npm test

Your API token is at Todoist → Settings → Integrations → Developer — same token you put in claude_desktop_config.json.

Contributing

PRs welcome. The goal is a minimal, correct implementation that stays current with the Todoist API v1. Priorities:

  1. Correctness over cleverness
  2. Permissive output handling (never reject unknown API fields)
  3. Helpful error messages that tell you what went wrong and how to fix it

License

MIT

Reviews

No reviews yet

Sign in to write a review