Skip to main content
Glama

ticktick-mcp

CI License: GPL v3 Python 3.13+ Glama MCP Server

MCP server for TickTick task management. Create, update, complete, move, and filter tasks via the TickTick v2 API, with field-preserving updates, day-of-week date validation, read-after-write verification, and idempotent completion tracking.

Designed for Claude Code and other MCP clients.

Unofficial. Not affiliated with TickTick Ltd. Built on ticktick-py (MIT).

Features

  • Full task lifecycle - create, update, complete, move, subtask, and delete

  • Field-preserving updates - ticktick_update_task re-fetches the task and overlays only the fields you set, so the API never wipes the ones you omit

  • Day-of-week validation - any call that sets a date must confirm the weekday, catching off-by-one date mistakes before they reach the server

  • Read-after-write verification - create/update re-read the task and surface _verification_warnings when the server echo doesn't match

  • Compact listing - list tools return a trimmed view by default so large projects stay under the MCP result-size cap (see below)

  • Fresh reads - read tools re-sync server state on demand, so edits made from the TickTick app on other devices show up without a restart

  • Completion tracking - mark completed tasks as processed so an agent reviews each one exactly once

Related MCP server: ticktick-mcp-server

Requirements

  • Python 3.13+ (tested on 3.13 and 3.14, on Linux, macOS and Windows, in CI)

  • uv (recommended - see the install note below)

  • A TickTick account

  • A registered TickTick app for OAuth credentials (free - developer.ticktick.com)

Install

git clone https://github.com/partymola/ticktick-mcp
cd ticktick-mcp
uv sync

This creates a .venv and installs from uv.lock, giving you the console script at .venv/bin/ticktick-mcp, or .venv\Scripts\ticktick-mcp on Windows. Every command below names it the POSIX way.

pip install . works too. The fork of ticktick-py this server needs is pinned as a direct git reference inside dependencies, which pip and uv both honour; uv sync is recommended because it installs the exact versions in uv.lock rather than re-resolving them.

Credentials

TickTick sign-in needs two things: an OAuth app (client ID + secret) and your own account login.

  1. Register an app at developer.ticktick.com. Set the Redirect URI to http://localhost:8080/redirect. Note the Client ID and Client Secret.

  2. Copy the template into the directory the server reads, and fill it in:

    mkdir -p ~/.config/ticktick-mcp && cp .env.example ~/.config/ticktick-mcp/.env
    TICKTICK_CLIENT_ID=your_client_id
    TICKTICK_CLIENT_SECRET=your_client_secret
    TICKTICK_REDIRECT_URI=http://localhost:8080/redirect
    TICKTICK_USERNAME=your_ticktick_email
    TICKTICK_PASSWORD=your_ticktick_password
  3. This file holds your account password in plain text, and the server does not create it, so tighten it yourself. On POSIX:

    chmod 700 ~/.config/ticktick-mcp
    chmod 600 ~/.config/ticktick-mcp/.env

    Those are POSIX mode bits, and on Windows they do nothing: access there follows the ACLs the file inherits from its parent directory. No Windows equivalent of the two commands is documented here.

    The two token files beside it are created owner-only, and a config directory the server creates is too - but one it finds already there is left as it is. Those are POSIX modes as well, set on Windows too, where they do not narrow who may read what.

Authorise once, at a terminal, before registering the server:

.venv/bin/ticktick-mcp auth

It opens a browser and asks you to paste back the URL you land on, then exits. The token is cached next to your .env as .token-oauth, and every later start reuses it. TickTick issues no refresh token, so this recurs when the token expires - run the same command again.

Do not let that step happen inside the MCP server. The prompt reads from standard input, which for a stdio server is the JSON-RPC channel, so an unauthorised first tool call opens a browser on the host and blocks. In a container it cannot be completed at all - run auth on the host and mount the config directory in.

The username/password half needs no separate step: the server logs in lazily on the first tool call and caches that session token as .token-v2, so it does not re-submit your credentials on every start.

The server looks for .env in this order: the --dotenv-dir <path> argument, then the TICKTICK_MCP_DOTENV_DIR environment variable, then ~/.config/ticktick-mcp/. If no .env is found it falls back to the TICKTICK_* environment variables directly, which is convenient for container/CI use.

Privacy and the unofficial API

Your TickTick credentials live only in your local .env (or the environment) and are sent only to TickTick's own servers - never to the developer or any third party. The server reads and writes only your own account.

This server uses TickTick's unofficial v2 API (via ticktick-py) rather than the official Open API. That is a deliberate choice: the official API has no list-completed-tasks endpoint, no tags, and no cross-project task listing - all of which this server relies on. See docs/why-not-the-official-api.md for the full rationale, the risk trade-off, and the triggers that would make us reconsider.

Register with Claude Code

claude mcp add -s user ticktick -- /path/to/ticktick-mcp/.venv/bin/ticktick-mcp --dotenv-dir /path/to/config

--dotenv-dir is optional if your .env lives in ~/.config/ticktick-mcp/ or you supply the TICKTICK_* variables through the environment.

Then ask Claude things like:

  • "What's on my TickTick list for this week?"

  • "Add a task to call the dentist on Friday at 9am."

  • "Mark the grocery task as done."

  • "Move the budget task to the Finance project."

Docker

