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
} |
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. Send only the fields to change. The tool fetches the current task and
overlays 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, call
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:
After a completion call, a JSON object carrying 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
Each tool targets a distinct action (create, update, delete, complete, move, nest, sync), and the listing tools are differentiated by scope: get_tasks_from_project is project-scoped while filter_tasks is a general multi-criteria query. The main confusion source is get_all(search="tasks"), which overlaps with the other list tools and is even documented as inert, plus get_by_id vs get_all which both retrieve records but at different granularity.
All tools share the ticktick_ prefix and snake_case with clear verb_noun structure (create_task, update_task, delete_tasks, move_task, complete_task). Minor deviations exist: 'make_subtask' uses make rather than create, and the get family has three inconsistent forms (get_by_id, get_all, get_tasks_from_project), but overall it is predictable and readable.
14 tools sits comfortably in the well-scoped 3-15 range for a task manager. Each tool earns its place: core CRUD, completion workflow, project movement, subtasking, a datetime utility, and sync all map to real operations rather than padding.
The task lifecycle is well covered (create, read/filter, update, delete, complete, move, subtask) plus a completion-processing queue and sync. Minor gaps remain around project/tag lifecycle management (only listing exists, no create/delete of projects or tags) and no bulk update, but agents can work around these via the inbox and existing tools.