ticktick-mcp
This is an MCP server for TickTick / Dida365 that talks to the private web API, exposing 34 tools for managing tasks, projects, tags, habits, and calendars from a chat client.
Tasks: list, get, create, update, complete/uncomplete, delete (trash or hard-delete), move between projects, batch add/update/delete, full-text search, list completed by date range, and trash listing/restore.
Projects: list, get, create, update (name, color, view mode, kind, closed, sort order), delete.
Tags: list, rename, merge, delete.
Account & sync: current user profile (id, inbox, plan), preferences, full-account delta sync via checkpoints, kanban columns, templates, countdowns.
Habits: list habits and sections, query check-ins over a date range.
Calendars: list connected accounts, subscriptions, and events.
Auth: works with a browser session cookie (all tools, private /api/v2 + /api/v3) or a personal API token
tp_…(stable /open/v1 subset, ~28 tools); resolution is tool arg → env → credentials file.Caveats: undocumented endpoints that can change, expiring cookies with no OAuth refresh,
batch_tasksmay 403 on some accounts, web-only tools error out in token mode, no rate-limit handling.
Integrates with TickTick / 滴答清单 (and Dida365 / 滴答清单 CN) through the private web API, providing tools to manage tasks, projects, tags, habits, calendars, completed tasks, trash, templates, countdowns, and search, including batch task operations and full-account sync.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ticktick-mcp add a task called buy groceries due tomorrow at 5pm"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 |
| Tasks in a project ( |
| A single task by id |
| Create a task (title, dates, priority, tags, recurrence, subtasks) |
| Patch fields on a task |
| Set status 2 / 0 |
| Trash a task, or |
| Move a task between projects |
| Completed tasks by date range, one project or all |
| Trash listing and restore |
| Add/update/delete many tasks at once¹ |
| Full-text search |
| Projects (lists) |
| Project lifecycle |
| Tags |
| Kanban columns |
| Profile: id, inbox id, plan |
| Offline-first delta pull of the whole account |
| User preferences |
| Templates, countdowns |
| Habits |
| 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-mcpFrom 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 |
| private | all 36 |
Personal API token ( |
| official | ~28 (stable subset) |
Precedence: tool argument → environment → ~/.ticktick-mcp/credentials.json.
Web session cookie (full feature set)
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>"
}
}
}
}Personal API token (no cookie, stable)
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 notesLimitations (honest)
Undocumented and unstable. These endpoints are what the web app happens to call today; TickTick can change them without notice. The
sync_checkcheckpoint format and thex-csrftokenrequirement 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_tasksmay 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_projectmerges 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 toolsbatch_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
Scored across 38 tools
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.
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.
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.
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
Related MCP Connectors
Manage tasks, Focus Zone, notes, projects, and task history from compatible AI assistants.
AI-powered to-do list: add, list, complete and organise tasks across lists from any assistant.
Task management for people and AI agents, with scoped OAuth access to issues, projects, and docs.
Task management for people and AI agents, with scoped OAuth access to issues, projects, and docs.
Related MCP Servers
- FlicenseDqualityDmaintenanceProvides tools for AI assistants to interact with the Dida365 (TickTick) task management API, allowing management of tasks and projects after user authorization.592 npm2-
- AlicenseAqualityDmaintenanceEnables AI assistants to manage TickTick tasks, projects, habits, tags, and focus stats using 71 tools via the Model Context Protocol.711MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage TickTick tasks through natural language, including creating, updating, completing, and deleting tasks, as well as managing projects.14MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to directly manage Dida365 (TickTick) tasks, including creating, editing, completing, and setting priorities, deadlines, subtasks, reminders, and recurring tasks via natural language.8MIT