Images are published to ghcr.io/partymola/ticktick-mcp. Tags carry a v prefix (:vX.Y.Z), and :latest follows the most recent release.

Authorise on a machine with a browser first, then mount that directory in. This is the only route, and it holds even with docker run -it: the underlying library opens the browser itself and never prints the URL, so there is nothing to copy out of a container that has no browser. It then waits for that URL on standard input, which for a stdio server is the JSON-RPC channel - so a container started against a directory with no cached token does not fail cleanly either, it consumes your client's requests waiting for input that never arrives.

Authorising needs a source install (Install) and the credentials from Credentials - there is no published package to run it from. Do not pip install ticktick-mcp: that name on PyPI belongs to an unrelated project with a near-identical description.

.venv/bin/ticktick-mcp auth       # once, on the host, in a terminal

claude mcp add -s user ticktick -- \
  docker run --rm -i --user $(id -u):$(id -g) \
  -v ~/.config/ticktick-mcp:/data \
  ghcr.io/partymola/ticktick-mcp:latest

-i is required - the server speaks JSON-RPC over stdin and stdout.

--user is there because the container runs as root by default, and anything it writes into the mounted directory becomes root-owned - after which the host-side ticktick-mcp can no longer update its session-token cache and falls back to a throttled signon on every start. You will run it on the host again: the OAuth token has no refresh, so auth recurs at expiry.

Mount a directory that is already authorised, never an empty volume. /data holds the .env, the cached OAuth token, the v2 session token and the completion-tracking database. A fresh volume has none of them, and the password-signon fallback is throttled into a 15-30 minute lockout.

If you would rather not keep a .env on disk at all, pass the credentials as environment variables instead. The mount is still needed - it holds the token cache, not just the .env:

docker run --rm -i --user $(id -u):$(id -g) \
  -v ~/.config/ticktick-mcp:/data \
  -e TICKTICK_CLIENT_ID -e TICKTICK_CLIENT_SECRET \
  -e TICKTICK_USERNAME -e TICKTICK_PASSWORD \
  ghcr.io/partymola/ticktick-mcp:latest

Naming each variable without a value passes it through from your shell, so no secret appears in the command or in shell history. These override a mounted .env: the file is loaded without override, so anything already in the environment wins. Authorising still needs those variables exported on the host, since auth has no .env to read either.

CLI

ticktick-mcp                       Start the MCP server (stdio transport)
ticktick-mcp --dotenv-dir PATH     Directory holding the .env file
ticktick-mcp --version             Print the installed package version

auth is the only other subcommand, and it exists so the browser step happens at a terminal rather than inside the server. All task operations happen through the MCP tools below.

MCP tools

Tool

Description

ticktick_create_task

Create a task, preserving date/reminder/priority/timezone fields; warns if no due date is set (no reminder would fire)

ticktick_update_task

Update a task by overlaying only the fields you set onto the current server object (omitted fields are never wiped)

ticktick_complete_task

Mark a task complete and re-verify; distinguishes a recurring task rolling forward from a normal completion

ticktick_delete_tasks

Delete one or more tasks by ID

ticktick_move_task

Move a task into a different project

ticktick_make_subtask

Nest one task as a subtask of another in the same project

ticktick_get_tasks_from_project

List every open task in a project (compact or full)

ticktick_filter_tasks

Find tasks by any mix of project, priority, tag, status, and due/completion-date window

ticktick_get_by_id

Look up any task, project, or tag by its full ID

ticktick_get_all

Dump all projects or all tags from local state

ticktick_sync

Force an immediate refresh of local state from the server

ticktick_get_unprocessed_completions

List recently completed tasks in a project not yet marked processed

ticktick_mark_completion_processed

Record that a completed task has been reviewed, excluding it from future checks

ticktick_convert_datetime_to_ticktick_format

Convert an ISO 8601 datetime + IANA timezone to TickTick's wire format

Projects: name or ID

Every tool that takes a project ID also takes the project's name - ticktick_create_task, ticktick_get_tasks_from_project, ticktick_update_task, ticktick_move_task, ticktick_delete_tasks, ticktick_filter_tasks, and both completion-tracking tools:

ticktick_create_task(title="Renew insurance", project_id="Home Admin")

Names match case-insensitively, ignoring surrounding whitespace, and "Inbox" resolves to your inbox. IDs keep working unchanged and always win, so nothing that works today changes.

The one new error is ambiguity: if two projects share a name, the call fails and names both IDs rather than picking one, since guessing would file the task somewhere you would not think to look. Anything else the server cannot resolve is passed to the API untouched, exactly as before.

The two completion-tracking tools are the exception: they refuse a project reference they cannot confirm rather than passing it on, because that value is the key their local database is written under. An unresolvable one would write a row no later lookup by ID can find. If the project list could not be refreshed to check, they say so (outcome: "project_list_unverifiable") instead of claiming the project does not exist.

Listing tasks: compact by default

The list-returning tools - ticktick_get_tasks_from_project and ticktick_filter_tasks - default to detail="compact". Compact output keeps the browsing-relevant fields (id, projectId, title, dueDate, startDate, priority, status, isAllDay, timeZone, tags) plus a contentPreview (the first ~200 chars of content), and drops the heavy content/desc/checklist items blobs and bulky sync metadata. This keeps large projects under the MCP result-size cap so the client does not have to spill the result to disk. Keyword search still works against title and contentPreview.

  • Need the full objects? Pass detail="full".

  • Need one task's full content? Use ticktick_get_by_id.

  • Editing a task: fetch the full object with ticktick_get_by_id first, then send every field back via ticktick_update_task. The TickTick API wipes any field omitted from an update, so compact output must never feed an update.

