Skip to main content
Glama

ticktick-mcp

MCP server for TickTick / 滴答清单 (and Dida365 / 滴答清单 CN), built on the private web API — the same endpoints the web app at ticktick.com/webapp calls — not the small public Open API. The outcome of a reverse-engineering session against the 2026 web bundle (full findings: docs/reverse-engineering.md).

TypeScript + Node.js (@modelcontextprotocol/sdk), stdio transport, no native dependencies. Auth is a browser session cookie, so the server sees exactly what the signed-in web app sees: every project, task, tag, habit and calendar.

Why not the Open API

TickTick publishes /open/v1 (see docs/open-api.md). It is Bearer-authenticated, stable, and tiny — no tags, no search, no habits, no calendar, no trash, no batch delete. The private /api/v2 + /api/v3 surface this server uses has ~164 usable endpoints on a real account (measured — see the findings doc). The trade-off is honesty: those endpoints are undocumented and move with the web app.

Related MCP server: tick-mcp

Tools

34 tools. Every one below was exercised against a live account during development.

Tool

What it does

list_tasks

Tasks in a project (projectId: "inbox" resolves the inbox)

get_task

A single task by id

create_task

Create a task (title, dates, priority, tags, recurrence, subtasks)

update_task

Patch fields on a task

complete_task / uncomplete_task

Set status 2 / 0

delete_task

Trash a task, or forever: true to hard-delete

move_task

Move a task between projects

list_completed_tasks

Completed tasks by date range, one project or all

list_trash / restore_task

Trash listing and restore

batch_tasks

Add/update/delete many tasks at once¹

search_tasks

Full-text search

list_projects / get_project

Projects (lists)

create_project / update_project / delete_project

Project lifecycle

list_tags / rename_tag / merge_tags / delete_tag

Tags

list_columns

Kanban columns

get_current_user

Profile: id, inbox id, plan

sync_check

Offline-first delta pull of the whole account

get_preferences

User preferences

list_templates / list_countdowns

Templates, countdowns

list_habits / list_habit_sections / query_habit_checkins

Habits

list_calendar_accounts / list_calendar_subscriptions / list_calendar_events

Calendars

¹ Some accounts are gated: POST /api/v2/batch/task answers 403 access_forbidden. The tool reports that plainly instead of hiding it.

Install

npm install -g @powercess/ticktick-mcp     # or: npx @powercess/ticktick-mcp

From a source checkout:

npm install
npm run build
npm test                                   # hermetic unit tests, no credentials
node scripts/smoke-client.mjs list_projects '{}'

Configure as an MCP server:

{
  "mcpServers": {
    "ticktick": {
      "command": "npx",
      "args": ["-y", "@powercess/ticktick-mcp"],
      "env": {
        "TICKTICK_COOKIE": "t=<session cookie>; _csrf_token=<csrf>; ap_user_id=<id>"
      }
    }
  }
}

Authentication

Two credential types, auto-detected from shape — no mode flag needed:

Credential

Env var

API surface

Tools

Web session cookie

TICKTICK_COOKIE

private /api/v2 + /api/v3

all 36

Personal API token (tp_…)

TICKTICK_API_TOKEN

official /open/v1

~28 (stable subset)

Precedence: tool argument → environment → ~/.ticktick-mcp/credentials.json.

Grab it from a logged-in browser — DevTools → Network → any api.ticktick.com request → Request Headers → cookie — and pass the whole value.

{
  "mcpServers": {
    "ticktick": {
      "command": "npx",
      "args": ["-y", "@powercess/ticktick-mcp"],
      "env": {
        "TICKTICK_COOKIE": "t=<session cookie>; _csrf_token=<csrf>; ap_user_id=<id>"
      }
    }
  }
}

Create one in the web app: Settings → Account → API Token → Create. Long-lived, no 2FA prompt, no browser required.

