Skip to main content
Glama

ticktick-mcp

CI License: GPL v3 Python 3.13+ Glama MCP Server

用于 TickTick 任务管理的 MCP 服务器。通过 TickTick v2 API 创建、更新、完成、移动和筛选任务,具备字段保留更新、星期几日期验证、写后读验证和幂等完成跟踪功能。

专为 Claude Code 及其他 MCP 客户端设计。

非官方项目。与 TickTick Ltd. 无关联。基于 ticktick-py(MIT)构建。

功能特性

  • 完整任务生命周期 —— 创建、更新、完成、移动、设为子任务和删除

  • 字段保留更新 —— ticktick_update_task 会重新获取任务,并且只叠加你设置的字段,因此 API 永远不会清除你省略的字段

  • 星期几验证 —— 任何设置日期的调用都必须确认星期几,在差一天的日期错误到达服务器之前就将其捕获

  • 写后读验证 —— 创建/更新会重新读取任务,当服务器回显不一致时显示 _verification_warnings

  • 紧凑列表 —— 列表工具默认返回精简视图,让大型项目保持在 MCP 结果大小上限以内(见下文)

  • 新鲜读取 —— 读取工具按需重新同步服务器状态,因此其他设备上 TickTick 应用所做的编辑无需重启即可显示出来

  • 完成跟踪 —— 将已完成任务标记为已处理,以便智能体对每个任务恰好审查一次

Related MCP server: ticktick-mcp-server

环境要求

  • Python 3.13+

  • uv(推荐——见下方安装说明)

  • 一个 TickTick 账户

  • 一个已注册的 TickTick 应用,用于获取 OAuth 凭据(免费——developer.ticktick.com)

安装

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

这会创建一个 .venv,并根据 uv.lock 安装,得到位于 .venv/bin/ticktick-mcp 的控制台脚本,在 Windows 上则是 .venv\Scripts\ticktick-mcp。下面每条命令都以 POSIX 方式引用它。

pip install . 也可以。此服务器所需的 ticktick-py 分支以直接 git 引用形式固定在 dependencies 中,pip 和 uv 都会遵循;推荐使用 uv sync,因为它安装的是 uv.lock 中的精确版本,而不是重新解析依赖。

凭据

TickTick 登录需要两样东西:一个 OAuth 应用(客户端 ID + 密钥)和你自己的账户登录信息。

  1. 在 developer.ticktick.com 注册一个应用。将 重定向 URI 设置为 http://localhost:8080/redirect。记下 客户端 ID 和 客户端密钥。

  2. 将模板复制到服务器读取的目录中,然后填写:

    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. 此文件以明文形式保存你的账户密码,而服务器不会创建它,所以请自行收紧权限。在 POSIX 上:

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

    这些是 POSIX 模式位,在 Windows 上它们不起作用:那里的访问权限遵循文件从其父目录继承的 ACL。此处没有记录这两条命令的 Windows 等效命令。

    旁边的两个令牌文件在创建时仅所有者可读,服务器创建的配置目录也是如此——但如果是服务器发现时已存在的配置目录,则保持原样。这些同样是 POSIX 模式,在 Windows 上也会设置,但在那里它们并不会限制谁能读取什么。

在注册服务器之前,先在终端中授权一次:

.venv/bin/ticktick-mcp auth

它会打开浏览器,要求你粘贴回落地页的 URL,然后退出。令牌会作为 .token-oauth 缓存在你的 .env 旁边,之后每次启动都会复用。TickTick 不签发刷新令牌,因此令牌过期时需要重来一次——再次运行同一条命令即可。

不要让这一步发生在 MCP 服务器内部。该提示会从标准输入读取,而对 stdio 服务器来说,标准输入就是 JSON-RPC 通道,因此未授权状态下的第一次工具调用会在主机上打开浏览器并阻塞。在容器中它根本无法完成——请先在主机上运行 auth,再把配置目录挂载进去。