If a compact result would still exceed the size budget, the soonest-due tasks are returned and a final _truncation_note element reports how many were omitted - nothing is dropped silently. Reach the rest with a narrower ticktick_filter_tasks query, detail="full", or ticktick_get_by_id.

Freshness: reads stay current

The TickTick account can be edited from the app on other devices while the server runs. To keep reads from going stale, the read tools re-sync server state on demand, throttled to at most once per window (default 15s, override with TICKTICK_MCP_SYNC_TTL_SECONDS). A change made elsewhere becomes visible within that window; call ticktick_sync to force an immediate refresh and get the current task/project counts. If a sync fails, the last-known state is served rather than erroring - except in ticktick_get_all, which refreshes every call and reports the failure instead, since a full dump is the wrong place to serve a stale answer quietly.

Configuration

Variable

Default

Description

TICKTICK_MCP_DOTENV_DIR

~/.config/ticktick-mcp/

Directory holding the .env, the cached tokens and the completion-tracking database (the --dotenv-dir argument takes precedence). The container image sets it to /data

TICKTICK_MCP_SYNC_TTL_SECONDS

15

Minimum seconds between on-demand read re-syncs

TICKTICK_MCP_INIT_RETRY_SECONDS

60

Cooldown before retrying client login after a failed first connection

TICKTICK_MCP_RATELIMIT_RETRY_SECONDS

300

Cooldown before retrying login after a rate-limit (HTTP 429); longer than the init cooldown because a 429 clears slowly and each retry prolongs it

TICKTICK_MCP_PROTECTED_TASK_IDS

unset

Task IDs an agent must never modify, separated by spaces or commas. Every mutating tool refuses before sending anything; reads are unaffected. Unset means no protection.

Protecting tasks from modification

Some tasks should never be changed by an agent, whatever it is asked to do. List their IDs in TICKTICK_MCP_PROTECTED_TASK_IDS:

TICKTICK_MCP_PROTECTED_TASK_IDS="60ca9dbc8f08516d9dd56324,60ca9dbc8f08516d9dd56325"

ticktick_update_task, ticktick_complete_task, ticktick_delete_tasks, ticktick_move_task and ticktick_make_subtask then refuse any call naming a protected task, returning outcome: "protected_task". No request that reads or writes the task is sent. A batch delete containing a protected ID is refused in full rather than partially applied, since a partial delete cannot be undone.

Because TickTick propagates delete and move through subtasks, delete, move and make_subtask also refuse when a protected task is the parent or the subtask of a task you named. That check refreshes local state first, so it adds one request per delete, move or reparent while protection is configured - and returns outcome: "protection_unverifiable" if that refresh fails, since it cannot rule out a protected subtask on a snapshot it could not update. With the variable unset it does no extra work at all. IDs are matched ignoring surrounding whitespace, quotes and case. Reading protected tasks always works.

Credentials (TICKTICK_CLIENT_ID, TICKTICK_CLIENT_SECRET, TICKTICK_REDIRECT_URI, TICKTICK_USERNAME, TICKTICK_PASSWORD) are read from the .env file or, if absent, directly from the environment.

Data safety

A pre-commit hook (scripts/check-no-data.sh) blocks accidentally committing databases, credentials, and large files - *.db and backup variants, everything under config/ except .gitkeep and *.example*, and files over 100KB (except uv.lock). Install it after cloning:

ln -sf ../../scripts/check-no-data.sh .git/hooks/pre-commit

Contributing

See CONTRIBUTING.md for development setup, the test workflow, and the pre-commit hook. Changes are tracked in CHANGELOG.md.

License

GPL-3.0-or-later

Available Tools

14 tools
ticktick_complete_taskA

Mark a task as completed.

Args: task_id (str): The task's full ID.

Returns: JSON object containing the refetched task (status=2 on success). _verification_warnings is attached if the refetch shows the task is still open. Missing task: {"status": "not_found", "error": "..."}. Other failures: {"error": "...", "status": "error"}.

Limitations: - Once completed, the content field becomes immutable. Update content with resolution notes BEFORE calling this tool.

Example: ticktick_complete_task(task_id="60ca9dbc8f08516d9dd56324")

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavioral traits: it states the side effect (content becomes immutable), describes return formats for success, not found, and other failures, and mentions verification warnings. This is comprehensive for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (one-line purpose, Args, Returns, Limitations, Example) and no redundant sentences. Every part adds value without unnecessary length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one parameter, no annotations, but has output schema), the description covers all necessary aspects: parameter semantics, return values, side effects, and an example. There are no gaps for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds meaning to the task_id parameter by labeling it as 'The task's full ID', which hints at the required format. Although schema coverage is 0%, the description compensates adequately for a single string parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description starts with a clear verb and resource: 'Mark a task as completed.' It distinguishes from siblings like ticktick_create_task or ticktick_delete_tasks by specifying the completion action and includes limitations unique to this operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a limitations section advising to update content before calling, which provides usage context. However, it does not explicitly state when to use this tool versus alternatives like ticktick_update_task or ticktick_delete_tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ticktick_convert_datetime_to_ticktick_formatA