{
  "mcpServers": {
    "ticktick": {
      "command": "npx",
      "args": ["-y", "@powercess/ticktick-mcp"],
      "env": {
        "TICKTICK_API_TOKEN": "tp_<your token>"
      }
    }
  }
}

Token mode covers projects, tasks (CRUD, complete, move, batch, completed, search), tags, columns, habits, focus, countdowns and project groups — about 28 of the 36 tools. Web-only tools (sync_check, trash, templates, calendar, preferences, tag rename/merge/delete) return a clear error explaining that a cookie session is needed.

See docs/authentication.md for the full walkthrough, Dida365 setup and every supported input.

Layout

src/config.ts      credential resolution (env → file), site selection
src/client.ts      HTTP client: cookie + x-csrftoken, JSON, typed errors
src/api.ts         endpoint functions (sync, projects, tasks, tags, habits, calendar)
src/errors.ts      TickTickError + human-readable formatting
src/tools/*.ts     MCP tool surface (tasks, projects, account)
src/index.ts       server bootstrap
scripts/           smoke-client.mjs
test/              node:test suites (hermetic)
docs/              reverse-engineering findings, auth guide, Open API notes

Limitations (honest)

  • Undocumented and unstable. These endpoints are what the web app happens to call today; TickTick can change them without notice. The sync_check checkpoint format and the x-csrftoken requirement are reverse-engineered, not promised.

  • Session cookies expire. There is no OAuth refresh here — when the cookie dies, refresh it by hand. (The official Open API is the right choice if you need long-lived tokens.)

  • Batch writes are account-gated. batch_tasks may 403 on your account.

  • Not every endpoint is wired. ~164 are usable; the tools cover the common read/write surface. Rarer ones (team collaboration, calendar OAuth handshakes, MFA, account merge) are deliberately out of scope — see the findings doc.

  • A few endpoints need a full object, not a patch. update_project merges the current project before writing for exactly this reason.

  • No rate-limit handling. TickTick may throttle; the server surfaces the error.

Privacy

The session cookie is a live credential for the whole account. It lives in ~/.ticktick-mcp/credentials.json (mode 0600, gitignored) or the environment, never in the package directory. Captured traffic, cookies and account ids are never committed. Revoke by logging out of the web app (or rotating the session).

License

MIT

Available Tools

38 tools
batch_tasksA

Creates, updates and/or deletes many tasks in one request. Note: some accounts are gated and receive 403 for batch writes.

Inputs: add, delete, update.

complete_taskB

Marks a task as completed (status=2).

Inputs: taskId (required), projectId (required).

create_focusB

Creates a focus (pomodoro) record. API-token mode only.

Inputs: body (required).

create_projectC

Creates a project (list).

Inputs: name (required), kind, color, viewMode.

create_taskC

Creates a task in a project.

Inputs: title (required), projectId (required), desc, tags, +11 more.

delete_projectB

Deletes a project. This is destructive and not reversible.

Inputs: projectId (required).

delete_tagB

Deletes a tag. Web mode only.

Inputs: name (required).

delete_taskA

Deletes a task. By default it moves to the trash; set forever: true to permanently delete it (must already be trashed).

Inputs: taskId (required), projectId (required), forever.

get_current_userA

Gets the signed-in user's profile. In web mode returns id, inbox id, plan and registration info; in API-token mode returns the account time zone preference.

Inputs: no named parameters.

get_preferencesB

Gets user preferences (matrix rules, quick-add, etc.). Web mode only.

Inputs: no named parameters.

get_projectB

Gets a single project by id.

Inputs: projectId (required).

get_project_with_dataC

Gets a project with its tasks and columns.

Inputs: projectId (required).

get_taskC

Gets a single task by id.

Inputs: taskId (required), projectId (required).

list_calendar_accountsA

Lists connected third-party calendar accounts. Web mode only.

Inputs: no named parameters.

list_calendar_eventsB

Lists events bound from connected calendars. Web mode only.

Inputs: no named parameters.

list_calendar_subscriptionsA

Lists calendar subscriptions. Web mode only.

Inputs: no named parameters.

list_columnsA

Lists kanban columns for a project (or all columns in web mode).

Inputs: projectId.

list_completed_tasksA

Lists completed tasks within a date range, for one project or across all projects.

Inputs: to, from, limit, projectId, +1 more.

list_countdownsC

Lists countdowns. Works in both modes.

Inputs: no named parameters.

list_focusA

Lists focus (pomodoro) records. API-token mode only.

Inputs: no named parameters.

list_habitsC

Lists habits. Works in both modes.

Inputs: no named parameters.

list_habit_sectionsB

Lists habit sections (groups). Works in both modes.

Inputs: no named parameters.

list_project_groupsA

Lists project groups. API-token mode only.

Inputs: no named parameters.

list_projectsA

Lists all projects (lists) for the signed-in user. Works in both cookie and API-token mode.

Inputs: no named parameters.

list_tagsB

Lists all tags. Works in both modes.

Inputs: no named parameters.

list_tasksB

Lists the tasks in a project. Use projectId: "inbox" to target the signed-in user's inbox.

Inputs: projectId (required), includeCompleted.

list_templatesA

Lists task templates. Web mode only.

Inputs: no named parameters.

list_trashB

Lists trashed tasks.

Inputs: type, limit.

merge_tagsB

Merges one tag into another. Web mode only.

Inputs: name (required), toName (required).

move_taskC

Moves a task from one project to another.

Inputs: taskId (required), toProjectId (required), fromProjectId (required).

query_habit_checkinsA

Queries habit check-in records. Web mode takes { habitIds, from, to }; API-token mode takes no args.

Inputs: to, from, habitIds.

rename_tagC

Renames a tag. Web mode only.

Inputs: name (required), newName (required).

restore_taskC

Restores a task from the trash.

Inputs: taskId (required), projectId (required).

search_tasksB

Full-text search across tasks, comments and other content.

Inputs: query (required).

sync_checkA

Offline-first delta pull of the whole account (web mode only): tasks, projects, tags and columns. Pass checkPoint=0 for a full snapshot, then reuse the returned checkPoint for incremental pulls.

Inputs: checkPoint.

uncomplete_taskB

Reopens a completed task (status=0).

Inputs: taskId (required), projectId (required).

update_projectC

Updates a project's name, color, view mode or kind.

Inputs: projectId (required), kind, name, color, +3 more.

update_taskA

Updates fields on an existing task. Only the supplied fields change.

Inputs: taskId (required), projectId (required), desc, tags, +12 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 38 tools

    Disambiguation4/5

    Most tools target a distinct resource+action (e.g. list_projects vs get_project vs get_project_with_data), and descriptions clarify subtle overlaps. Slight confusion remains between batch_tasks and the individual task CRUD tools, and between list_focus/create_focus and the broader list_* read-only tools, but boundaries are mostly clear.

    Naming Consistency4/5

    Names overwhelmingly follow a consistent snake_case verb_noun pattern (list_projects, create_task, update_task, delete_task, complete_task, move_task, etc.). Minor deviations like sync_check (noun_verb) and get_project_with_data (verb_noun_phrase) prevent a perfect score.

    Tool Count3/5

    38 tools is heavy, though the breadth of the TickTick domain (tasks, projects, tags, habits, focus, calendar, templates, countdowns, sync) distributes them across many resources. Several tools are narrow single-purpose read operations, making the surface feel somewhat bloated.

    Completeness3/5

    Task and project CRUD/lifecycle coverage is strong, but several domains are read-only with obvious gaps: tags have rename/merge/delete but no create_tag; habits, calendar, templates, countdowns and preferences lack create/update/delete operations. These gaps would force agents to work around missing operations.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI assistants to directly manage Dida365 (TickTick) tasks, including creating, editing, completing, and setting priorities, deadlines, subtasks, reminders, and recurring tasks via natural language.
      8
      MIT