用户名/密码部分无需单独步骤:服务器会在第一次工具调用时惰性登录,并将该会话令牌缓存为 .token-v2,因此不会在每次启动时重新提交你的凭据。

服务器按以下顺序查找 .env:先是 --dotenv-dir <path> 参数,然后是 TICKTICK_MCP_DOTENV_DIR 环境变量,最后是 ~/.config/ticktick-mcp/。如果没有找到 .env,它会直接回退到 TICKTICK_* 环境变量,这对容器/CI 使用很方便。

隐私与非官方 API

你的 TickTick 凭据只存在于本地 .env(或环境中),并且只发送给 TickTick 自己的服务器——绝不会发送给开发者或任何第三方。服务器只读写你自己的账户。

此服务器使用 TickTick 的非官方 v2 API(通过 ticktick-py),而不是官方 Open API。这是一个刻意的选择:官方 API 没有列出已完成任务的端点、没有标签,也没有跨项目任务列表——而这些都是此服务器所依赖的。完整理由、风险权衡以及会促使我们重新考虑的条件,请参见 docs/why-not-the-official-api.md。

注册到 Claude Code

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

如果你的 .env 位于 ~/.config/ticktick-mcp/,或者你通过环境提供 TICKTICK_* 变量,那么 --dotenv-dir 是可选的。

然后可以这样问 Claude:

  • “我这周的 TickTick 列表上有什么?”

  • “添加一个任务:周五早上 9 点给牙医打电话。”

  • “把杂货采购任务标记为完成。”

  • “把预算任务移到 Finance 项目。”

Docker

镜像发布到 ghcr.io/partymola/ticktick-mcp。标签带有 v 前缀(:vX.Y.Z),:latest 跟随最新发布版本。

先在装有浏览器的机器上授权,然后再挂载该目录。 这是唯一途径,即使使用 docker run -it 也是如此:底层库会自己打开浏览器,而且绝不打印 URL,因此从没有浏览器的容器中无法复制出任何内容。然后它会在标准输入上等待该 URL,而对 stdio 服务器来说,标准输入就是 JSON-RPC 通道——所以,针对没有缓存令牌的目录启动的容器也不会干净利落地失败,它会继续消耗你客户端的请求,等待永远不会到来的输入。

授权需要源码安装(安装)以及凭据中提到的凭据——没有可用来运行它的已发布包。不要 pip install ticktick-mcp: PyPI 上的这个名字属于一个无关项目,其描述几乎相同。

.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 是必需的——服务器通过 stdin 和 stdout 进行 JSON-RPC 通信。

--user 之所以存在,是因为容器默认以 root 身份运行,它写入挂载目录的任何内容都会变成 root 所有——之后主机端的 ticktick-mcp 就无法再更新其会话令牌缓存,并在每次启动时回退到受限速的登录。你之后还会在主机上运行它:OAuth 令牌无法刷新,因此到期时需要再次运行 auth。

挂载一个已经授权的目录,绝不要挂载空卷。 /data 保存 .env、缓存的 OAuth 令牌、v2 会话令牌和完成跟踪数据库。全新卷中这些一个都没有,而密码登录回退会被限速,导致 15-30 分钟的锁定。

如果你完全不想在磁盘上保留 .env,也可以改为通过环境变量传递凭据。挂载仍然是必需的——它保存的是令牌缓存,而不仅仅是 .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

逐个列出变量名而不带值,会从你的 shell 中原样传递,因此命令或 shell 历史中不会出现任何机密。这些覆盖已挂载的 .env:文件加载时不使用 override,因此环境中已有的任何内容都会优先。授权仍然需要这些变量在主机上导出,因为 auth 同样没有 .env 可读。

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 是仅有的另一个子命令,它的存在是为了让浏览器步骤在终端中发生,而不是在服务器内部。所有任务操作都通过下面的 MCP 工具进行。

MCP 工具

工具

描述

