Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Todoist MCP server

Vendor MCP
Open markdown

The Todoist MCP connector routes your AI agent's tool calls to Todoist's own MCP server through Scalekit. Each user signs in to Todoist once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 47 tools.

Tools
47
What they doRead · write · destructive
23 · 13 · 1123 read13 write11 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Manage tasks: add, update, complete, reopen, reschedule, and assign tasks across projects and sections
  • Find tasks: search tasks by text, date range, label, assignee, or saved filter, including completed ones
  • Organize projects: create, update, archive, move, and reorder projects and their sections
  • Work with comments and reminders: add and update comments on tasks or projects and set time or location reminders
  • Manage labels and filters: create, update, and list personal labels and saved filter views
  • Track progress: review project health, completion trends, activity logs, and personal productivity stats

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Todoist MCP connection

    In AgentKit > Connections, create a Todoist MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Todoist MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'todoistmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Todoist MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'todoistmcp_find-activity',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • todoistmcp_export-project-templateExport an existing project as a Todoist template, either as CSV content or as a shareable URL.Read-only

    Export Project Template

    Export an existing project as a Todoist template, either as CSV content or as a shareable URL. Use it to duplicate a project, share its structure, or hand the CSV to import-project-template. To read a project rather than export it, use find-tasks instead - it returns structured tasks rather than raw CSV. Nothing is modified.

    Inputs

    projectIdstringrequired
    The ID of the project to export as a template.
    formatstring
    How to return the template. "file" returns the CSV content, which can be passed straight back to import-project-template. "url" returns a shareable download link instead, and is the better choice for large projects because it does not return the whole file.one of fileurldefault file
    useRelativeDatesboolean
    Export due dates relative to the import date (e.g. "day 3") instead of absolute dates. Defaults to false.
  • todoistmcp_fetchFetch the full contents of a task or project by its ID.Read-only

    Fetch

    Fetch the full contents of a task or project by its ID. The ID should be in the format "task:{id}" or "project:{id}".

    Inputs

    idstringrequired
    A unique identifier for the document in the format "task:{id}" or "project:{id}".
  • todoistmcp_fetch-objectFetch a single task, project, comment, or section by its ID.Read-only

    Fetch Object

    Fetch a single task, project, comment, or section by its ID. Use this when you have a specific object ID and want to retrieve its full details. Set includeChildren to also get its direct subtasks or sub-projects.

    Inputs

    idstringrequired
    The unique ID of the object to fetch.
    typestringrequired
    The type of object to fetch.one of taskprojectcommentsection
    includeChildrenboolean
    Also return the direct children of the object: subtasks for a task, sub-projects for a project. Returns childCount plus a compact list, flagging each child that has children of its own. Use this to check whether a task hides subtasks instead of a speculative find-tasks lookup. Ignored for comments and sections.
  • todoistmcp_find-activityRetrieve activity logs to monitor and audit changes in Todoist.Read-only

    Find Activity

    Retrieve activity logs to monitor and audit changes in Todoist. Shows events from all users by default (use initiatorId to filter by specific user). To answer what someone completed in a period, use objectType "task", eventType "completed", and dateFrom/dateTo. Track task completions, updates, deletions, project changes, and more with flexible filtering. Activity history availability and retention depend on the user plan.

    Inputs

    cursorstring
    Pagination cursor for retrieving the next page of results.
    dateFromstring
    Inclusive start of the activity range, as an ISO 8601 date or date-time. For all events on one local calendar day, use that day's start, for example "2026-08-02T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.
    dateTostring
    Exclusive end of the activity range, as an ISO 8601 date or date-time. For all events on 2026-08-02, use "2026-08-03T00:00:00-04:00". Natural-language dates such as "tomorrow" are not supported.
    eventTypestring
    Type of event to filter by.one of addedupdateddeletedcompleteduncompletedarchivedunarchivedsharedleftmoved
    initiatorIdstring
    Filter by the user ID who initiated the event. A first-person question ("what did I complete") needs this: without it the results cover every collaborator. Get the ID from user-info when you do not already have it.
    limitinteger
    Maximum number of activity events to return.default 20
    objectIdstring
    Filter by specific object ID (task, project, or comment).
    objectTypestring
    Type of object to filter by.one of taskcommentproject
    projectIdstring
    Filter events by parent project ID.
    taskIdstring
    Filter events by parent task ID (for subtask events).
  • todoistmcp_find-commentsFind comments by task, project, or get a specific comment by ID.Read-only

    Find Comments

    Find comments by task, project, or get a specific comment by ID. Exactly one of taskId, projectId, or commentId must be provided.

    Inputs

    commentIdstring
    The ID of the comment. Get it from find-comments.
    cursorstring
    Pagination cursor from the previous response to fetch the next page.
    limitinteger
    Maximum number of items to return per page.
    projectIdstring
    The ID of the project. Get it from find-projects.
    taskIdstring
    The ID of the task. Get it from find-tasks.
  • todoistmcp_find-completed-tasksGet completed tasks.Read-only

    Find Completed Tasks

    Get completed tasks. since/until are optional and default to a 7-day window when omitted. Includes all collaborators by default. Person-specific queries (summaries, plans, reports) require responsibleUser.

    Inputs

    cursorstring
    The cursor to get the next page of tasks (cursor is obtained from the previous call to this tool, with the same parameters).
    getBystring
    The method to use to get the tasks: "completion" to get tasks by completion date (ie, when the task was actually completed), "due" to get tasks by due date (ie, when the task was due to be completed by).one of completionduedefault completion
    labelsarray
    The labels to filter the tasks by
    labelsOperatorstring
    The operator to use when filtering by labels. This will dictate whether a task has all labels, or some of them. Default is "or".one of andor
    limitinteger
    The maximum number of tasks to return.default 50
    parentIdstring
    The ID of the parent task to get the tasks for.
    projectIdstring
    The ID of the project to get the tasks for. Project ID should be an ID string, or the text "inbox", for inbox tasks.
    responsibleUserstring
    Filter completed tasks assigned to this user. User ID, name, or email. For personal queries (summaries, plans, reports), set to current user from user-info to exclude collaborators. Defaults to all collaborators.
    sectionIdstring
    The ID of the section to get the tasks for.
    sincestring
    Optional start date for completed tasks. Format: YYYY-MM-DD. Defaults to 6 days before until (or today if until is omitted), resulting in a 7-day window.
    untilstring
    Optional end date for completed tasks. Format: YYYY-MM-DD. Defaults to 6 days after since (or today if since is omitted), resulting in a 7-day window.
    workspaceIdstring
    The ID of the workspace to get the tasks for.
  • todoistmcp_find-filtersList all personal filters or search for filters by name.Read-only

    Find Filters

    List all personal filters or search for filters by name. Filters are saved custom views that use query syntax to organize tasks (e.g. "today & p1", "#Work & overdue").

    Inputs

    searchstring
    Filter by name (partial, case-insensitive match). Returns all if omitted.
  • todoistmcp_find-labelsList personal labels and shared labels.Read-only

    Find Labels

    List personal labels and shared labels. Personal labels have full metadata (id, name, color, order, isFavorite) and support pagination and name search (partial, case insensitive). Shared labels are labels used on tasks shared with you — they are returned as names only (no IDs or metadata). When searching, all matching personal labels are fetched across all pages and returned as a single result set (limit and cursor are ignored). When not searching, personal labels are returned with pagination.

    Inputs

    cursorstring
    Pagination cursor from the previous response to fetch the next page.
    limitinteger
    Maximum number of items to return per page.default 50
    searchTextstring
    Text to search for across names and content.