Convert an ISO 8601 datetime string into TickTick's storage format.

TickTick uses YYYY-MM-DDTHH:MM:SS+0000 (UTC offset, no colon).

Args: datetime_iso_string (str): ISO 8601 datetime, e.g. "2026-04-13T20:45:00+01:00". Naive strings are accepted and interpreted in tz. tz (str): IANA timezone name used for the UTC conversion, e.g. "Europe/London" or "America/Los_Angeles".

Returns: On success: {"ticktick_format": "2026-04-13T19:45:00+0000"}. On parse error: {"error": "Invalid datetime format...", "status": "error"}. On any other conversion error: {"error": "Conversion failed: ...", "status": "error"}.

Agent Usage Guide: - Call this when you need to set startDate or dueDate on a task dict by hand. The ticktick_create_task and ticktick_update_task tools accept ISO strings directly and run this conversion internally.

Example: ticktick_convert_datetime_to_ticktick_format( datetime_iso_string="2026-04-13T20:45:00+01:00", tz="Europe/London", )

ParametersJSON Schema
NameRequiredDescriptionDefault
tzYes
datetime_iso_stringYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses return format (success and error), behavior for naive strings, and error types (parse vs conversion). No annotations exist, so description carries full burden and meets it well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured with clear sections (Purpose, Args, Returns, Usage Guide, Example). Each sentence adds value; front-loaded with main purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has 2 simple parameters, output schema described in text. Description covers all necessary details for correct invocation and error handling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% coverage, but description fully explains each parameter with examples, including handling of naive strings for datetime_iso_string and IANA conventions for tz.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it converts ISO 8601 datetime to TickTick's format, specifies the output format, and distinguishes itself from sibling tools that already perform this conversion internally.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use this tool (when setting startDate/dueDate manually) and notes that create/update tools do this internally, providing clear context for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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. "2026-04-13T09:00:00+01:00". due_date (str, optional): ISO 8601 due datetime. expected_day_of_week (str, optional): English weekday name. Required when due_date is set; mismatch returns an error. time_zone (str, optional): IANA timezone. Defaults to the system timezone for date conversion. reminders (list[str], optional): TickTick trigger strings, e.g. ["TRIGGER:-PT30M"]. repeat (str, optional): Recurrence rule (RFC 5545 RRULE). priority (int, optional): 0=None, 1=Low, 3=Medium, 5=High. sort_order (int, optional): Position within project. items (list[dict], optional): Subtask items.

Returns: JSON object containing the created task. If verification flags an issue, _verification_warnings is attached. Without due_date a warning is added because TickTick will not trigger a reminder. On failure: {"error": "...", "status": "error"}.

Limitations: - builder() in ticktick-py sometimes omits dates, reminders, priority and timezone; we re-populate them after the call.

Agent Usage Guide: - Always pair due_date with expected_day_of_week. - Pass a project name directly, or list ids with ticktick_get_all(search="projects").

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, )

ParametersJSON Schema
NameRequiredDescriptionDefault
descNo
itemsNo
titleYes
repeatNo
all_dayNo
contentNo
due_dateNo
priorityNo
remindersNo
time_zoneNo
project_idNo
sort_orderNo
start_dateNo
expected_day_of_weekNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses important behaviors: the return format including _verification_warnings, the warning added when due_date is missing, the exact handling of project_id (name or ID, case-insensitive, error on duplicate names), the requirement and mismatch error for expected_day_of_week, and a known limitation about the builder() omitting fields. This is exceptional transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns, Limitations, Agent Usage Guide, Example). It is long but every sentence adds meaningful information; the format is front-loaded with the core purpose and each section is appropriately placed. No redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex tool with 14 parameters, the description covers all essential aspects: complete parameter documentation, return value structure, error handling, a real usage example, and a known limitation. Combined with the output schema presence, this provides a comprehensive understanding for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, placing the full burden on the description. It gives detailed semantics for every parameter: types, defaults, constraints, and format examples (e.g., ISO 8601 dates, TRIGGER:-PT30M, RFC 5545 RRULE, priority mapping). This goes far beyond what the schema alone provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence "Create a new task." states a clear verb and resource, unambiguously distinguishing this tool from siblings like update, delete, and complete. The description then elaborates on the specific parameters and behavior of creation, leaving no doubt about its purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Agent Usage Guide provides practical instructions: always pair due_date with expected_day_of_week, and pass a project name directly or list ids with ticktick_get_all(search='projects'). It gives clear context for using the tool correctly, but it does not explicitly state when not to use it or directly contrast with alternative tools, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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 get_by_id cannot find the task locally (typical for completed tasks). 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: {"status": "success", "deleted_count": N, "tasks_deleted_ids": [...]} on success. Tasks that could not be matched at all are returned as status="not_found" with missing_ids / invalid_ids arrays. Partial success surfaces warnings. Empty input: {"status": "error", "message": "No task IDs..."}.

Agent Usage Guide: - For tasks already completed in TickTick, supply project_id -- get_by_id does not see completed tasks.