ticktick_create_task

创建任务,保留日期/提醒/优先级/时区字段;如果没有设置截止日期,则发出警告(因为没有截止日期就不会触发提醒)

ticktick_update_task

通过只把你设置的字段叠加到当前服务器对象上来更新任务(省略的字段永远不会被清除)

ticktick_complete_task

将任务标记为完成并重新验证;区分循环任务向前滚动与正常完成

ticktick_delete_tasks

按 ID 删除一个或多个任务

ticktick_move_task

将任务移动到另一个项目

ticktick_make_subtask

将一个任务嵌套为同一项目中另一个任务的子任务

ticktick_get_tasks_from_project

列出项目中的所有未完成任务(紧凑或完整)

ticktick_filter_tasks

按项目、优先级、标签、状态以及截止/完成日期窗口的任意组合查找任务

ticktick_get_by_id

按完整 ID 查找任何任务、项目或标签

ticktick_get_all

从本地状态导出所有项目或所有标签

ticktick_sync

强制立即从服务器刷新本地状态

ticktick_get_unprocessed_completions

列出项目中最近完成但尚未标记为已处理的任务

ticktick_mark_completion_processed

记录已完成任务已被审查,将其排除在未来的检查之外

ticktick_convert_datetime_to_ticktick_format

将 ISO 8601 日期时间 + IANA 时区转换为 TickTick 的传输格式

项目:名称或 ID

每个接受项目 ID 的工具也接受项目的名称——ticktick_create_task、ticktick_get_tasks_from_project、ticktick_update_task、ticktick_move_task、ticktick_delete_tasks、ticktick_filter_tasks,以及两个完成跟踪工具:

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

名称匹配不区分大小写,并忽略周围空白,"Inbox" 会解析到你的收件箱。ID 继续按原样工作并且始终优先,所以任何现在能用的用法都不会改变。

唯一新增的错误是歧义:如果两个项目同名,调用会失败,并同时报出两个 ID,而不是二选一——因为猜测会把任务放到你根本不会想到去找的地方。服务器无法解析的其他任何内容都会原封不动地传给 API,和之前完全一样。

这两个完成追踪工具是例外:它们会拒绝一个无法确认的项目引用,而不是继续传递下去,因为该引用正是它们本地数据库的写入键。一个无法解析的引用会写入一行之后按 ID 查找也无法找到的记录。如果项目列表无法刷新以进行核查,它们会如实说明(outcome: "project_list_unverifiable"),而不是声称该项目不存在。

列出任务:紧凑输出为默认

返回列表的工具 ticktick_get_tasks_from_project 和 ticktick_filter_tasks 默认使用 detail="compact"。紧凑输出保留与浏览相关的字段(id、projectId、title、dueDate、startDate、priority、status、isAllDay、timeZone、tags),外加一个 contentPreview(content 的前约 200 个字符),并丢弃占用较大的 content/desc/checklist items 数据块以及庞大的同步元数据。这让大型项目保持在 com生成 MKP result 大小上限以下,客户端无需将结果溢出到磁盘。关键字搜索仍然基于 title 和 contentPreview 进行。

  • 需要完整对象?传入 detail="full"。

  • 需要某个任务的完整内容?使用 ticktick_get_by_id。

  • 编辑任务: 先用 ticktick_get_by_id 获取完整对象,再通过 ticktick_update_task 将所有字段传回。TickTick API 会清除任何更新中省略的字段,因此紧凑输出绝不能用于更新操作。

如果紧凑结果仍然超过大小预算,则返回最早到期的任务,并由最后的 _truncation_note 元素报告省略了多少——没有任何内容会被静默丢弃。其余任务可用范围更窄的 ticktick_filter_tasks 查询、detail="full" 或 ticktick_get_by_id 获取。

数据新鲜度:读取保持最新

