TickTick MCP Server
Integrates with TickTick to manage tasks, projects, habits, focus time, tags, kanban columns, project folders, and completed tasks. Provides tools for CRUD operations, smart queries, search, filtering, GTD workflows, habit check-ins, pomodoro heatmaps, and more.
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 Server show my tasks due today"
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 Server
An MCP server that lets your AI assistant manage your TickTick tasks, projects, habits, and more through natural language. Works with Claude Code, Cursor, VS Code, Claude Desktop, and any MCP-compatible client.
Also supports Dida365 (the Chinese version of TickTick).
Features
52 tools across two API layers:
Category | Tools | API |
Projects | List, create, update, delete | V1 |
Tasks | CRUD, batch create, complete, subtasks | V1 |
Smart Queries | Due today/tomorrow/this week, overdue, by priority | V1 |
Search & Filter | Full-text search, multi-criteria filtering | V1 |
GTD Workflows | Engaged tasks, next actions, daily digest | V1 |
Tags | List, create, rename, delete, merge | V2 |
Habits | Create, check-in, view streaks and history | V2 |
Focus / Pomodoro | Heatmaps, time distribution, productivity score | V2 |
Completed Tasks | Browse finished tasks with date filtering | V2 |
Kanban Columns | Manage columns in kanban projects | V2 |
Project Folders | Organize projects into groups | V2 |
Task Organization | Move tasks between projects, subtask hierarchy | V2 |
User Profile | Profile info, timezone, settings | V2 |
V1 = Official TickTick Open API (OAuth2). V2 = Internal API (session auth) for features not in the public API.
Related MCP server: dida365-agent
Setup
1. Create a TickTick Developer App
Click + Create App
Set Redirect URI to:
http://localhost:42813/callbackNote your Client ID and Client Secret
2. Install and Authenticate
git clone https://github.com/chrisvanek/ticktick-mcp-ratv.git
cd ticktick-mcp-ratv
npm install && npm run build
# Run the interactive setup wizard
node build/index.js authThe wizard guides you through:
TickTick login (email + password) — enables V2 features (tags, habits, focus, completed tasks)
OAuth2 flow (Client ID + Secret + browser auth) — enables V1 features (projects, tasks)
Credentials are saved to a local .env file (excluded from git).
3. Connect to Your AI Client
Add the server to your MCP client config. Replace the placeholder values with the credentials from your .env file.
CLI (recommended):
claude mcp add ticktick-mcp-server \
node /absolute/path/to/ticktick-mcp-ratv/build/index.js \
-e TICKTICK_CLIENT_ID=your_client_id \
-e TICKTICK_CLIENT_SECRET=your_client_secret \
-e TICKTICK_ACCESS_TOKEN=your_access_token \
-e TICKTICK_REFRESH_TOKEN=your_refresh_token \
-e TICKTICK_USERNAME=your_email \
-e TICKTICK_PASSWORD=your_password \
-e TICKTICK_DEVICE_ID=your_device_id \
-s userUse -s user (available everywhere), -s project (shared with team), or -s local (single project).
Config file (~/.claude.json or .mcp.json):
{
"mcpServers": {
"ticktick": {
"command": "node",
"args": ["/absolute/path/to/ticktick-mcp-ratv/build/index.js"],
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_REFRESH_TOKEN": "your_refresh_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password",
"TICKTICK_DEVICE_ID": "your_device_id"
}
}
}
}Verify with /mcp in Claude Code.
Create or edit ~/.cursor/mcp.json (global) or .cursor/mcp.json (project):
{
"mcpServers": {
"ticktick": {
"command": "node",
"args": ["/absolute/path/to/ticktick-mcp-ratv/build/index.js"],
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_REFRESH_TOKEN": "your_refresh_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password",
"TICKTICK_DEVICE_ID": "your_device_id"
}
}
}
}Restart Cursor after saving.
Requires VS Code 1.99+ with GitHub Copilot. Create .vscode/mcp.json:
{
"servers": {
"ticktick": {
"command": "node",
"args": ["/absolute/path/to/ticktick-mcp-ratv/build/index.js"],
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_REFRESH_TOKEN": "your_refresh_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password",
"TICKTICK_DEVICE_ID": "your_device_id"
}
}
}
}Edit the config file:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%AppData%\Claude\claude_desktop_config.json
{
"mcpServers": {
"ticktick": {
"command": "node",
"args": ["/absolute/path/to/ticktick-mcp-ratv/build/index.js"],
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_REFRESH_TOKEN": "your_refresh_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password",
"TICKTICK_DEVICE_ID": "your_device_id"
}
}
}
}Quit and relaunch Claude Desktop (Cmd+Q / Alt+F4).
Open the Cline panel > MCP Servers icon > Configure, then add:
{
"mcpServers": {
"ticktick": {
"command": "node",
"args": ["/absolute/path/to/ticktick-mcp-ratv/build/index.js"],
"env": {
"TICKTICK_CLIENT_ID": "your_client_id",
"TICKTICK_CLIENT_SECRET": "your_client_secret",
"TICKTICK_ACCESS_TOKEN": "your_access_token",
"TICKTICK_REFRESH_TOKEN": "your_refresh_token",
"TICKTICK_USERNAME": "your_email",
"TICKTICK_PASSWORD": "your_password",
"TICKTICK_DEVICE_ID": "your_device_id"
}
}
}
}Dida365 (China)
Add TICKTICK_HOST=dida365 to your environment variables. This routes API calls to api.dida365.com.
Node Version Managers (nvm, fnm, etc.)
If node doesn't resolve in your MCP client, use the full path:
"command": "/Users/you/.nvm/versions/node/v22.0.0/bin/node"Usage Examples
Once connected, just talk naturally. Here are examples organized by what you can do:
Morning Planning
"Give me my daily summary"
"What's overdue?"
"What do I have due this week?"
"Show me all high priority tasks"
Creating Tasks
"Create a task called 'Review PR #42' in my Work project, due tomorrow, high priority"
"Add a task 'Buy groceries' to Personal with subtasks: milk, eggs, bread, butter"
"Create a recurring task 'Weekly standup notes' every Monday in my Work project"
"Create these tasks in my Work project: Review design mockups, Update API docs, Fix login bug"
Managing Tasks
"Mark the 'Send invoice' task as complete"
"Move 'Design review' to my Work project"
"Make 'Write tests' a subtask of 'Ship v2'"
"What tasks did I complete last week?"
Search & Filter
"Search for any tasks mentioning 'budget'"
"Show me all medium priority tasks"
"What tasks are due in the next 3 days?"
"Show me all tasks in my Personal project that have a due date"
Projects
"List all my projects"
"Create a new project called 'Q2 Goals' with a kanban view"
"Show me everything in my Work project — tasks, columns, the works"
Tags
"Show me all my tags"
"Create a tag called 'urgent' with a red color"
"Rename the 'bug' tag to 'bugfix'"
"Merge the 'todo' tag into 'backlog'"
Habits
"What habits do I have?"
"Check in my 'Drink water' habit for today"
"Create a habit called 'Read' with a goal of 30 pages per day"
"Show my check-in history for all habits since January"
Focus & Productivity
"Show my focus time heatmap for this month"
"How is my focus time distributed across tags?"
"What are my productivity stats?"
Organization
"List my project folders"
"Create a folder called 'Side Projects'"
"Show the kanban columns in my Sprint project"
"What's in my trash?"
Environment Variables
Variable | Required | Description |
| Yes | OAuth2 Client ID from developer portal |
| Yes | OAuth2 Client Secret |
| Yes | OAuth2 access token (set by auth wizard) |
| No | OAuth2 refresh token (enables auto-renewal) |
| Yes | Your TickTick email (for V2 API) |
| Yes | Your TickTick password (for V2 API) |
| Recommended | Stable 24-char hex device id for the V2 |
| No |
|
Security note: The V2 API requires your TickTick username and password. These are stored as environment variables and never logged or transmitted anywhere except directly to TickTick's authentication endpoint. The
.envfile is created with restricted permissions (owner-only read/write).
About
TICKTICK_DEVICE_ID: The V2 internal API authenticates a "device" via thex-devicerequest header. If the device id is empty or unrecognized, TickTick rejects the login with a misleadingusername_password_not_matcherror — even when your credentials are correct. The server sends a non-empty device id to avoid this. If you don't setTICKTICK_DEVICE_ID, a random 24-character hex id is generated automatically on each launch; setting a stable value is recommended so TickTick doesn't treat every restart as a brand-new device. Any 24-char hex string works — or reuse the id your TickTick web client already uses (browser DevTools → Application → Local Storage →deviceAnalyticsData.id).
All 52 Tools
Tool | Description |
| List all projects |
| Get a project by ID |
| Get project with tasks and columns |
| Create a project |
| Update project properties |
| Delete a project |
Tool | Description |
| Get a task by ID |
| Create a task with all options |
| Update task fields |
| Mark a task as done |
| Delete a task |
| Create multiple tasks at once |
Tool | Description |
| All undone tasks across all projects |
| Full-text search |
| Tasks due today |
| Tasks due tomorrow |
| Tasks due in 7 days |
| Tasks due in N days |
| Overdue tasks |
| Filter by priority |
| Advanced multi-criteria filter |
| GTD "Engage" list |
| GTD "Next" list |
| Full daily digest |
Tool | Description |
| List all tags |
| Create a tag |
| Rename a tag |
| Delete a tag |
| Merge one tag into another |
Tool | Description |
| List all habits |
| Get habit sections |
| Create a habit |
| Delete a habit |
| Check in to a habit |
| View check-in history |
Tool | Description |
| Focus time heatmap |
| Focus distribution by category |
| Productivity score and stats |
Tool | Description |
| Browse completed tasks |
| View deleted tasks |
Tool | Description |
| Move task to a different project |
| Set/remove subtask relationship |
Tool | Description |
| List kanban columns |
| Create a column |
| Delete a column |
| Move a task to another kanban column |
| List project folders |
| Create a folder |
| Delete a folder |
| Move a list into/out of a folder |
Tool | Description |
| Profile, email, timezone, subscription |
| Account preferences |
Reference
Task priority values: 0 = None, 1 = Low, 3 = Medium, 5 = High
Date format: yyyy-MM-dd'T'HH:mm:ssZ (e.g. 2025-03-15T09:00:00+0000)
Recurrence rules: Standard RRULE format (e.g. RRULE:FREQ=DAILY;INTERVAL=1)
Development
npm install # Install dependencies
npm run build # Compile TypeScript
npm run dev # Watch mode
npm run clean # Remove build outputAdding a Tool
Add your tool in the appropriate file under
src/tools/Use
server.registerTool()with a Zod input schemaIt's automatically available to all MCP clients
Architecture
src/
├── index.ts # Entry point + auth CLI routing
├── config.ts # Environment variable loader
├── client.ts # V1 API client (OAuth2)
├── client-v2.ts # V2 API client (session auth)
├── types.ts # TypeScript interfaces
├── auth-cli.ts # Interactive auth wizard
├── auth/oauth.ts # OAuth2 flow implementation
└── tools/
├── project-tools.ts # Project CRUD (V1)
├── task-tools.ts # Task CRUD (V1)
├── smart-tools.ts # Smart queries & GTD (V1)
├── tag-tools.ts # Tag management (V2)
├── habit-tools.ts # Habit tracking (V2)
├── focus-tools.ts # Focus/Pomodoro stats (V2)
├── column-tools.ts # Kanban columns (V2)
├── folder-tools.ts # Project folders (V2)
└── v2-task-tools.ts # Completed tasks, move, user (V2)Both API clients handle auth transparently — expired tokens are refreshed automatically on 401 responses.
Troubleshooting
Problem | Fix |
"Missing required environment variable" | Run |
"Token refresh failed" / 401 errors | Re-run |
Server not showing in Claude Code | Use absolute paths, check with |
Server not showing in Cursor | Restart Cursor, check Output panel > MCP |
Contributing
Fork the repo
Create a feature branch
Make your changes and run
npm run buildOpen a pull request
License
MIT — see LICENSE.
Acknowledgments
Available Tools
52 toolsticktick_batch_create_tasksBatch Create TasksB
Create multiple tasks at once. Each task requires a title and project_id.
Inputs: tasks (required).
ticktick_checkin_habitCheck In HabitB
Record a check-in for a habit on a specific date. Use today's date in YYYYMMDD format by default.
Inputs: date (required), habit_id (required), value.
ticktick_complete_taskComplete TaskB
Mark a task as completed.
Inputs: task_id (required), project_id (required).
ticktick_create_columnCreate Kanban ColumnA
Add a new column to a kanban-view project.
Inputs: name (required), project_id (required), sort_order.
ticktick_create_habitCreate HabitA
Create a new habit. Set a name, optional goal, unit, frequency, color, and encouragement message.
Inputs: name (required), goal, step, unit, +4 more.
ticktick_create_projectCreate ProjectB
Create a new project (list) in TickTick. You can specify the name, color, view mode (list/kanban/timeline), and kind (TASK/NOTE).
Inputs: name (required), kind, color, view_mode.
ticktick_create_project_folderCreate Project FolderB
Create a new folder to organize projects.
Inputs: name (required), sort_order.
ticktick_create_tagCreate TagA
Create a new tag with an optional color.
Inputs: name (required), color.
ticktick_create_taskCreate TaskA
Create a new task in TickTick. Requires a title and project ID. Optionally set content, dates, priority (0=None, 1=Low, 3=Medium, 5=High), reminders, recurring rules, and subtasks.
Inputs: title (required), project_id (required), desc, items, +9 more.
ticktick_daily_summaryDaily SummaryA
Get a productivity digest: overdue tasks, tasks due today, tasks due tomorrow, and high-priority items. Great for morning planning.
Inputs: no named parameters.
ticktick_delete_columnDelete Kanban ColumnB
Delete a column from a kanban-view project.
Inputs: column_id (required), project_id (required).
ticktick_delete_habitDelete HabitA
Delete a habit by its ID. This cannot be undone.
Inputs: habit_id (required).
ticktick_delete_projectDelete ProjectA
Permanently delete a project and all its tasks. This cannot be undone.
Inputs: project_id (required).
ticktick_delete_project_folderDelete Project FolderA
Delete a project folder. Projects inside will be ungrouped, not deleted.
Inputs: folder_id (required).
ticktick_delete_tagDelete TagA
Delete a tag. Tasks with this tag will have it removed.
Inputs: name (required).
ticktick_delete_taskDelete TaskA
Permanently delete a task. This cannot be undone.
Inputs: task_id (required), project_id (required).
ticktick_filter_tasksFilter TasksA
Advanced task filtering. Combine multiple criteria: project, priority, date ranges, text search. All filters are AND-combined.
Inputs: text, priority, due_after, due_before, +2 more.
ticktick_get_all_tasksGet All TasksA
Get all undone tasks across every active project. Useful for building a full picture of your task list.
Inputs: no named parameters.
ticktick_get_columnsGet Kanban ColumnsA
List all Kanban columns for a project. Only applicable to projects using kanban view mode.
Inputs: project_id (required).
ticktick_get_completed_tasksGet Completed TasksA
Get tasks that have been completed. Optionally filter by date range. Great for reviewing what you've accomplished.
Inputs: to, from, limit.
ticktick_get_engaged_tasksGTD: Engaged TasksA
Get tasks that need immediate engagement: high priority (5), overdue, or due today. Based on GTD methodology.
Inputs: no named parameters.
ticktick_get_focus_distributionFocus Time DistributionB
Get how your focus time is distributed across tags/categories over a date range.
Inputs: to (required), from (required).
ticktick_get_focus_heatmapFocus Time HeatmapA
Get a heatmap of your focus/pomodoro time over a date range. Shows daily focus totals including pomodoro and stopwatch time.
Inputs: to (required), from (required).
ticktick_get_habit_checkinsGet Habit Check-in HistoryA
Get check-in records for one or more habits from a specific date onward.
Inputs: habit_ids (required), after_date (required).
ticktick_get_habitsList HabitsA
List all habits in your TickTick account, including name, frequency, goal, and streak info.
Inputs: no named parameters.
ticktick_get_habit_sectionsGet Habit SectionsA
Get habit sections (Morning, Afternoon, Evening, etc.) and which habits belong to each.
Inputs: no named parameters.
ticktick_get_next_tasksGTD: Next TasksA
Get tasks that are up next: medium priority (3) or due tomorrow. Based on GTD methodology.
Inputs: no named parameters.
ticktick_get_overdue_tasksOverdue TasksA
Get all tasks that are past their due date. These need immediate attention.
Inputs: no named parameters.
ticktick_get_productivity_statsProductivity StatsA
Get your overall productivity statistics: tasks completed, tasks created, pomodoro count, habit check-ins, and productivity score.
Inputs: no named parameters.
ticktick_get_projectGet ProjectA
Get details for a specific project by its ID. Returns project metadata including name, color, view mode, and permissions.
Inputs: project_id (required).
ticktick_get_project_dataGet Project with TasksA
Get a project along with all its undone tasks and Kanban columns. Useful for seeing the full state of a project.
Inputs: project_id (required).
ticktick_get_project_foldersList Project FoldersA
List all project folders (groups) used to organize projects in TickTick.
Inputs: no named parameters.
ticktick_get_projectsList ProjectsA
List all projects (lists) in the user's TickTick account. Returns project IDs, names, colors, view modes, and whether they are closed.
Inputs: no named parameters.
ticktick_get_tagsList TagsA
List all tags in your TickTick account. Returns tag names, colors, and sort order.
Inputs: no named parameters.
ticktick_get_taskGet TaskA
Retrieve a specific task by its project ID and task ID. Returns full task details including subtasks, dates, priority, and content.
Inputs: task_id (required), project_id (required).
ticktick_get_tasks_by_priorityTasks by PriorityA
Get all tasks filtered by a specific priority level. Priority values: 0=None, 1=Low, 3=Medium, 5=High.
Inputs: priority (required).
ticktick_get_tasks_due_in_daysTasks Due in N DaysB
Get all tasks due within the next N days.
Inputs: days (required).
ticktick_get_tasks_due_this_weekTasks Due This WeekA
Get all tasks due within the next 7 days.
Inputs: no named parameters.
ticktick_get_tasks_due_todayTasks Due TodayA
Get all tasks that are due today. Helps you focus on what needs to get done right now.
Inputs: no named parameters.
ticktick_get_tasks_due_tomorrowTasks Due TomorrowA
Get all tasks that are due tomorrow.
Inputs: no named parameters.
ticktick_get_trashed_tasksGet Trashed TasksA
Get tasks that have been deleted/trashed. Useful for recovering accidentally deleted items.
Inputs: limit, start.
ticktick_get_user_profileGet User ProfileA
Get your TickTick user profile including name, email, timezone, inbox ID, and subscription status.
Inputs: no named parameters.
ticktick_get_user_settingsGet User SettingsA
Get your TickTick account settings and preferences (timezone, start of week, etc.).
Inputs: no named parameters.
ticktick_merge_tagsMerge TagsA
Merge one tag into another. All tasks with the source tag will be re-tagged with the destination tag.
Inputs: to_tag (required), from_tag (required).
ticktick_move_project_to_folderMove List into FolderA
Move a project (list) into a folder, or remove it from its folder. Pass a folder_id to move it in; pass an empty string (or "NONE") to take it out of any folder. Use ticktick_get_project_folders to find folder IDs.
Inputs: folder_id (required), project_id (required).
ticktick_move_taskMove Task to ProjectB
Move a task from one project to another.
Inputs: task_id (required), to_project_id (required), from_project_id (required).
ticktick_move_task_to_columnMove Task to Kanban ColumnA
Move a task into a different Kanban column within its project. Use ticktick_get_columns to find the destination column ID. The task keeps all its other fields.
Inputs: task_id (required), column_id (required).
ticktick_rename_tagRename TagA
Rename an existing tag. All tasks with this tag will be updated.
Inputs: new_name (required), old_name (required).
ticktick_search_tasksSearch TasksA
Search for tasks by text. Matches against task title, content, and subtask titles across all active projects.
Inputs: query (required).
ticktick_set_task_parentSet Task Parent (Subtask)A
Make a task a subtask of another task by setting its parent. Pass an empty parent_id to remove the parent relationship.
Inputs: task_id (required), parent_id (required), project_id (required).
ticktick_update_projectUpdate ProjectA
Update an existing project's properties. You can change the name, color, view mode, or kind.
Inputs: project_id (required), kind, name, color, +1 more.
ticktick_update_taskUpdate TaskA
Update an existing task. Both task_id and project_id are required. Only the fields you provide will be changed.
Inputs: task_id (required), project_id (required), desc, items, +10 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 52 tools
There are many task-fetching tools with similar boundaries (due today, due tomorrow, due this week, due in N days, overdue, by priority, engaged, next, daily summary), so an agent could easily pick the wrong one. Detailed descriptions help separate them, but the overlap is noticeable, and get_project vs get_project_data adds further ambiguity.
All tools share the ticktick_ prefix and use snake_case with mostly verb_noun naming like get_tasks, create_task, update_project, delete_tag. Minor deviations such as daily_summary, filter_tasks, checkin_habit, and move_task_to_column are still readable and predictable, so the naming is mostly consistent.
Fifty-two tools is far beyond the typical well-scoped MCP server, and the count feels inflated by many overlapping task-query variants. While TickTick is a feature-rich app, this tool surface is heavy and would benefit from consolidation or more granular grouping.
Core CRUD workflows for projects, tasks, tags, columns, and folders are mostly present, and there are rich query options for tasks. However, notable lifecycle gaps exist: habits cannot be updated, trashed tasks cannot be restored despite being fetched for recovery, and columns/folders have no update/rename operations.
Maintenance
Related MCP Connectors
Official Todoist MCP server. Manage tasks and projects. Hosted, no API key needed.
MCP server for AI dialogue using various LLM models via AceDataCloud
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
ADHD-friendly task management MCP server for ChaTodo: organize tasks, lists, and priorities.
Related MCP Servers
- AlicenseAqualityDmaintenanceA Model Context Protocol (MCP) server that connects AI assistants to your TickTick tasks, enabling task management through natural language.81MIT
- AlicenseBqualityFmaintenanceMCP server that enables AI agents to manage Dida365/TickTick tasks, projects, tags, and habits through natural language, with full CRUD, search, and advanced V2 capabilities.192MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for TickTick/Dida365 task integration, enabling AI-driven task decomposition and management with automated OAuth authentication.10MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that connects AI assistants to TickTick, enabling project and task management through natural language, including reading projects, finding tasks, creating tasks, and completing work.2MIT