Example: ticktick_delete_tasks( task_ids=["abc123", "def456"], project_id="", )

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idsYes
project_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully carries the transparency burden. It discloses error behavior for empty input, partial success warnings, project_id name/ID resolution rules, and the 'not_found' return variant. This is comprehensive for a delete operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args, Returns, Agent Usage Guide, and Example sections. It is slightly verbose but every section adds meaningful detail, and the example clarifies usage without being redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the absence of annotations and minimal schema descriptions, the description covers all essential aspects: parameter semantics, edge cases, return formats, and conditional usage. It is fully sufficient for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides only titles with zero description coverage, but the description thoroughly explains both parameters: task_ids type flexibility and empty-list error, plus project_id's optional fallback behavior and name/ID acceptance. This far exceeds schema information.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Delete one or more tasks,' which uses a specific verb and resource, clearly distinguishing it from sibling tools like ticktick_complete_task or ticktick_update_task. The scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Agent Usage Guide' explicitly states when to supply project_id (for completed tasks) and explains that get_by_id does not see completed tasks. This gives clear context for a nuanced scenario, though it does not explicitly contrast with alternative deletion-like tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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): "compact" (default) or "full". Compact drops the heavy content/desc/checklist items blobs and bulky sync metadata, keeping id, projectId, title, dueDate, startDate, priority, status, isAllDay, timeZone, tags plus a contentPreview (first ~200 chars of content) so keyword search still works. Full returns the raw task objects unchanged. To EDIT a task, fetch the full object with ticktick_get_by_id first, then send every field back via ticktick_update_task -- compact output must never feed an update. filter_criteria (dict | str): A criteria object, or a JSON string that decodes to one. Recognised keys:

    * ``status``: ``"uncompleted"`` (default) or ``"completed"``.
      When ``"completed"`` you should supply
      ``completion_start_date`` and/or ``completion_end_date``;
      without dates the result is an empty list.
    * ``project_id`` (str): Limit to tasks in this project.
      Accepts the project's name as well as its ID
      (case-insensitive, trimmed). Two projects sharing a
      name is an error, not a guess.
    * ``priority`` (int): 0=None, 1=Low, 3=Medium, 5=High.
    * ``tag_label`` (str): Tag name (case-sensitive).
    * ``due_start_date`` / ``due_end_date`` (str): ISO date or
      datetime strings; only used when ``status='uncompleted'``.
    * ``completion_start_date`` / ``completion_end_date`` (str):
      ISO date or datetime strings; only used when
      ``status='completed'``.
    * ``tz`` (str): Default IANA timezone applied to date filters.
    * ``sort_by_priority`` (bool): Sort by descending priority.

Returns: JSON list of matching task objects (compact by default; see detail). Empty list if nothing matches. If a compact result would still exceed the size budget, the soonest-due matches are returned and a final _truncation_note element reports how many were omitted -- nothing is dropped silently. On invalid input or backend failure: {"error": "...", "status": "error"}.

Freshness: Uncompleted queries read local state, synced from the server at most once per throttle window (default 15s, TICKTICK_MCP_SYNC_TTL_SECONDS); a change made elsewhere within that window may not be visible yet -- call ticktick_sync to force a refresh. Completed queries are always fetched live.

Limitations: - TickTick caps get_completed at 100 results; very wide completion windows are truncated server-side. - Filtering happens client-side after the fetch, so additional criteria do not reduce the number of network requests. - Compact output is for browsing only; full content for one task is available via ticktick_get_by_id or detail="full".

Agent Usage Guide: - List open tasks in a project: {"status": "uncompleted", "project_id": "<id>"} - List completed tasks in the last 7 days: { "status": "completed", "project_id": "<id>", "completion_start_date": "2026-05-21", "completion_end_date": "2026-05-28" } - Find high-priority open tasks due this month, sorted: { "priority": 5, "due_start_date": "2026-05-01", "due_end_date": "2026-05-31", "sort_by_priority": true }

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNocompact
filter_criteriaYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations to fall back on, the description carries the full burden and does so excellently. It discloses freshness semantics (local state vs. live completed queries), truncation behavior with an explicit _truncation_note, server-side caps, client-side filtering implications, and the danger of feeding compact output into an update.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Although long, the description is exceptionally well structured with clear sections (Args, Returns, Freshness, Limitations, Agent Usage Guide). Every sentence delivers actionable information; the front-loaded summary sentence is immediately followed by organized detail, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex (multi-criteria filtering, date windows, status-dependent behavior), and the description is fully complete: return formats, error schema, truncation semantics, staleness handling, and realistic examples. The presence of an output schema is noted, but the description adds beyond it by explaining the compact vs. full distinction and the conditions affecting results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides zero descriptions for parameters, but the description compensates with exhaustive semantics: detail choices and their implications, all filter_criteria keys, types, defaults, accepted values (including priority mapping), date field applicability, case sensitivity, timezone defaults, and error conditions like ambiguous project names.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource: 'Return the tasks matching every supplied filter criterion.' It immediately distinguishes this from sibling tools (e.g., ticktick_get_all, ticktick_get_by_id, ticktick_get_tasks_from_project) by emphasizing filtering across multiple criteria rather than simple retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit 'Agent Usage Guide' with concrete JSON examples for open tasks, completed tasks in a date window, and high-priority tasks. It also names alternatives, such as using ticktick_get_by_id + ticktick_update_task for editing and ticktick_sync for forced refresh, and states when not to use compact output.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ticktick_get_allA

Dump everything of a single kind from the local sync state.

Args: search (str): Either "tasks", "projects" or "tags" (case-insensitive). detail (str, optional): "compact" (default) or "full". Accepted for parity with the other list tools and validated here. It has no effect on the "projects"/"tags" searches (those return non-task records in full) nor on the currently inert "tasks" search -- for a compact task list use ticktick_filter_tasks or ticktick_get_tasks_from_project.

Returns: For "projects": JSON list, inbox prepended as {"id": <inbox>, "name": "Inbox"}. For "tags": JSON list of tag objects. For "tasks": see Limitations. Unknown search type: {"error": "Invalid search type...", "status": "error"}.

Limitations: - "tasks" triggers a fetch of every open task across all projects, but the current implementation returns None rather than a JSON string. Use ticktick_filter_tasks({"status": "uncompleted"}) for a proper (compact) JSON response.

Example: ticktick_get_all(search="projects")

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNocompact
searchYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: return values for each search type (including the inbox prepended for projects), the limitation that tasks returns None, and error handling for invalid search types. It explains the detail parameter's inertness.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with sections (Args, Returns, Limitations, Example) but is somewhat verbose. However, every sentence adds value, and the key information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (multiple search types, quirks), the description is fully complete. It explains return values, limitations, and error handling, and references sibling tools for alternatives.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds extensive meaning: explains the search parameter options and behavior of detail (accepted for parity, no effect on projects/tags). The example clarifies usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool dumps all items of a single kind (tasks, projects, tags) from local sync state. It differentiates from sibling tools like ticktick_filter_tasks and ticktick_get_tasks_from_project by specifying what this tool does that others don't.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises when to use this tool (to get all items of a type) and when not to (for tasks, due to limitations, recommending ticktick_filter_tasks instead). It also notes the detail parameter is accepted for parity but has no effect on some searches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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 null if not found. On failure: {"error": "...", "status": "error"}.

Freshness: Local state is synced from the server at most once per throttle window (default 15s, TICKTICK_MCP_SYNC_TTL_SECONDS); an edit made elsewhere within that window may not be visible yet. Call ticktick_sync to force an immediate refresh.

Example: ticktick_get_by_id(obj_id="60ca9dbc8f08516d9dd56324")

ParametersJSON Schema
NameRequiredDescriptionDefault
obj_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses return states (null if not found, error format on failure) and freshness constraints with a suggestion to call ticktick_sync for immediate refresh. This is good behavioral context for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, followed by structured Args/Returns, a Freshness note, and an example. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple lookup tool with one parameter and an output schema, the description is complete. It covers return types, error handling, and data freshness. The output schema handles return format specifics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds 'The object's full ID.' and provides an example. This compensates for the lack of schema descriptions, giving the agent meaningful guidance on the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Look up any object (task, project, tag) by its ID.' It uses a specific verb-resource pair ('look up' by ID) and distinguishes from sibling tools like ticktick_get_all or ticktick_get_tasks_from_project.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. It provides an example and freshness notes but does not clarify when to prefer this over ticktick_get_all or ticktick_filter_tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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 ticktick_get_all(search="projects"). detail (str, optional): "compact" (default) or "full". Compact drops the heavy content/desc/checklist items blobs and bulky sync metadata, keeping id, projectId, title, dueDate, startDate, priority, status, isAllDay, timeZone, tags plus a contentPreview (first ~200 chars of content) so keyword search still works. Full returns the raw task objects unchanged.

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 _truncation_note element reports how many were omitted -- nothing is dropped silently. Full: JSON list of raw task objects (empty list if none). On failure: {"error": "...", "status": "error"}.

Limitations: - Completed tasks are NOT included. - Compact output is for browsing only. To EDIT a task, fetch the full object with ticktick_get_by_id first, then send every field back via ticktick_update_task (the API wipes any field omitted from an update). Get the full content of a single task with ticktick_get_by_id, or pass detail="full".

Freshness: Local state is synced from the server at most once per throttle window (default 15s, TICKTICK_MCP_SYNC_TTL_SECONDS); an edit made elsewhere within that window may not be visible yet. Call ticktick_sync to force an immediate refresh.

Example: ticktick_get_tasks_from_project( project_id="" )

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNocompact
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden and succeeds: it discloses truncation behavior with _truncation_note, sync throttle window, completed-task exclusion, and API behavior that wipes omitted fields on updates. These are actionable behavioral traits beyond schema/annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized into Args, Returns, Limitations, Freshness, and Example sections. Each sentence provides necessary information without filler; the length is justified by the tool's complexity and the absence of schema/annotation support.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers purpose, all parameter semantics, return types, failure format, edge cases (duplicate names, truncation), freshness guarantees, and an example. It fully equips an agent to invoke and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates: project_id semantics include name-or-ID, case-insensitivity, trimming, 'Inbox' resolution, duplicate-name error, and how to list projects. The detail parameter is thoroughly explained with exact compact/full payload differences and contentPreview behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Return every open task in a project,' a specific verb and resource that clearly states the tool's purpose. It also distinguishes from siblings by explicitly noting completed tasks are not included, and the compact/full distinction adds further scoping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The Limitations section explicitly references alternatives: use ticktick_get_by_id for full task content/editing, ticktick_update_task for updates, ticktick_get_all for listing projects, and ticktick_sync for forced refresh. It also warns that compact output is for browsing only, giving clear when-to-use vs when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

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 )

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNo
project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully discloses behavior: it is a read-only retrieval operation, returns unprocessed tasks, does not mark them as processed itself, and specifies error output format. It also explains edge cases like duplicate project names and case-insensitive name resolution. This exceeds expectations given the absence of annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections (Args, Returns, Usage Guide) and a concise opening statement. While slightly verbose, every sentence adds meaningful information, and the example makes invocation explicit without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity, no annotations, and the presence of an output schema, the description still adds essential context: the return item fields, error format, and the required follow-up action. It fully prepares an agent to invoke the tool correctly and interpret its results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema only provides names and types, but the description adds critical semantics: project_id accepts either ID or name, supports case-insensitive trimmed matching, resolves 'Inbox', and raises an error on ambiguous name collisions. It also explains the days parameter's meaning and default. This optimally compensates for the 0% schema description coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb+resource ('Returns completed tasks for a project...') and clearly distinguishes the tool from siblings by emphasizing the 'NOT yet marked as processed' state. It also mentions the workflow with ticktick_mark_completion_processed, which sets it apart from generic task-listing tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to call it ('at the beginning of each conversation'), which sibling to use afterward (ticktick_mark_completion_processed), and includes a step-by-step Usage Guide with an example invocation. This leaves no ambiguity about the intended usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ticktick_make_subtaskA

Nest child_task_id under parent_task_id.

Args: parent_task_id (str): The parent task's ID. child_task_id (str): The task to become a subtask. Must differ from parent_task_id and live in the same project.

Returns: On success: {"status": "success", "updated_parent_task": ..., "api_response": ...}. Missing child / parent: {"status": "not_found", "error": "..."}. Cross-project: {"error": "...same project...", "child_project": "...", "parent_project": "..."}.

Example: ticktick_make_subtask( parent_task_id="60ca9dbc8f08516d9dd56324", child_task_id="60ca9dbc8f08516d9dd56325", )

ParametersJSON Schema
NameRequiredDescriptionDefault
child_task_idYes
parent_task_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Since no annotations are provided, the description carries full burden. It documents success and error states (not_found, cross-project), but does not discuss idempotency, side effects on parent task order, or authorization requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with structured sections (Args, Returns, Example) and includes an example. Every sentence adds value without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity, the description covers purpose, constraints, and error handling. However, it omits edge cases like what happens if the child is already a subtask elsewhere, and assumes output schema covers return structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description provides clear, meaningful definitions for both parameters (parent_task_id and child_task_id), including the critical constraint that they must differ and be in the same project.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'nest' and the resources 'child_task_id under parent_task_id', distinguishing it from sibling tools like move_task or update_task. The example further reinforces the purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides constraints (must differ, same project) and error cases, but does not explicitly compare to alternatives like ticktick_move_task or when to use subtasking vs. other organizational methods.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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" )

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNo
titleNo
task_idYes
project_idYes
completed_timeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description discloses key behaviors: the task will no longer appear in future calls to the companion tool, and it documents all return statuses (ok, already_processed, error). It also warns about ambiguous project names being an error, adding important behavioral detail.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with Args, Returns, and Usage Guide sections. It is front-loaded with the purpose and each section adds value; the example is illustrative without being redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, when to use, parameter semantics, return values, and behavioral side effects. The output schema exists but the description already explains the return format, and it fully compensates for the empty schema descriptions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description's detailed parameter documentation is essential. It explains each parameter including project_id resolution rules (case-insensitive, trimmed, 'Inbox' special case, duplicate name error), and clarifies optional fields like title and completed_time.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a specific verb+resource: 'Records that a domain agent has processed a completed task.' It clearly differentiates from sibling tool ticktick_complete_task by noting it should be called after reviewing tasks from ticktick_get_unprocessed_completions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly instructs to call 'after reviewing each task returned by ticktick_get_unprocessed_completions' and includes a usage guide with 'Call once per task after finishing your handling of it.' This provides clear when-to-use guidance and references the relevant sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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): {"status": "not_found", ...}. Other failures: {"error": "...", "status": "error"}.

Example: ticktick_move_task( task_id="60ca9dbc8f08516d9dd56324", new_project_id="", )

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes
new_project_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description fully carries the behavioral disclosure burden. It details return values, error cases (not_found, error), and the edge case where the target project cannot be looked up locally (move still attempted). Project name resolution behavior is also clearly explained, covering case-insensitivity, trimming, Inbox resolution, and ambiguity errors. This is comprehensive transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with a one-line summary, Args, Returns, and Example sections. Every sentence adds value: parameter details, behavior, error handling, and a concrete example. No redundancy or fluff; the structure is front-loaded and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter move tool with no annotations and an output schema present, the description covers all necessary aspects: parameter semantics, return format, failure modes, and an example. It is complete even without relying on the output schema, and the explicit return behavior gives the agent full confidence in invoking the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides no descriptions (0% coverage), only parameter names and types. The description adds rich meaning: task_id is the full ID, new_project_id accepts either ID or name with specific matching rules and error conditions. This fully compensates for the schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description begins with a clear, specific verb and resource: 'Move a task into a different project.' This directly distinguishes it from sibling tools like update, complete, or delete. The purpose is immediately understandable and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool (to move a task to another project) and provides detailed behavioral guidelines for the new_project_id parameter (name resolution, case-insensitivity, Inbox handling, ambiguity errors). While it doesn't explicitly mention alternatives or exclusions, the purpose is distinct enough among siblings that an agent can infer appropriate usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ticktick_syncA