TickTick 账户在服务器运行时,可能会被其他设备上的应用所编辑。为了避免读取到过期数据,读取工具会按需重新同步状态,每时间窗口至多执行一次(默认 15 秒,可通过 TICKTICK_MCP_SYNC_TL_SECONDS 覆盖)。在其他设备上产生的更改会在该窗口内可见;调用 ticktick_sync 可以强制立即刷新并获取当前的任务/项目计数。如果如果同步失败,则返回最后已知状态而不是报错——但 ticktick_get_all 除外,它会在每次调用都刷新并在失败时报告失败,因为全量导出转储并不适合静默提供过期数据。

配置

变量

默认值

描述

TICKTICK_MCP_DOTENV_DIR

~/.config/ticktick-mcp/

存放 .env、缓存的令牌以及完成追踪数据库的目录(--dotenv-dir 参数优先)。容器镜像将其设置为 /data

TICKTICK_MCP_SYNC_TTL_SECONDS

15

按需读取重新同步之间的最小秒数

TICKTICK_MCP_INIT_RETRY_SECONDS

60

首次连接失败后重试客户端登录之前的冷却时间

TICKTICK_MCP_RATELIMIT_RETRY_SECONDS

300

限频(HTTP 429)后重试登录之前的冷却时间;比初始化冷却更长,因为 429 清除缓慢,而且每次重试都会延长清除时间

TICKTICK_MCP_PROTECTED_TASK_IDS

未设置

智能体绝不能修改的任务 ID,以空格或逗号分隔。每个修改工具都会在发送任何内容之前报拒;读取不受影响。未设置表示没有保护

保护任务不被修改

某些任务无论如何被要求执行,都绝不应被智能体修改。在 TICKTICK_MCP_PROTECTED_TASK_IDS 中列出它们的 ID:

TICKTICK_MCP_PROTECTED_TASK_IDS="60ca9dbc8f08516d9dd56324,60ca9dbc8f08516d9dd56325"

ticktick_update_task、ticktick_complete_task、ticktick_delete_tasks、ticktick_move_task 和 ticktick_make_subtask 随后会拒绝任何指定受保护任务的调用,并返回 outcome: "protected_task"。不会发送任何读取或写入该任务的请求。包含受保护 ID 的批量删除会被整体拒绝,而不会被部分执行,因为部分删除无法撤销。

由于 TickTick 会通过子任务传播 delete 和 move,因此当受保护的任务是所指定任务的父任务或子任务时,delete、move 和 make_subtask 也会拒绝。检查会先刷新本地状态,因此在配置了保护的期间,每次删除、移动或重设父任务都会增加一次请求——如果刷新失败,则返回 outcome: "protection_unveritable",因为在无法更新的快照上无法排除受保护的子任务。未设置该变量时,它不会做任何额外工作。ID 匹配会忽略两端空白、引号和大小写。读取受保护的任务始终有效。

凭据(TICKTICK_CLIENT_ID、TICKTICK_CLIENT_SECRET、TICKTICK_REDIRECT_URI、TICKTICK_USERNAME、TICKTICK_PASSWORD)从 .env 文件中读取;如果没有,则直接读取环境变量。

数据安全

pre-commit 钩子(scripts/check-no-data.sh)会阻止意外提交数据库、凭据和大文件:*.db 及备份变体、config/ 下除 .gitkeep 和 *.example* 之外的所有内容,以及超过 100KB 的文件(uv.lock 除外)。克隆后安装它:

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

参与贡献

开发环境设置、测试工作流和 pre-commit 钩子请见 CONTRIBUTING.md。变更记录在 CHANGELOG.md 中。

许可证

GPL-3.0-ore-later

Available Tools

14 tools
ticktick_complete_taskA

Mark a task as completed.

