ticktick-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| TICKTICK_PASSWORD | Yes | TickTick login password (or app password if enabled) | |
| TICKTICK_USERNAME | Yes | TickTick login email | |
| TICKTICK_CLIENT_ID | Yes | Client ID obtained from TickTick App registration | |
| TICKTICK_REDIRECT_URI | Yes | OAuth redirect URI that matches the one registered in TickTick | |
| TICKTICK_CLIENT_SECRET | Yes | Client Secret obtained from TickTick App registration | |
| TICKTICK_MCP_DOTENV_DIR | No | Optional path to directory containing .env file |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ticktick_filter_tasksA | Return the tasks matching every supplied filter criterion. Supports any combination of project, priority, tag, status, and a date window applied to either the due date (open tasks) or the completion timestamp (completed tasks). Args:
detail (str, optional): Returns:
JSON list of matching task objects (compact by default; see
Freshness:
Uncompleted queries read local state, synced from the server at most
once per throttle window (default 15s,
Limitations:
- TickTick caps Agent Usage Guide:
- List open tasks in a project:
|
| ticktick_get_unprocessed_completionsA | Returns completed tasks for a project that have NOT yet been marked as processed by a domain agent. Could be called at the beginning of each conversation to check for new completions. After reviewing each returned task, call ticktick_mark_completion_processed to record that it has been handled. A task completed through ticktick_complete_task is recorded by that tool, so what this returns is what was completed elsewhere, in the TickTick app or on another client, where a note may be waiting to be read. One exception: no recurring completion is recorded, because it files its completed instance under an id the completing call never sees, so that instance appears here whoever completed it. Args: project_id (str): TickTick project ID or name to check. Required. Accepts the project's name as well as its ID (case-insensitive, trimmed; "Inbox" resolves to the inbox). Two projects sharing a name is an error, not a guess. days (int): How many days back to look for completions. Default 30. Returns: JSON list of unprocessed task objects (may be empty). Each object includes: id, title, projectId, completedTime, content. Error: {"error": "...", "status": "error"} Usage Guide: - Call once per project at the start of each conversation. - For each returned task: read the content field, log meaningful outcomes if appropriate, then call ticktick_mark_completion_processed. - Example: ticktick_get_unprocessed_completions( project_id="your_project_id_here", days=30 ) |
| ticktick_mark_completion_processedA | Records that a domain agent has processed a completed task. Call this after reviewing each task returned by ticktick_get_unprocessed_completions. The task will no longer appear in future calls to that tool. Args: task_id (str): Full TickTick task ID. Required. project_id (str): Project ID or name the task belongs to. Required. Accepts the project's name as well as its ID (case-insensitive, trimmed; "Inbox" resolves to the inbox). Two projects sharing a name is an error, not a guess. title (str, optional): Task title (stored for human-readable audit trail). completed_time (str, optional): ISO completion timestamp from the task object. notes (str, optional): Brief notes on how the completion was handled. Returns: {"status": "ok", "task_id": "..."} on success. {"status": "already_processed", "task_id": "..."} if already recorded. {"error": "...", "status": "error"} on failure. Usage Guide: - Call once per task after finishing your handling of it. - Example: ticktick_mark_completion_processed( task_id="abc123", project_id="your_project_id_here", title="Fix kitchen tap", completed_time="2025-06-01T19:00:00+01:00", notes="Replaced ceramic disc, resolved" ) |
| ticktick_convert_datetime_to_ticktick_formatA | Convert an ISO 8601 datetime string into TickTick's storage format. TickTick uses Args:
datetime_iso_string (str): ISO 8601 datetime, e.g.
Returns:
On success: Agent Usage Guide:
- Call this when you need to set Example: ticktick_convert_datetime_to_ticktick_format( datetime_iso_string="2026-04-13T20:45:00+01:00", tz="Europe/London", ) |
| ticktick_create_taskA | Create a new task. Args:
title (str): Task title. Required.
project_id (str, optional): Project ID or name. Defaults to inbox.
Accepts the project's name as well as its ID
(case-insensitive, trimmed; "Inbox" resolves to the inbox).
Two projects sharing a name is an error, not a guess.
content (str, optional): Long-form content (markdown supported).
desc (str, optional): Short description / checklist subtitle.
all_day (bool, optional): True for all-day tasks.
start_date (str, optional): ISO 8601 start datetime, e.g.
Returns:
JSON object containing the created task. Limitations:
- Agent Usage Guide:
- Always pair Example: ticktick_create_task( title="Replace kitchen tap washer", project_id="", due_date="2026-06-01T20:45:00+01:00", expected_day_of_week="Monday", time_zone="Europe/London", priority=3, ) |
| ticktick_update_taskA | Update an existing task without wiping unmodified fields. The TickTick API requires the entire editable task on every update;
any omitted field is wiped server-side. To prevent that we fetch the
current task, then overlay ONLY the fields the caller explicitly
set ( Args:
task_object (TaskObject): Must include Returns:
JSON object containing the updated task.
Limitations:
- Read-only API fields ( Agent Usage Guide:
- To reschedule a task, send a single update with the new
Example: ticktick_update_task(task_object={ "id": "60ca9dbc8f08516d9dd56324", "projectId": "", "priority": 5, "dueDate": "2026-06-15T20:45:00+01:00", "expectedDayOfWeek": "Monday", "timeZone": "Europe/London", }) |
| ticktick_delete_tasksA | Delete one or more tasks. Args:
task_ids (str | list[str]): A single task ID, or a list of IDs.
An empty list returns an error.
project_id (str, optional): Used to construct a minimal delete
payload when Returns:
Agent Usage Guide:
- For tasks already completed in TickTick, supply Example: ticktick_delete_tasks( task_ids=["abc123", "def456"], project_id="", ) |
| ticktick_get_tasks_from_projectA | Return every open task in a project. Args:
project_id (str): The project's ID or name. Accepts the project's name as well as its ID
(case-insensitive, trimmed; "Inbox" resolves to the inbox).
Two projects sharing a name is an error, not a guess.
List them with Returns:
Compact (default): JSON list of compact task objects. If the
compact payload would still exceed the size budget, the
soonest-due tasks are returned and a final Limitations:
- Completed tasks are NOT included.
- Compact output is for browsing only. To EDIT a task, fetch the
full object with Freshness:
Local state is synced from the server at most once per throttle
window (default 15s, Example: ticktick_get_tasks_from_project( project_id="" ) |
| ticktick_complete_taskA | Mark a task as completed. Completing a task here also records it as processed, so it does not come
back from Args: task_id (str): The task's full ID. Returns:
JSON object containing the refetched task (status=2 on success).
Limitations:
- Once completed, the Example: ticktick_complete_task(task_id="60ca9dbc8f08516d9dd56324") |
| ticktick_move_taskA | Move a task into a different project. Args: task_id (str): The task's full ID. new_project_id (str): Destination project's ID or name. Accepts the project's name as well as its ID (case-insensitive, trimmed; "Inbox" resolves to the inbox). Two projects sharing a name is an error, not a guess. Returns:
JSON object containing the moved task. If the target project
cannot be looked up locally, the move is still attempted.
Missing source task (no projectId field):
Example: ticktick_move_task( task_id="60ca9dbc8f08516d9dd56324", new_project_id="", ) |
| ticktick_make_subtaskA | Nest Args:
parent_task_id (str): The parent task's ID.
child_task_id (str): The task to become a subtask. Must differ
from Returns:
On success: Example: ticktick_make_subtask( parent_task_id="60ca9dbc8f08516d9dd56324", child_task_id="60ca9dbc8f08516d9dd56325", ) |
| ticktick_get_by_idA | Look up any object (task, project, tag) by its ID. Args: obj_id (str): The object's full ID. Returns:
JSON object of the matching record, or an empty object Freshness:
Local state is synced from the server at most once per throttle
window (default 15s, Example: ticktick_get_by_id(obj_id="60ca9dbc8f08516d9dd56324") |
| ticktick_get_allA | Dump everything of a single kind from the local sync state. Args:
search (str): Either Returns:
For Limitations:
- Example: ticktick_get_all(search="projects") |
| ticktick_syncA | Force an immediate refresh of TickTick state from the server. The active-read tools ( Returns:
Example: ticktick_sync() |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 14 tools
Most tools have clearly separated roles (create/update/delete/complete/move/subtask/sync), and the paired completion-queue tools are well delineated. Minor overlap exists: ticktick_get_tasks_from_project duplicates a subset of ticktick_filter_tasks, and ticktick_get_all has a broken "tasks" branch that further muddies listing options. The detailed descriptions prevent most misselections.
All tools share the ticktick_ prefix and follow a verb-first snake_case convention such as filter_tasks, create_task, update_task, delete_tasks, and mark_completion_processed. Even utility tools like get_by_id, get_all, and sync fit the predictable pattern. No mixed casing or inconsistent verb styles.
14 tools sits at the upper edge of well-scoped for a task management server, and most earn their place. A few feel redundant or optional: get_tasks_from_project largely overlaps filter_tasks, convert_datetime_to_ticktick_format is only a convenience since create/update accept ISO strings directly, and get_all has an inert tasks branch.
The tool surface covers the core task lifecycle well: create, read/filter, update, delete, complete, move, subtasks, a completion-review queue, and forced sync. Notable gaps include no project management beyond listing, no explicit text/keyword search, and a broken get_all("tasks") branch that requires a workaround.