Force an immediate refresh of TickTick state from the server.

The active-read tools (ticktick_get_by_id, ticktick_get_tasks_from_project, ticktick_filter_tasks) already auto-refresh at most once per throttle window (default 15s, overridable via TICKTICK_MCP_SYNC_TTL_SECONDS). Call this when you need an immediate refresh -- e.g. you just changed something in the TickTick app on another device, or a read looks stale and you want to be certain before acting.

Returns: {"status": "synced", "task_count": N, "project_count": M} on success. {"status": "error", "detail": "..."} if the refresh failed -- the previous (stale) state is still served by the read tools, so callers can continue with reduced confidence.

Example: ticktick_sync()

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It fully discloses behavior: on success returns synced status with counts, on error returns an error detail and notes that stale state is still served. It also mentions the auto-refresh mechanism of read tools.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured, with a clear statement, contextual explanation, return value specification, and an example. Every sentence adds value, and it is front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters and an output schema exists (indicated by context), the description provides a complete picture: purpose, usage context, return format, and error handling. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, and schema coverage is trivially 100%. According to guidelines, baseline is 4 for zero parameters. The description adds no parameter info, but it does provide context about return values and behavior, which is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly specifies the tool's purpose: forcing an immediate refresh of TickTick state from the server. It distinguishes itself from sibling tools by contrasting with the auto-refresh behavior of read tools, leaving no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use this tool (immediate refresh needed, e.g., after changes in the TickTick app or stale reads) and implicitly when not to (relying on auto-refresh of read tools). It also explains that the read tools auto-refresh with a configurable TTL, providing clear guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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 (exclude_unset=True).

Args: task_object (TaskObject): Must include id. All other fields are optional; set only the ones you want to change. When dueDate is set you must also set expectedDayOfWeek.

Returns: JSON object containing the updated task. _verification_warnings is attached if the response did not match what we sent. On failure: {"error": "...", "status": "error"}.

Limitations: - Read-only API fields (creator, etag, createdTime, modifiedTime, deleted, kind, isFloating) are stripped before the call.

Agent Usage Guide: - To reschedule a task, send a single update with the new dueDate + expectedDayOfWeek. Do NOT complete and recreate.

Example: ticktick_update_task(task_object={ "id": "60ca9dbc8f08516d9dd56324", "projectId": "", "priority": 5, "dueDate": "2026-06-15T20:45:00+01:00", "expectedDayOfWeek": "Monday", "timeZone": "Europe/London", })

ParametersJSON Schema
NameRequiredDescriptionDefault
task_objectYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It details the fetch-and-overlay mechanism, read-only field stripping, return format with verification warnings, and the validation-only nature of expectedDayOfWeek.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structured with Args, Returns, Limitations, Agent Usage Guide, and Example. Each section adds value, though slightly long. Well-organized and front-loaded with key behavior.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of partial updates and read-only fields, the description covers all necessary behaviors: edge cases (dueDate+expectedDayOfWeek), return format, failure mode. Output schema exists, so return explanation is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so description compensates: explains task_object requires id, optional fields, and the dueDate+expectedDayOfWeek constraint. Example demonstrates usage. Could list more fields but schema already defines them.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool updates an existing task without wiping unmodified fields, explaining the underlying API behavior. It distinguishes from sibling tools like delete, create, and complete by focusing on partial updates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Agent Usage Guide' provides explicit advice, such as rescheduling via a single update with dueDate and expectedDayOfWeek. It does not explicitly state when not to use, but the context is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool updatev0.1.1
    • Addedticktick_sync
  2. 13 tool updatesv0.1.0
    • First observedticktick_complete_task
    • First observedticktick_convert_datetime_to_ticktick_format
    • First observedticktick_create_task
    • First observedticktick_delete_tasks
    • First observedticktick_filter_tasks
    • First observedticktick_get_all
    • First observedticktick_get_by_id
    • First observedticktick_get_tasks_from_project
    • First observedticktick_get_unprocessed_completions
    • First observedticktick_make_subtask
    • First observedticktick_mark_completion_processed
    • First observedticktick_move_task
    • First observedticktick_update_task

TDQS

A4.7/5.0
Disambiguation5/5

Each tool targets a distinct action or query type: project-scoped lists, generic filtering, unprocessed completions, CRUD operations, and utility conversions. Even the overlapping list tools (get_tasks_from_project vs filter_tasks) are clearly differentiated by their descriptions and intended use cases.

Naming Consistency5/5

All tools follow a consistent ticktick_ + verb + noun pattern in snake_case (e.g., create_task, update_task, complete_task, move_task, make_subtask, get_by_id). No style mixing or vague verbs; naming is uniform and predictable.

Tool Count5/5

With 14 tools, the server is well-scoped for a task management domain. Each tool covers a core operation or a special workflow without bloat, fitting neatly within the ideal 3-15 range.

Completeness5/5

The tool set covers the full task lifecycle: create, read (multiple retrieval modes), update, delete, complete, move, subtask creation, and sync. Minor gaps like get_all's broken 'tasks' mode are documented with a workaround, so agents can still achieve their goals.

Maintenance

ActivityActive
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/partymola/ticktick-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server