Completing a task here also records it as processed, so it does not come back from ticktick_get_unprocessed_completions. That queue is for completions made elsewhere, where a note may be waiting to be read. There is no need to call ticktick_mark_completion_processed afterwards.

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. completion_recorded reports whether the local record was written. Present only when a non-recurring task completed; absent wherever nothing was recorded, which is every recurring completion and outcome: "uncertain". The task is complete either way. 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. - A recurring task's completion is never recorded, whatever the outcome: completing one files the completed instance under an id this tool never sees. That instance reaches the unprocessed queue. Do not mark the series id processed by hand instead; it is not the id the queue is showing.

Example: ticktick_complete_task(task_id="60ca9dbc8f08516d9dd56324")

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

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 carries the full behavioral burden and does so thoroughly. It discloses side effects (recording as processed), recurring-task completion never being recorded, content immutability after completion, verification warnings, and the exact semantics of completion_recorded and error responses.

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 long but every section earns its place: a one-sentence summary, side-effect and routing guidance, parameter definition, detailed return semantics, critical limitations, and a concrete example. The structure with Args, Returns, Limitations, and Example makes the information 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?

For a mutation tool with no annotations and a single parameter, the description is unusually complete. It covers when to use the tool, what side effects occur, edge cases around recurring tasks, immutability caveats, return shapes for success and failure, and includes an example call.

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 coverage is 0%, so the description must compensate. The Args section adds the meaningful detail that task_id is the task's full ID, and the example supplies a concrete value. It could go further by explaining how to find the full ID or distinguishing it from a series ID, but for a single simple parameter this is adequate.

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 specific verb-resource pair: "Mark a task as completed." It then distinguishes itself from sibling tools by explaining that completing here also records the task as processed, so it does not appear in ticktick_get_unprocessed_completions and does not require ticktick_mark_completion_processed.

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 addresses when to use this tool versus alternatives: it notes that the unprocessed-completions queue is for completions made elsewhere, and states there is no need to call ticktick_mark_completion_processed afterwards. The Limitations section also instructs updating content before completing, implying the alternative of updating first.

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. _verification_warnings carries everything worth knowing about what landed: a response that did not match what was sent, a due date that is missing and so will fire no reminder at all or all-day and so no timed one, a title character TickTick parses as a marker, and content longer than the compact preview. 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 provided, the description fully carries the behavioral burden and does so richly. It discloses the builder() limitation that can omit fields and the re-population behavior, explains the _verification_warnings return mechanism, and describes failure responses, giving the agent a strong model of what happens when the tool is invoked.

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 long but every section earns its place for a 14-parameter creation tool. It is organized into Args, Returns, Limitations, Agent Usage Guide, and Example, with the core purpose front-loaded in the first sentence and details logically grouped.

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 high complexity, zero annotations, and 14 parameters, the description covers all required invocation knowledge: parameter semantics, constraints, return shape, failure format, known limitations, and a realistic example. Nothing essential for correct use is missing.

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%, so the description must compensate entirely for the bare input schema. It does: every parameter is explained with types, defaults, formats, and constraints, including priority value mapping, RRULE syntax, reminder trigger strings, timezone defaults, and the expected_day_of_week requirement. This is far beyond what the schema 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 description opens with 'Create a new task,' a specific verb and resource that clearly identifies the operation. It is unambiguously distinct from sibling tools like ticktick_update_task, ticktick_complete_task, and ticktick_delete_tasks, and the detailed parameter list reinforces the creation scope.

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 concrete invocation guidance, including the mandatory pairing of due_date with expected_day_of_week and how to resolve project_id via ticktick_get_all. It does not explicitly state when not to use this tool versus alternatives, but the creation-specific purpose makes the primary usage context clear.

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. No value below reaches the query unchecked, and any key not on this list is an error rather than something ignored, so a mistyped key fails loudly. 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, and so is a project the
      account does not have.
    * ``priority`` (int): 0=None, 1=Low, 3=Medium, 5=High. Must be
      a JSON integer; the string ``"3"`` and the float ``3.0`` are
      errors, as is any other value.
    * ``tag_label`` (str): Tag name (case-sensitive), non-empty.
      Surrounding whitespace is trimmed.
    * ``due_start_date`` / ``due_end_date`` (str): ISO date or
      datetime strings; only used when ``status='uncompleted'``.
      A value that cannot be read as a date is an error, so a
      window is never silently dropped, and a window that ends
      before it begins is an error too. Bounds apply at day
      granularity, so any time part is ignored rather than
      validated.
    * ``completion_start_date`` / ``completion_end_date`` (str):
      ISO date or datetime strings; only used when
      ``status='completed'``. Same date rules as above.
    * ``tz`` (str): Default IANA timezone applied to date filters,
      e.g. ``"Europe/London"``. A name that does not resolve is an
      error rather than being ignored, so results are never
      labelled with a zone that was not applied.
    * ``sort_by_priority`` (bool): Sort by descending priority.
      Must be a JSON boolean; the strings ``"true"``/``"false"``
      and ``1``/``0`` are errors.

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"}. One error carries an extra key: outcome: "project_list_unverifiable" means the project list could not be refreshed to confirm project_id, so retry rather than concluding the project is gone.

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

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 carries the full burden and meets it: it discloses local-vs-live data sources, throttle-window freshness, strict validation failures ("any key not on this list is an error"), truncation with a _truncation_note, the error envelope format, and the project_list_unverifiable retry case. Nothing is dropped silently and side effects are clearly absent.

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 long, but the length is justified by the bare schema and the tool's genuine complexity, and it is well organized with headers, bullet lists, and a dedicated Agent Usage Guide. Minor redundancy — the truncation note and throttle window appear twice — keeps it from a perfect score.

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 filtering tool paired with an almost-empty input schema and no annotations, it is exceptionally complete: full parameter semantics, validation and error contracts, freshness behavior, server-side caps, client-side filtering caveats, and three worked examples. The Returns section even documents the truncation and error shapes despite an output schema being present.

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% (filter_criteria has no type at all), so the description must fully compensate — and it does, documenting every recognized key with types, defaults, allowed values (priority 0/1/3/5), strict type rules (string "3" and float 3.0 rejected), date/timezone validation, and which keys apply to which status. The detail parameter's compact/full trade-off is also precisely explained.

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?

Opens with a specific verb and resource — "Return the tasks matching every supplied filter criterion" — making the tool's role immediately clear. The Agent Usage Guide examples and cross-references (e.g., to ticktick_get_by_id, ticktick_update_task, ticktick_sync) further set it apart from its siblings.

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 tells the agent when to use alternatives: fetch full objects with ticktick_get_by_id before editing, send every field back via ticktick_update_task, and call ticktick_sync to force a refresh when local state may be stale. Three concrete invocation examples with JSON show exactly when this tool should be chosen.

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 an empty object {} if nothing has that id. Branch on emptiness. 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.8/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 it delivers. It discloses the empty-object return for missing IDs, the error envelope on failure, and the critical cache-freshness behavior with a sync threshold and a remedy. This goes well beyond what the tool name or schema reveals.

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 useful sections: Args, Returns, Freshness, and Example. Every sentence adds value, especially the actionable 'Branch on emptiness' and the sync threshold. It is thorough without being padded.

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 single-parameter lookup tool with an output schema already present, the description covers everything needed to call it correctly: what the parameter means, what success looks like, what failures look like, and how staleness can affect results. No critical guidance is missing.

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 must compensate. It explains that obj_id is 'The object's full ID,' adds the expected type, and provides a concrete example with a valid-looking ID. This gives the agent more semantics than the bare schema's 'Obj Id' title.

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 specific verb and resource: 'Look up any object (task, project, tag) by its ID.' This clearly distinguishes the tool from siblings like ticktick_get_all and ticktick_get_tasks_from_project because it is the generic ID-based lookup. The scope is explicit and actionable.

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 makes the primary use case clear: call this when you have a full ID and need that specific record. It also tells the agent to call ticktick_sync when a fresher result is needed, which is a useful usage condition. It stops short of explicitly naming alternatives or stating when not to use this tool, so it earns a 4 rather than a 5.

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.

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 )

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 carries the full behavioral burden, and it delivers. It clearly explains the unprocessed state, the downstream marking step, why tasks completed via ticktick_complete_task are excluded, and subtle recurring-completion behavior. These details go well beyond a simple 'returns tasks' statement and give the agent an accurate mental model of side effects and data provenance.

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 clear sections (description, args, returns, usage guide) and every sentence adds value. The key semantics are front-loaded, the parameter meanings are thorough, and the usage guide is practical without being padded.

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 two-parameter schema, zero annotation coverage, and output schema presence, the description is complete enough for correct invocation. It covers the return shape, error format, parameter semantics, workflow context, and edge cases such as duplicate project names and recurring completions. An agent can confidently select and call this tool based on the description alone.

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 must compensate fully, and it does. project_id is documented as required and accepts an ID or a case-insensitive, trimmed name with 'Inbox' resolution and an explicit duplicate-name error. days is given a precise meaning ('How many days back to look for completions') and its default of 30 is stated. The included example further clarifies invocation.

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 precise, specific statement: 'Returns completed tasks for a project that have NOT yet been marked as processed by a domain agent.' It clearly identifies the resource (completed tasks), the condition (unprocessed), and the scope (per project). It also distinguishes itself from related tools like ticktick_complete_task and ticktick_mark_completion_processed by explaining what it does and does not include.

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 tells the agent when to call it ('at the beginning of each conversation'), how often ('Call once per project'), and what to do after each invocation ('call ticktick_mark_completion_processed'). It also gives an explicit exclusion: tasks completed through ticktick_complete_task are already recorded, so this tool targets completions from outside the MCP workflow. This is strong, actionable routing guidance.

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 when the response did not match what we sent, and when status: 0 was set but the local completion record could not be cleared. The second one says nothing about whether the update itself landed. On failure: {"error": "...", "status": "error"}.

