Skip to main content
Glama

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.git

This 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:

  1. Log in to Todoist

  2. Go to Settings → Integrations → Developer

  3. 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

todoist_get_tasks

List tasks with optional filters (project_id, filter_string)

todoist_get_task

Get a single task by ID with full details

todoist_add_task

Create a new task with content, description, due_date, priority, project_id, labels

todoist_update_task

Update task attributes by ID

todoist_complete_task

Mark a task as complete by ID

todoist_delete_task

Delete a task by ID

Project Tools

Tool

Description

todoist_get_projects

List all projects

todoist_get_project

Get a single project by ID with full details

todoist_add_project

Create a new project with name, color, parent_id

todoist_update_project

Update project attributes by ID

todoist_delete_project

Delete a project by ID

Development

Setup

git clone git@github.com:chris-jelly/py-todoist-mcp.git
cd py-todoist-mcp
uv sync

Running the server locally

uv run todoist-mcp

Code 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 . --fix

Project 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.md

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please ensure:

  1. All code passes ruff lint and ruff format checks

  2. Follow the existing code patterns and conventions

  3. Add tests for new functionality

  4. Update documentation as needed

Troubleshooting

Server won't start

  • Verify TODOIST_API_TOKEN is set correctly

  • Check that Python 3.13+ is installed: python --version

  • Ensure 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 --version to ensure it's installed correctly

  • Restart 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 tools
todoist_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

    A3.7/5.0

    Scored across 11 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count5/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers