ticktick-mcp
ticktick-mcp
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 のアカウント
OAuth 認証情報用に登録した TickTick アプリ(無料 - 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 のフォークは dependencies 内に直接 Git 参照として固定されており、pip と uv の両方でそのまま使用されます。uv sync を推奨するのは、解決をやり直さずに uv.lock の正確なバージョンをインストールできるためです。
認証情報の設定
TickTick へのサインインには2つが必要です: OAuth アプリ(クライアント ID + シークレット)と、ご自身のアカウントのログイン情報です。
developer.ticktick.com でアプリを登録します。リダイレクト URL は
http://localhost:8080/redirectに設定してください。クライアント ID(Client ID) と クライアントシークレット(Client Secret) を控えておきます。テンプレートをサーバーが読み取るディレクトリにコピーし、内容を入力します:
mkdir -p ~/.config/ticktick-mcp && cp .env.example ~/.config/ticktick-mcp/.envTICKTICK_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このファイルにはアカウントのパスワードが平文で保存されます。また、サーバーはこのファイルを作成しないため、ご自身でアクセスを制限してください。POSIX では:
chmod 700 ~/.config/ticktick-mcp chmod 600 ~/.config/ticktick-mcp/.envこれらは POSIX のアクセス権ビットであり、Windows では効果がありません。Windows でのアクセスは、親ディレクトリからファイルが継承する ACL に従います。この2つのコマンドに対応する Windows の同等コマンドは、ここでは説明しません。
また、その隣に作成される2つのトークンファイルは所有者のみのアクセス権で作成され、サーバーが作成する設定ディレクトリも同様です。ただし、既に存在する設定ディレクトリはそのまま残されます。これらも POSIX の権限モードであり、Windows でも設定されますが、Windows では誰が何を読むことができるかを絞ることはありません。
サーバーを登録する前に、一度だけターミナルで認証してください:
.venv/bin/ticktick-mcp authブラウザが開き、リダイレクト先の URL を貼り戻すよう求められ、その後終了します。トークンは .env の隣に .token-oauth としてキャッシュされ、以降の起動時に再利用されます。TickTick はリフレッシュトークンを発行しないため、トークンの期限切れ時にこの手順を繰り返します - 同じコマンドをもう一度実行してください。
この手順を MCP サーバー内で行わないでください。プロンプトは標準入力を読み取るためです。stdin サーバーの標準入力は JSON-RPC チャネルであるため、未認証の最初のツール呼び出しでホスト上でブラウザが開き、ブロックされます。コンテナ内では完了させられせん - ホスト上で auth を実行し、設定ディレクトリをマウントしてください。
ユーザー名とパスワードの部分には個別の手順は不要です。サーバーは最初のツール呼び出しで遅れてログインし、そのセッショントークンを .token-v2 としてキャッシュするため、毎回の起動で資格情報を再送信する必要はありません。
サーバーが .env を探す順序は次のとおりです: --dotenv-dir <path> 引数、次に TICKTICK_MCP_DOTENV_DIR 環境変数、最後に ~/.config/ticktick-mcp/ です。.env が見つからない場合、サーバーは直接 TICKTICK_* 環境変数にフォールバックします。これはコンテナや CI での使用に便利です。
プライバシーと非公式 API
TickTick の資格情報はローカルの .env(または環境変数)にのみ保存され、TickTick 自体のサーバーにのみ送信されます。開発者や第三者に送信されることはありません。このサーバーが読み書きをするのは、あなた自身のアカウントのみです。
このサーバーは公式の TickTick ではなく、TickTick の非公式 v2 API(ticktick-py 経由)を使用しています。これには YouTube という意図的な選択。公式 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--dotenv-dir は、.env が ~/.config/ticktick-mcp/ に置かれている場合、または TICKTICK_* 変数を環境で与える場合には省略できます。
その後、Claude に次のように依頼してみてください:
"今週の TickTick リストに何がありますか?"
"金曜日の午前9時に歯医者に電話するタスクを追加して。"
"買い物タスクを完了にして。"
"予算タスクを Finance プロジェクトに移動して。"
Docker
イメージは ghcr.io/partymola/ticktick-mcp に公開されています。タグは v 接頭辞(:vX.Y.Z)を持ち、:latest は最新のリリースに追従します。
まずブラウザのあるマシンで認証し、そのディレクトリをマウントします。 これが唯一の方法であり、docker run -it でも同様です。基盤のライブラリがブラウザを自動的に開き、URL を決して出力しないため、ブラウザのないコンテナから持ち替える情報はありません。その後は標準入力でその URL を待受診ますが、stdio サーバーの標準入力は JSON-RPC チャネルです。つまり、トークンのキャッシュがないディレクトリで起動したコンテナも正常には失敗せず、クライアントの要求を役立てて、到着しない入力を待ち続けることになります。
認証にはソースからインストール(Install)と、 認証情報 が必要です。認証を実行できる公開原稿はありません。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 はセッショントークンキャッシュを更新できなくなり、起動時にスロットル付きの再度ログインにフォールバックします。後でホスト上で auth を再実行する必要があります。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各変数を値なしで指定するとシェルから渡されるため、コマンドラインやシェル履歴に秘密情報が表示されません。これらの変数はマウントされた .env より優先されます: .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 versionauth は唯一の他のサブコマンドで、ブラウザでのステップをサーバーではなくターミナルで実行できるようにします。タスクに関わる処理はすべて、以下の MCP ツールを使って行われます。
MCP ツール
Tool | Description |
| タスクを作成します。日付 / リマインダー / 優先度 / タイムゾーンのフィールドを維持し、期限が設定されていない場合は警告します(リマインダーが発火しないため) |
| 設定したフィールドのみを現在のサーバーオブジェクトに上書きしてタスクを更新します(省略したフィールドが消えることはありません) |
| タスクを完了状態にし、再検証します。通常の完了と、繰り返しタスクが次回へ繰り越される場合を区別します |
| ID によって一つ以上のタスクを削除します |
| タスクを別のプロジェクトに移動します |
| 同じプロジェクト内で、あるタスクを別のタスクのサブタスクとして入れ子にします |
| プロジェクト内のすべての未完了タスクを一覧表示します(コンパクトまたは完全表示) |
| プロジェクト、優先度、タグ、ステータス、期限/完了日の窓の任意の組み合わせでタスクを検索します |
| 完全な ID で任意のタスク、プロジェクト、タグを確認します |
| ローカル状態からすべてのプロジェクトまたはすべてタグを出力します |
| サーバーからローカル状態の即時を強制します |
| プロジェクト内で最近完了したタスクのうち、まだ処理済みではない物を一覧します |
| 完了タスクをレビュー済みとして記録し、今後の検査から除外します |
| 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" は inbox に解決されます。ID は従来通り動作し、常に名前より優先されるため、今日動作しているものは何も変わりません。
新たなエラーは曖昧さだけです。2つのプロジェクトが同名の場合、どちらかを選ばずに呼び出しは失敗し、両方の ID を名指しします。推測すると、見事に知らないような場所にタスクをまとめてしまうからです。それ以外にサーバーで解決できない部分は、これまでと同様に API にそのまま渡されます。# ticktick-mcp
TickTickのタスク管理のためのMCPサーバーです。TickTick v2 APIを介して、タスクの作成、更新、完了、移動、フィルタリングを行います。フィールドを保持する更新、曜日の日付検証、書き込み後の読み取り検証、冪等な完了追跡を備えています。
Claude Code や他の MCP クライアント向けに設計されています。
非公式です。TickTick Ltd.とは関係ありません。ticktick-py(MIT)に基づいて構築されています。
機能
完全なタスクライフサイクル - 作成、更新、完了、移動、サブタスク化、削除
フィールドを保持する更新 -
ticktick_update_taskはタスクを再取得し、設定したフィールドのみを重ね合わせます。省略したフィールドが API によって消去されることはありません曜日の検証 - 日付を設定するすべての呼び出しで曜日を確認し、1日ずれた日付のミスをサーバーに届く前に検出します
書き込み後の読み取り検証 - 作成/更新後にタスクを読み直し、サーバーの応答が一致しない場合は
_verification_warningsを表示しますコンパクトな一覧表示 - 一覧ツールはデフォルトで簡潔なビューを返すため、大きなプロジェクトでも MCP の結果サイズ上限を超えません(下記参照)
最新の読み取り - 読み取りツールは要求に応じてサーバー状態を再同期するため、他のデバイスの TickTick アプリで行った編集が再起動なしに反映されます
完了の追跡 - 完了したタスクを「処理済み」とマークすることで、エージェントが各タスクをちょうど一度ずつ確認できます
必要条件
Python 3.13+
uv(推奨 - 下記のインストール注参照)
TickTickアカウント
OAuth 認証情報用に登録済みの TickTick アプリ(無料 - 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 のフォークは dependencies 内で直接 Git 参照として固定されており、pip と uv の両方がそれを尊重します。uv sync が推奨されるのは、uv.lock 内の正確なバージョンを再解決せずにインストールするためです。
認証情報
TickTick へのサインインには2つのものが必要です: OAuth アプリ(クライアント ID とシークレット)と、ご自身のアカウントのログインです。
developer.ticktick.com でアプリを登録します。リダイレクトURI を
http://localhost:8080/redirectに設定します。クライアント ID と クライアントシークレット をメモします。テンプレートをサーバーが読み取るディレクトリにコピーし、内容を記入します:
mkdir -p ~/.config/ticktick-mcp && cp .env.example ~/.config/ticktick-mcp/.envTICKTICK_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このファイルにはアカウントのパスワードが平文で保存されます。サーバーはこのファイルを作成しないため、ご自身でしっかりと保護してください。POSIX では:
chmod 700 ~/.config/ticktick-mcp chmod 600 ~/.config/ticktick-mcp/.envこれらは POSIX のモードビットであり、Windows では何も行いません。Windows でのアクセスは、親ディレクトリからファイルが継承する ACL に従います。この2つのコマンドに相当する Windows の方法はここでは説明していません。
その隣にある2つのトークファイルは、所有者のみがアクセスできる状態で作成されます。サーバーが作成する設定ディレクトリも同様ですが、既に存在する設定ディレクトリはそのまま変更されません。これらも POSIX モードであり、Windows でも設定されますが、Windows では読み取りの範囲を狭めることはありません。
サーバーを登録する前に、ターミナルで一度だけ認証してください:
.venv/bin/ticktick-mcp authこれによりブラウザが開き、表示された URL を貼り付け戻すよう求められ、その後終了します。トークンは .env の隣に .token-oauth としてキャッシュされ、以降の起動では再利用されます。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 自体のサーバーにのみ送信されます - 開発者や第三者に送信されることは一切ありません。サーバーが読み書きするのは、あなた自身のアカウントのみです。
このサーバーは公式の Open API ではなく、TickTick の非公式 v2 API(ticktick-py 経由)を使用しています。これは意図的な選択です。公式 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--dotenv-dir は、.env が ~/.config/ticktick-mcp/ にある場合、または TICKTICK_* 変数を環境変数で提供する場合は省略できます。
その後、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 は必須です - サーバーは標準入力と標準出力で 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各変数を値なしで指定することで、シェルからそのまま渡されるため、コマンドやコマンドや環境シェル履歴に秘密が表示されません。これらはマウントされた .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 versionauth はもう唯一の別のサブコマンドであり、ブラウザのステップがサーバー内ではなく、ターミナルで行われるために存在します。すべてのタスク操作は、以下の MCP ツールを通じて行われます。
MCP ツール
| ツール | 説明 |
工具 | 説明 |
| タスクを作成し、日付/リマインダー/優先度/タイムゾーンのフィールドを保持します。期限が設定されていない場合は警告します(リマインダーが作動しない可能性) |
| 設定したフィールドだけを現在のサーバーオブジェクトに重ねて更新します(省略したフィールドが消えることはありません) |
| タスクを完了にマークして再検証します。繰り返しタスクが次回に繰り越されか通常完了か区別します |
| ID で1つ以上のタスクを削除します |
| タスクを別のプロジェクトへ移動します |
| 同じプロジェクト内の別のタスクのサブタスクとして入れ子にする |
| プロジェクト内の未完了タスクをすべて一覧表示(コンパクトまたは完全) |
| プロジェクト、優先度、タグ、ステータス、期限/完了日の窓をあらゆる組み合わせで検索します |
| 完全 ID でタスク、プロジェクト、タグを検索します |
| ローカル状態からすべてのプロジェクトまたはすべてのタグを出力します |
| サーバーからローカル状態を即座にリフレッシュします |
| プロジェクト内で最近完了し、まだ処理されてマークされていないタスクを一覧表示します |
| 完了したタスクがレビューされたことを記録し、将来のチェックから除外します |
| 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")名前は大文字と小文字を区別せず、周囲の空白を無視して一致し、ticktick は自分の受信トレイに解決されます。ID は引き続きそのまま動作し、常に優先されるため、現在動いているものの動作は変わりません。
新しいエラーは曖昧さだけです: 2つのプロジェクトが同じ名前を持つ場合、呼び出しは失敗し、片方を選ぶのではなく両方の ID を挙動します。 推測すると、タスクを見つかるとは思えない場所に保存することになるからです。サーバーが解決できない他のものは、従来どおり API にそのまま渡されます。
2つの完了追跡ツールは例外で、確認できないプロジェクト参照は渡すのではなく拒否します。なぜなら、その値がローカルデータベースが書き込まれるキーだからです。解決できない参照は、後で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/チェックリストのitemsブロブとかさばる同期メタデータを削除します。これにより、大規模なプロジェクトでもMCPの結果サイズ上限内に収まり、クライアントが結果をディスクにあふれさせる必要がなくなります。キーワード検索は引き続き title と contentPreview に対して機能します。
完全なオブジェクトが必要ですか?
detail="full"を渡してください。1つのタスクの完全なコンテンツが必要ですか?
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アカウントは他のデバイスのアプリから編集される可能性があります。読み取りが古くならないように、読み取りツールはオンデマンドでサーバー状態を再同期します。これはウィンドウあたり最大1回に制限されています(デフォルト15秒、TICKTICK_MCP_SYNC_TTL_SECONDS で上書き可能)。別の場所で行われた変更は、そのウィンドウ内で表示されます。ticktick_sync を呼び出すと、即時の更新を強制して現在のタスク/プロジェクト数を取得できます。同期が失敗した場合は、エラーにする代わりに最後に認識された状態を提供します。ただし、ticktick_get_all は例外で、毎回更新し、代わりに失敗を報告します。全量ダンプは、古い回答を静かに提供する場所としては不適切だからです。
設定
変数 | デフォルト | 説明 |
|
|
|
|
| オンデマンドの読み取り再同期の最小間隔(秒) |
|
| 最初の接続失敗後のクライアントログイン再試行までの待機時間 |
|
| レート制限(HTTP 429)後のログイン再試行までの待機時間。初期試行の待機時間より長いのは、429の解除に時間がかかり、再試行ごとにさらに延長されるためです |
| 未設定 | エージェントが決して変更してはならないタスクID。スペースまたはカンマで区切ります。すべての変更ツールは送信前に拒否します。読み取りは影響を受けません。未設定の場合は保護されません。 |
タスクの変更からの保護
一部のタスクは、エージェントが何を要求されても決して変更してはなりません。それらのIDを TICKTICK_MCP_PROTECTED_TASK_IDS にリストしてください:
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" を返します。タスクを読み書きするリクエストは送信されません。保護されたタスクを含む一括削除は、部分適用ではなく全体が拒否されます。部分的な削除は取り消せないためです。
TickTickは削除と移動をサブタスクに伝播させるため、delete、move、make_subtask は、指定したタスクの親またはサブタスクが保護されたタスクである場合も拒否します。このチェックは最初にローカル状態を更新するため、保護が設定されている場合、削除・移動・サブタスク作成のたびに1リクエスト追加されます。更新に失敗した場合は、更新できないスナップショットで保護されたサブタスクを排除できないため、outcome: "protection_unverifiable" を返します。変数が未設定の場合は追加の作業は一切行われません。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 に記録されています。
ライセンス
LICENSE(GPL-3.0-or-later)
Available Tools
14 toolsticktick_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")
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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", )
| Name | Required | Description | Default |
|---|---|---|---|
| tz | Yes | ||
| datetime_iso_string | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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, )
| Name | Required | Description | Default |
|---|---|---|---|
| desc | No | ||
| items | No | ||
| title | Yes | ||
| repeat | No | ||
| all_day | No | ||
| content | No | ||
| due_date | No | ||
| priority | No | ||
| reminders | No | ||
| time_zone | No | ||
| project_id | No | ||
| sort_order | No | ||
| start_date | No | ||
| expected_day_of_week | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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="", )
| Name | Required | Description | Default |
|---|---|---|---|
| task_ids | Yes | ||
| project_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 }
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | compact | |
| filter_criteria | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | compact | |
| search | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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")
| Name | Required | Description | Default |
|---|---|---|---|
| obj_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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="" )
| Name | Required | Description | Default |
|---|---|---|---|
| detail | No | compact | |
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 )
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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", )
| Name | Required | Description | Default |
|---|---|---|---|
| child_task_id | Yes | ||
| parent_task_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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" )
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| title | No | ||
| task_id | Yes | ||
| project_id | Yes | ||
| completed_time | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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="", )
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes | ||
| new_project_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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()
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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", })
| Name | Required | Description | Default |
|---|---|---|---|
| task_object | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 tool update
v0.1.1- Added
ticktick_sync
13 tool updates
v0.1.0- First observed
ticktick_complete_task - First observed
ticktick_convert_datetime_to_ticktick_format - First observed
ticktick_create_task - First observed
ticktick_delete_tasks - First observed
ticktick_filter_tasks - First observed
ticktick_get_all - First observed
ticktick_get_by_id - First observed
ticktick_get_tasks_from_project - First observed
ticktick_get_unprocessed_completions - First observed
ticktick_make_subtask - First observed
ticktick_mark_completion_processed - First observed
ticktick_move_task - First observed
ticktick_update_task
TDQS
Scored across 14 tools
Most tools have clearly separated roles (create/update/delete/complete/move/subtask/sync), and the paired completion-queue tools are well delineated. Minor overlap exists: ticktick_get_tasks_from_project duplicates a subset of ticktick_filter_tasks, and ticktick_get_all has a broken "tasks" branch that further muddies listing options. The detailed descriptions prevent most misselections.
All tools share the ticktick_ prefix and follow a verb-first snake_case convention such as filter_tasks, create_task, update_task, delete_tasks, and mark_completion_processed. Even utility tools like get_by_id, get_all, and sync fit the predictable pattern. No mixed casing or inconsistent verb styles.
14 tools sits at the upper edge of well-scoped for a task management server, and most earn their place. A few feel redundant or optional: get_tasks_from_project largely overlaps filter_tasks, convert_datetime_to_ticktick_format is only a convenience since create/update accept ISO strings directly, and get_all has an inert tasks branch.
The tool surface covers the core task lifecycle well: create, read/filter, update, delete, complete, move, subtasks, a completion-review queue, and forced sync. Notable gaps include no project management beyond listing, no explicit text/keyword search, and a broken get_all("tasks") branch that requires a workaround.
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
- mcpOAuthnet.todoist
Official Todoist MCP server for AI assistants to manage tasks, projects, and workflows.
Read and write Mission Control state via MCP — projects, tasks, subtasks, templates, status updates.
Related MCP Servers
- AlicenseCqualityDmaintenanceAgent-friendly CLI and MCP server for TickTick and Dida365 task management APIs, enabling project and task management with stable JSON output and OAuth authentication.171MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for TickTick API enabling task management, project organization, habit tracking, and more.74 npm73MIT
- FlicenseNot gradedqualityDmaintenanceRemote MCP server for managing TickTick tasks and projects, offering 22 tools for CRUD, search, and GTD workflows via any MCP client.1-
- AlicenseNot gradedqualityCmaintenanceA security-hardened MCP server for TickTick that enables managing your tasks directly through any MCP-compatible client.15 PyPI1MIT