Limitations: - Read-only API fields (creator, etag, createdTime, modifiedTime, deleted, kind, isFloating) are stripped before the call. - Setting status: 0 also clears any local record of this task's earlier completion, so a later completion is surfaced by ticktick_get_unprocessed_completions again. A clear that fails is reported in _verification_warnings.

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

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 behavioral burden and does so thoroughly: it reveals the destructive API behavior, the fetch-then-overlay mechanism, read-only fields being stripped, and the side effect that setting status: 0 clears local completion records. It also explains the meaning of _verification_warnings and failure responses.

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 long but densely informative and well organized with Args, Returns, Limitations, Agent Usage Guide, and Example sections. It is front-loaded with the most critical fact—the update-merge behavior—and each section earns its place by explaining a real operational pitfall.

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—API replace semantics, conditional field requirements, side effects on completion records, and verification warnings—the description covers every essential aspect an agent needs to call it correctly. The output schema exists, so not describing return values in detail is acceptable, and the failure format is explicitly covered.

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%, so the description must compensate, and it does: it states id is mandatory, all other task_object fields are optional, only explicitly set fields are changed, and dueDate requires expectedDayOfWeek. The concrete reschedule example further clarifies how the parameters combine, and the status-0 limitation gives behavioral meaning to a parameter value.

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 first line states a specific action and resource: 'Update an existing task without wiping unmodified fields.' This distinguishes it from siblings like create, delete, complete, and move, and the merge behavior is a defining feature. An agent immediately knows what the tool is for.

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 Agent Usage Guide explicitly says to reschedule a task by sending a single update with the new dueDate and expectedDayOfWeek, and warns 'Do NOT complete and recreate.' This gives concrete when-to-use guidance and names the anti-pattern to avoid, which is strong alternative differentiation even without enumerating every sibling.

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.

  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.6/5.0

Scored across 14 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers