todoist-mcp-server

todoist-mcp-server

A custom MCP server that connects Claude to Todoist using a permanent API token, avoiding OAuth re-authentication issues across all Claude surfaces.

Category
访问服务器

README

todoist-mcp-server

A custom Node.js Model Context Protocol (MCP) server that connects Claude to Todoist using a permanent API token. No OAuth, no re-authentication, works identically on Claude web, Claude Code, and Claude mobile.

Why this exists

The problem

Todoist needs to work across three Claude surfaces:

  • Claude web (claude.ai) on PC
  • Claude Code on PC and Linux
  • Claude mobile on iPhone

Every existing solution fails at least one of these. The core issue is authentication. Todoist's official MCP server (ai.todoist.net/mcp) uses OAuth, but Todoist does not issue OAuth refresh tokens. When the access token expires, Claude cannot silently refresh it and forces manual re-authentication. On Claude mobile this is impossible to fix: you cannot re-authenticate from the iOS app. This is a confirmed bug tracked in the Claude Code issue tracker: #5706, #12447, #19456, #28256.

What we evaluated

Option Why it failed
Todoist official MCP OAuth with no refresh token. Re-auths daily. Broken on mobile.
ClickUp Official MCP in Claude directory but free tier caps at 300 MCP calls/day.
Microsoft To Do M365 connector requires a business Entra tenant. Personal Microsoft accounts explicitly blocked.
Trello No hosted MCP URL. All implementations are local stdio only, which don't work on Claude web or mobile.
TickTick Local stdio only, no hosted URL.
Apple Reminders via CalDAV iOS 13+ broke all third-party CalDAV write access to the native Reminders app. Items written via CalDAV do not appear in the app. Not fixable.
Zapier MCP Free tier: 100 tasks/month. Each MCP call costs 2 tasks = 50 calls/month total.
n8n cloud No meaningful free tier. $24/month plan exhausted in ~9 days by polling.
Composio Works for Claude Code only via local config. Cannot be used as a remote connector for Claude web or mobile.
Bindify Unverified indie credential proxy. No GitHub presence, no security audit.
Asana Team-focused. Missing personal task richness, no Todoist import.

Why a custom server works

Todoist issues a permanent API token (Settings > Integrations > Developer). This token never expires unless manually revoked. It is not an OAuth token and requires no refresh.

A custom MCP server that authenticates to Todoist using this token (stored as an Azure environment variable, never in code) gives a hosted remote MCP URL that:

  • Never requires re-authentication on any surface
  • Works on Claude web, Claude Code, and Claude mobile identically
  • Has no rate limits from a middleware layer
  • Is fully under the owner's control
  • Updates by editing one file in GitHub (Azure redeploys automatically)

API version note

Todoist REST API v2 and Sync API v9 are deprecated as of early 2026. This server uses the unified Todoist API v1 at https://api.todoist.com/api/v1.


Architecture

flowchart TD
    A["🖥️ Claude web (claude.ai)"] --> D
    B["💻 Claude Code (PC / Linux)"] --> D
    C["📱 Claude mobile (iOS)"] --> D

    D["todoist-mcp-server\nNode.js · Azure App Service"]

    D -->|"Todoist API v1\npermanent Bearer token, never expires"| E["api.todoist.com"]

    style D fill:#0078d4,color:#fff,stroke:none
    style E fill:#db4035,color:#fff,stroke:none

Key design decisions:

  • Stateless HTTP transport: StreamableHTTPServerTransport with no session ID generator. Each request is self-contained. Safe on any platform that recycles processes (Azure App Service, Cloud Run, etc.).
  • Native fetch: Node 20+ has built-in fetch. No axios, no node-fetch at runtime.
  • X-Request-Id on mutations: Todoist uses this for idempotency on POST/DELETE. Generated per request with crypto.randomUUID().
  • Tool-per-operation: Each API endpoint is its own MCP tool with typed Zod parameters. Gives Claude precise descriptions and significantly improves how reliably it picks the right tool.
  • No Express: Node's built-in http module keeps dependencies minimal and startup fast.

Tools (33 total)

Tasks (8)

Tool Description
get_tasks List active tasks. Filter by project, section, label, or Todoist filter query (e.g. today, overdue, p1, #ProjectName)
get_task Get a single task by ID
create_task Create a task with content, description, project, section, parent, labels, priority (1-4), due date, assignee
update_task Update any field of an existing task
complete_task Mark a task as done
reopen_task Reopen a completed task
delete_task Permanently delete a task
move_task Move a task to a different project, section, or parent task

Priority scale: 4 = urgent (red), 3 = high (orange), 2 = medium (blue), 1 = normal.

Projects (5)

Tool Description
get_projects List all projects
get_project Get a single project by ID
create_project Create a project with optional color, favorite flag, and view style (list or board)
update_project Update project name, color, favorite status, or view style
delete_project Delete a project and all its tasks

Sections (5)

Tool Description
get_sections List all sections, optionally filtered by project
get_section Get a single section by ID
create_section Create a section inside a project
update_section Rename a section
delete_section Delete a section and all its tasks

Labels (5)

Tool Description
get_labels List all personal labels
get_label Get a single label by ID
create_label Create a label with optional color, order, and favorite flag
update_label Update a label's name, color, or favorite status
delete_label Delete a label

Comments (5)

Tool Description
get_comments Get all comments on a task or project (one of task_id or project_id required)
get_comment Get a single comment by ID
create_comment Add a comment to a task or project
update_comment Edit the text of a comment
delete_comment Delete a comment

Reminders (4)

Requires Todoist Pro. Reminders fire a notification at a specific time or relative to a task's due date.

Tool Description
get_reminders Get all reminders, optionally filtered by task
create_reminder Create a reminder: absolute (specific datetime) or relative (N minutes before due)
update_reminder Update an existing reminder's time
delete_reminder Delete a reminder

Productivity stats (1)

Tool Description
get_productivity_stats Karma score, task completion counts, streaks, and daily/weekly goal progress

Adding to Claude

claude.ai (web and mobile)

  1. Go to claude.ai and sign in.
  2. Click your profile icon, then Customize.
  3. Go to Connectors and click +.
  4. Select Add custom connector and fill in:
    • Name: Todoist
    • Remote MCP server URL: https://your-deployed-app-url/mcp
    • Leave all OAuth fields blank.
  5. Click Add.

Syncs automatically to the Claude mobile app and Claude Code. No re-authentication ever.

Claude Code (.mcp.json)

{
  "mcpServers": {
    "todoist": {
      "type": "http",
      "url": "https://your-deployed-app-url/mcp"
    }
  }
}

Local development

npm install
export TODOIST_API_TOKEN=your_token_here
npm start

Health check: http://localhost:8080/health MCP endpoint: http://localhost:8080/mcp

Get your API token from: todoist.com/app/settings/integrations/developer


A note

This server exists because I love both Claude and Todoist, and the broken OAuth re-authentication flow was ruining the experience of using them together. Hopefully this workaround becomes unnecessary someday. If Anthropic fixes Claude's MCP OAuth token refresh (#5706, #12447, #19456, #28256) or Todoist issues proper refresh tokens, the official MCP server at ai.todoist.net/mcp would make this redundant. Until then, this works.


License

MIT. Copyright (c) 2026 Shashank Vadrevu. See LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选