{
 "slug": "ticktick",
 "name": "TickTick",
 "url": "https://ticktick.com",
 "domain": "ticktick.com",
 "category": "task-management",
 "category_name": "Task management",
 "tested_at": "2026-10-06",
 "run": "20261006T043833Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261006T043833Z",
   "date": "2026-10-06",
   "level": 3,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 2,
    "signed": true,
    "inbox": null,
    "robots": "start"
   }
  }
 ],
 "level": 3,
 "level_name": "Does the work",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "part",
   "text": "Work done: 57% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted"
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Find",
   "state": "part",
   "text": "Some docs agents can read: an MCP server",
   "have": [
    "mcp"
   ]
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up in a browser",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "part",
   "text": "Work done: 57% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the card form",
   "value": "ready",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [],
   "minutes": 7.3,
   "core": "4/7"
  }
 ],
 "minutes": 7.3,
 "next": {
  "to": 4,
  "text": "Next: do 80% of the core work (now 57%)"
 },
 "stop": null,
 "core": "4/7",
 "scores": {
  "coverage": 47,
  "reliability": 100,
  "resilience": null,
  "setup": 45,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": null,
  "docs_match": null,
  "setup": 45,
  "security": "private",
  "standards": [
   {
    "standard": "MCP",
    "state": "current",
    "behind": null,
    "value": "2026-07-28"
   },
   {
    "standard": "MCP discovery",
    "state": "current",
    "behind": null,
    "value": "ok"
   },
   {
    "standard": "MCP client registration",
    "state": "behind",
    "behind": null,
    "value": "dcr"
   }
  ]
 },
 "reliability_method": "first-try",
 "resilience": null,
 "stress": [],
 "surface_audit": null,
 "coverage_core": 57,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 2,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": null,
  "prompt_sha": "f3d0adeeb256",
  "kb_version": "2+overlay-9e43028a2c",
  "identity": null
 },
 "methodology": 15,
 "rules_date": "2026-10-15",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 2,
  "signed": true,
  "inbox": null,
  "robots": "start"
 },
 "same_level_drives": 1,
 "drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": null,
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-13"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "Public markdown API reference at developer.ticktick.com/docs/openapi.md; MCP help article on help.ticktick.com"
  },
  "signup": {
   "status": "browser",
   "note": "No sign-up API; web form (email + password) at /signup, no CAPTCHA, straight into the web app"
  },
  "verify": {
   "status": "headless",
   "note": "Welcome mail within 1 min; verify link worked with plain HTTP GET; verification not required to use the app"
  },
  "credentials": {
   "status": "browser",
   "note": "Personal API key made in Settings > Account > API Keys (docs say 'API Token'); OAuth is authorization_code only with browser consent, DCR registration, no device flow",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /open/v1/project with Bearer key -> 200"
  },
  "first_action": {
   "status": "headless",
   "note": "MCP create_task created a task, read back via GET /open/v1/project/{p}/task/{id}"
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe Checkout (card)"
   ],
   "rail_ids": [
    "stripe-checkout"
   ],
   "first_party": false,
   "rail_scope": "none",
   "trial_path": "free tier",
   "note": "No x402/MPP/UCP/402; no billing API; Premium US$4.99/month via Stripe Checkout with card fields (not paid)"
  },
  "cancel": {
   "status": "n/a",
   "grade": "n/a",
   "note": "Nothing to cancel: our agent used the free plan.",
   "docs_note": "No plan started on this drive; no billing API documented",
   "nothing": "free_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Settings > Account > Delete Account (2 confirmations + password); key 401 right after; no deletion API",
   "left": "deleted",
   "account": true
  }
 },
 "routes": [],
 "checkout": null,
 "docs": null,
 "claims": null,
 "pay_options": {
  "checked": "2026-10-06",
  "source": "drive",
  "options": [
   {
    "id": "stripe-checkout",
    "name": "Stripe Checkout",
    "kind": "checkout",
    "first_party": false,
    "lead": false,
    "networks": [],
    "testnet": false
   }
  ],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": null,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": false,
  "cli": false,
  "sdk": false,
  "mcp": "official",
  "llms_txt": false,
  "webhooks": false,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST /open/v1: tasks, projects, groups, columns, tags, comments, focus, habits, countdowns (read only)",
  "openapi": "no spec file; markdown reference only",
  "mcp": "official, 55 tools, the 28 Jul 2026 spec, OAuth or Bearer API key"
 },
 "can_do": [
  "Create, update, complete and delete tasks with priority, tags, reminders, repeat rules, checklists and subtasks",
  "Create lists, switch a list to Kanban and add columns",
  "Filter tasks by tag, priority and status",
  "Comment on tasks",
  "Log a pomodoro focus session on a task",
  "Create a habit and record check-ins"
 ],
 "cannot_do": [
  {
   "what": "Sign up or get an API key headless",
   "why": "Web form and web-app settings only; OAuth needs browser consent, no device flow"
  },
  {
   "what": "Create a countdown",
   "why": "API and MCP only list countdowns"
  },
  {
   "what": "See habit streaks for API-created habits",
   "why": "Habit not shown in the web app; API totalCheckIns stays 0"
  },
  {
   "what": "Delete the account headless",
   "why": "Web settings only"
  },
  {
   "what": "Buy Premium without a card",
   "why": "Stripe Checkout card form only"
  }
 ],
 "blockers": [
  "Sign-up and API key creation are web-only"
 ],
 "tips_for_owner": [
  "Offer a device flow for API access",
  "Return 4xx with clear validation errors",
  "Add countdown create, update and delete",
  "Show API-created habits and update streaks",
  "Reject Premium-only fields with clear errors",
  "Offer account deletion through the API"
 ],
 "tips_for_agents": [
  "Make a personal API key once in the web settings, then use MCP at https://mcp.ticktick.com (2026-07-28, Bearer key) or REST at api.ticktick.com/open/v1",
  "MCP argument names differ from REST (e.g. checklist_item_id); errors are clear pydantic messages",
  "Tagging a task does not create a tag object; POST /open/v1/tag if it must be listed",
  "Validation errors come as HTTP 500; read errorMessage",
  "Free plan silently drops task duration"
 ],
 "selfhost": null,
 "summary": "With a personal API key, an agent can drive TickTick's tasks, lists, tags, reminders, repeats, comments, Kanban, focus records and habit check-ins through the documented REST API or the official 28 Jul 2026 MCP server. Sign-up, key creation and account deletion need the web app; countdowns cannot be created and API-made habits did not show in the app. Premium is a card-only Stripe Checkout.",
 "wall": "API key only created in web app",
 "plan_scope": "free plan",
 "robots_stop": null,
 "robots": null,
 "plain": {
  "summary": "TickTick is a to-do list and productivity app. The agent signed up and made an API key in the web app itself (its own browser, no person needed), then ran almost everything else on its own: tasks, lists, tags, reminders, repeating tasks, checklists, comments, Kanban boards, timed focus sessions and habit check-ins, all through the documented API or the official automation server (MCP). Sign-up and the API key only exist as web-app steps, and paying only offers a card-based checkout page.",
  "can_do": [
   "Create, organize, tag, prioritize and repeat tasks",
   "Build lists and switch them to a Kanban board",
   "Leave comments on tasks and break them into checklists and subtasks",
   "Log a timed focus session on a task",
   "Set a reminder on a task",
   "Start a habit and record daily check-ins"
  ],
  "cannot_do": [
   {
    "what": "Sign up or get an API key without using the web app",
    "why": "No sign-up API; the key is only made in web settings, no device-login option"
   },
   {
    "what": "Create a countdown to a date",
    "why": "The product only lets the agent list countdowns, not create one"
   },
   {
    "what": "See streaks for habits the agent created",
    "why": "Those habits never appeared in the regular app"
   },
   {
    "what": "Delete the account without using the web app",
    "why": "No account-deletion endpoint exists"
   },
   {
    "what": "Pay for Premium without a card",
    "why": "Only a card-based checkout page is offered"
   }
  ]
 },
 "plan_gated": [
  {
   "capability": "View schedule in multiple calendar layouts",
   "plan": "Premium",
   "evidence": "ticktick.com/about/upgrade lists 'Multiple Calendar Views' under Premium; Free: Calendar View Basic"
  },
  {
   "capability": "Capture tasks by voice",
   "plan": "Premium",
   "evidence": "AI Features in the Premium column of the pricing compare table; no API"
  },
  {
   "capability": "Set a task's time duration",
   "plan": "Premium",
   "evidence": "Pricing page lists 'Task Duration' under Premium; API stored startDate=dueDate without error"
  }
 ],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "group": "Tasks",
   "capability": "Create and manage a task",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /open/v1/task",
    "mcp": "create_task (unverified, no public tools/list without account)",
    "cli": null,
    "ui": "task entry bar / quick-add dialog"
   },
   "check": "GET /open/v1/task/{taskId} returns the task with the given title",
   "source": "https://ticktick.com/home; https://developer.ticktick.com/ (Open API, OAuth2-gated)"
  },
  {
   "id": "cap-02",
   "group": "Lists",
   "capability": "Organize tasks into lists (projects)",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "GET/POST /open/v1/project",
    "mcp": null,
    "cli": null,
    "ui": "List sidebar"
   },
   "check": "GET /open/v1/project/{id}/data shows the task under that list",
   "source": "https://ticktick.com/features; https://ticktick.com/upgrade (List Count: 9 free / 299 premium)"
  },
  {
   "id": "cap-03",
   "group": "Calendar",
   "capability": "View schedule in multiple calendar layouts (yearly/monthly/weekly/agenda/multi-day/multi-week)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Calendar tab, view switcher"
   },
   "check": "UI: switching view mode re-renders the same tasks in yearly/monthly/weekly/agenda layout",
   "source": "https://ticktick.com/home; https://ticktick.com/upgrade (Multiple Calendar Views listed under Premium)"
  },
  {
   "id": "cap-04",
   "group": "Habits",
   "capability": "Track a habit with check-ins and streak stats",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Habits tab"
   },
   "check": "UI: habit shows updated streak/stat after a check-in",
   "source": "https://ticktick.com/home; https://ticktick.com/upgrade (Habit Count: 5 free / 299 premium)"
  },
  {
   "id": "cap-05",
   "group": "Focus",
   "capability": "Run a Pomodoro focus timer on a task",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Pomo/Focus panel"
   },
   "check": "UI: focus session appears in Statistics focus duration after completion",
   "source": "https://ticktick.com/home; https://ticktick.com/features"
  },
  {
   "id": "cap-06",
   "group": "Reminders",
   "capability": "Set a reminder/notification on a task",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > reminder picker"
   },
   "check": "UI: task detail shows the configured reminder time and a notification fires at that time",
   "source": "https://ticktick.com/features"
  },
  {
   "id": "cap-07",
   "group": "AI",
   "capability": "Capture tasks by voice (AI extracts dates/priorities, splits into multiple tasks)",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "quick-add mic / Voice Input"
   },
   "check": "UI: spoken capture produces one or more tasks with dates/priority pre-filled",
   "source": "https://ticktick.com/home (Voice Capture section)"
  },
  {
   "id": "cap-08",
   "group": "Countdown",
   "capability": "Track a countdown to an important date",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Countdown tab"
   },
   "check": "UI: countdown widget shows days remaining to the configured date",
   "source": "https://ticktick.com/home; https://ticktick.com/upgrade (Countdown Count: 5 free / 299 premium)"
  },
  {
   "id": "cap-09",
   "group": "Capture",
   "capability": "Auto-detect dates/times from typed text (NLP) when adding a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "quick-add input"
   },
   "check": "UI: typing 'tomorrow 3pm' in quick-add pre-fills the due date/time field",
   "source": "https://ticktick.com/features; https://ticktick.com/upgrade"
  },
  {
   "id": "cap-10",
   "group": "Views",
   "capability": "Switch a list between List / Kanban / Timeline / Eisenhower Matrix / Sticky Note views",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "list view switcher"
   },
   "check": "UI: same list's tasks re-render in Kanban columns or Timeline bars",
   "source": "https://ticktick.com/home; https://ticktick.com/features"
  },
  {
   "id": "cap-11",
   "group": "Organization",
   "capability": "Apply a smart filter (e.g. 'high priority this week')",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Filters panel"
   },
   "check": "UI: filter view shows only tasks matching the saved filter criteria",
   "source": "https://ticktick.com/home; https://ticktick.com/features"
  },
  {
   "id": "cap-12",
   "group": "Organization",
   "capability": "Add tags to a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > tags"
   },
   "check": "UI: tag appears on task and filtering by that tag returns the task",
   "source": "https://ticktick.com/features"
  },
  {
   "id": "cap-13",
   "group": "Tasks",
   "capability": "Add checklist items (subtasks within a task)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > checklist"
   },
   "check": "UI: checklist item count updates and checking one marks it complete",
   "source": "https://ticktick.com/upgrade (Checklist Item Count: 19 free / 199 premium)"
  },
  {
   "id": "cap-14",
   "group": "Tasks",
   "capability": "Attach a file to a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > attachment"
   },
   "check": "UI: attachment lists in task detail and is downloadable",
   "source": "https://ticktick.com/upgrade (Attachment Count: 1/day free, 199/day premium)"
  },
  {
   "id": "cap-15",
   "group": "Tasks",
   "capability": "Set task priority",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > priority flag"
   },
   "check": "UI: task shows the selected priority color/flag and sorts accordingly",
   "source": "https://ticktick.com/upgrade (comparison table, Priority row)"
  },
  {
   "id": "cap-16",
   "group": "Tasks",
   "capability": "Break a task into subtasks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > subtask"
   },
   "check": "UI: subtask nests under parent and parent shows subtask progress",
   "source": "https://ticktick.com/upgrade (comparison table, Subtask row)"
  },
  {
   "id": "cap-17",
   "group": "Reminders",
   "capability": "Set a recurring/repeat rule on a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > repeat"
   },
   "check": "UI: completing the task spawns the next occurrence per the repeat rule",
   "source": "https://ticktick.com/home; https://ticktick.com/upgrade (comparison table, Recurring Task row)"
  },
  {
   "id": "cap-18",
   "group": "Tasks",
   "capability": "Set a task's time duration / block time on the calendar",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > duration"
   },
   "check": "UI: task renders as a time block of the set length on the calendar",
   "source": "https://ticktick.com/upgrade (Task Duration listed under Premium)"
  },
  {
   "id": "cap-19",
   "group": "Collaboration",
   "capability": "Comment on a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > comments"
   },
   "check": "UI: posted comment appears in the task's comment thread",
   "source": "https://ticktick.com/upgrade (comparison table, Comment row)"
  },
  {
   "id": "cap-20",
   "group": "Organization",
   "capability": "Create a task/list from a template",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > template / list templates"
   },
   "check": "UI: new task/list is pre-filled with the template's structure",
   "source": "https://ticktick.com/upgrade (comparison table, Template row)"
  },
  {
   "id": "cap-21",
   "group": "Reminders",
   "capability": "Enable Constant Reminder (repeating alarm until task is completed)",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "task detail > reminder > constant reminder toggle"
   },
   "check": "UI: notification re-fires repeatedly until the task is marked done",
   "source": "https://ticktick.com/home; https://ticktick.com/features (Constant Reminder)"
  },
  {
   "id": "cap-22",
   "group": "Reminders",
   "capability": "Receive reminders by email",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "settings > notifications > email reminder"
   },
   "check": "Email reminder is delivered at the task's reminder time",
   "source": "https://ticktick.com/features (Email Reminder); https://ticktick.com/upgrade"
  },
  {
   "id": "cap-23",
   "group": "Collaboration",
   "capability": "Share a list with others and assign tasks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "list > share/members"
   },
   "check": "Shared member sees the list and an assigned task shows their name as assignee",
   "source": "https://ticktick.com/home (Collaboration); https://ticktick.com/upgrade (Member Count: 2 free / 29 premium)"
  },
  {
   "id": "cap-24",
   "group": "Notes",
   "capability": "Add a sticky note",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Sticky Note view"
   },
   "check": "UI: sticky note persists and is listed in the Sticky Note view",
   "source": "https://ticktick.com/home (Sticky Note feature card)"
  },
  {
   "id": "cap-25",
   "group": "AI",
   "capability": "Turn a recording into a transcript and AI summary",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Audio Summary"
   },
   "check": "UI: uploaded/recorded audio produces a transcript plus a structured summary",
   "source": "https://ticktick.com/home (Audio Summary section)"
  },
  {
   "id": "cap-26",
   "group": "Productivity",
   "capability": "Use keyboard shortcuts / command menu for quick actions",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "global shortcuts / command menu"
   },
   "check": "UI: shortcut key opens the command menu or performs the bound action",
   "source": "https://ticktick.com/home; https://ticktick.com/features (Keyboard Shortcuts)"
  },
  {
   "id": "cap-27",
   "group": "Integrations",
   "capability": "Subscribe to an external calendar / integrate with apps like Google Calendar, Notion",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "settings > calendar subscription / integrations"
   },
   "check": "UI: subscribed external calendar's events appear on the TickTick calendar",
   "source": "https://ticktick.com/home (Integration feature card); https://ticktick.com/features (Google Calendar)"
  },
  {
   "id": "cap-28",
   "group": "Insights",
   "capability": "View statistics (tasks completed, focus duration, habit logs)",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Statistics panel"
   },
   "check": "UI: statistics panel reflects a newly completed task/focus session/habit check-in",
   "source": "https://ticktick.com/home (Statistics feature card)"
  },
  {
   "id": "cap-29",
   "group": "Appearance",
   "capability": "Choose a visual theme",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "settings > theme"
   },
   "check": "UI: app chrome color changes to the selected theme",
   "source": "https://ticktick.com/home (Theme feature card, 40+ themes); https://ticktick.com/upgrade"
  },
  {
   "id": "cap-31",
   "group": "Capture",
   "capability": "Add/view tasks from a home-screen widget",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "mobile home-screen widget"
   },
   "check": "Task added via widget appears in the app's list",
   "source": "https://ticktick.com/features (Widgets)"
  },
  {
   "id": "cap-32",
   "group": "Capture",
   "capability": "Quick-add a task from email or a browser right-click selection",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "email plugin / browser extension context menu"
   },
   "check": "Selected text becomes a new task with that text as title",
   "source": "https://ticktick.com/features (Integrations: email plugin, browser right-click)"
  },
  {
   "id": "cap-33",
   "group": "Capture",
   "capability": "Add a task instantly via a global desktop shortcut",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "desktop app global hotkey"
   },
   "check": "Pressing the configured hotkey opens quick-add from any application",
   "source": "https://ticktick.com/features (Desktop Shortcut)"
  }
 ],
 "attempts": [
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "robots.txt / aipref",
   "task": "Fetch robots.txt",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "GET https://ticktick.com/robots.txt 200: User-agent: * Allow: / with Disallows (/static,/forum,/oauth,...); no Content-Usage or Content-signal lines",
   "notes": "no aipref"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "llms.txt",
   "task": "Fetch /llms.txt on ticktick.com and developer.ticktick.com",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "both 404 HTML",
   "notes": "no llms.txt"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "well-known cards",
   "task": "ai-catalog.json, agent-card.json, agent.json, mcp/server-card.json, ucp, auth.md, SKILL.md on ticktick.com",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "all 404 text/html",
   "notes": ""
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "OAuth AS metadata",
   "task": "GET /.well-known/oauth-authorization-server",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "ticktick.com 200 application/json: issuer https://ticktick.com, registration_endpoint https://api.ticktick.com/oauth/register (dynamic), grant_types authorization_code only, code_challenge_methods plain,S256; no client_id_metadata_document_supported, no device_authorization_endpoint, no agent_auth",
   "notes": "DCR only; no device flow"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "API docs",
   "task": "Read developer docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://developer.ticktick.com/docs/openapi.md (docsify markdown, 102 KB): Task, Project, Project Group, Column, Tag, Focus, Countdown, Habit, Comment endpoints under /open/v1; OAuth2 + personal API token (Settings > Account > API Token)",
   "notes": "Docs are a markdown page, not an OpenAPI spec file"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "markdown docs",
   "task": "Accept: text/markdown on docs page; .md URL",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "Accept: text/markdown on /docs/index.html -> text/html, no Vary: Accept; raw markdown served at /docs/openapi.md (application/octet-stream) because the docs are docsify",
   "notes": "markdown source exists as .md file"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "MCP server/discover",
   "task": "POST server/discover to https://mcp.ticktick.com/ unauthenticated",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "401 application/json, WWW-Authenticate: Bearer error=invalid_token, resource_metadata=https://mcp.ticktick.com/.well-known/oauth-protected-resource",
   "notes": "auth required; retry with token later"
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "MCP PRM",
   "task": "GET https://mcp.ticktick.com/.well-known/oauth-protected-resource",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/json {\"resource\":\"https://mcp.ticktick.com/\",\"authorization_servers\":[\"https://ticktick.com/\"],\"scopes_supported\":[\"tasks:write\",\"tasks:read\"]}",
   "notes": ""
  },
  {
   "t": "01:54",
   "cap": "discovery",
   "capability": "MCP server card",
   "task": "GET https://mcp.ticktick.com/server-card",
   "route": "mcp",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "404 text/plain Not Found",
   "notes": ""
  },
  {
   "t": "07:20",
   "cap": "docs",
   "capability": "Find docs",
   "task": "Find API docs",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://developer.ticktick.com/docs/openapi.md (public, no login); MCP help article https://help.ticktick.com/articles/7438129581631995904",
   "notes": ""
  },
  {
   "t": "07:20",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create account",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "No documented sign-up API/CLI; Open API docs require an existing TickTick account (OAuth or personal API token from web app). Only route is the web form.",
   "notes": "headless sign-up not offered"
  },
  {
   "t": "07:20",
   "cap": "signup",
   "capability": "Sign up",
   "task": "Create account via web form",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "https://ticktick.com/signup: email + password, Sign Up -> landed in /webapp/#p/inbox/tasks immediately; no CAPTCHA seen (captcha flags all false)",
   "notes": "no bot check met",
   "quality": {
    "error_legibility": "n/a"
   }
  },
  {
   "t": "07:20",
   "cap": "verify",
   "capability": "Verify email",
   "task": "Open verification link from welcome mail",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Welcome mail from noreply@mail.ticktick.com arrived within 1 min. - TickTick'",
   "notes": "Verification not required before use; done headless with plain HTTP"
  },
  {
   "t": "07:20",
   "cap": "credentials",
   "capability": "Get API credentials",
   "task": "Create personal API key",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Account > API Keys > Manage > Enable Key > name 'AgentDrives' > Add -> key tp_04cd…(masked), copied with the Copy button; docs call it 'Settings > Account > API Token' (UI says 'API Keys')",
   "notes": "No headless route: OAuth needs browser consent (authorization_code only, no device flow); DCR exists for MCP clients",
   "quality": {
    "docs_match": "drift"
   }
  },
  {
   "t": "07:20",
   "cap": "first_call",
   "capability": "First API call",
   "task": "GET /open/v1/project with bearer key",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 application/json [] (new account, no custom lists)",
   "notes": ""
  },
  {
   "t": "07:20",
   "cap": "discovery",
   "capability": "MCP server/discover (auth)",
   "task": "POST server/discover with bearer key",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "200 {\"result\":{\"supportedVersions\":[\"2026-07-28\"],\"capabilities\":{\"prompts\",\"resources\",\"tools\"}, serverInfo \"TickTick MCP Server\"}}; legacy initialize offering 2026-07-28 answers protocolVersion 2025-11-25",
   "notes": "modern stateless server"
  },
  {
   "t": "07:20",
   "cap": "discovery",
   "capability": "MCP tools/list",
   "task": "tools/list via 2026-07-28",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "55 tools: projects, tasks, habits, focus, columns, comments, countdowns (list only), project groups, tags, search/fetch",
   "notes": ""
  },
  {
   "t": "10:10",
   "cap": "first_action",
   "capability": "First real action",
   "task": "Create a task via MCP create_task",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "tools/call create_task -> task 6ac47d15… in inbox133815812; GET /open/v1/project/inbox133815812/task/6ac47d15… returned title 'AgentDrives MCP task', priority 3",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-01",
   "capability": "Create and manage a task",
   "task": "Create (MCP), read, complete, list completed, delete a task",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "MCP create_task -> id 6ac47d15…; API GET task 200 same title; POST /open/v1/project/{p}/task/{id}/complete -> status 2; POST /open/v1/task/completed lists it; DELETE -> 200",
   "notes": "After DELETE, GET by id still returns the task (status 2, no deleted flag): likely moved to trash; docs don't say",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match",
    "idempotent": "n/a"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-02",
   "capability": "Organize tasks into lists (projects)",
   "task": "Create list, add tasks, read list data",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/project -> 6ac47d1f… 'AgentDrives List'; POST /open/v1/task with projectId; GET /open/v1/project/6ac47d1f…/data shows both tasks",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-03",
   "capability": "View schedule in multiple calendar layouts",
   "task": "Calendar layouts",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "https://ticktick.com/about/upgrade: 'Multiple Calendar Views' listed under Premium (US$49.99/Year); Free has 'Calendar View: Basic'; no API for views",
   "notes": "UI-only and Premium"
  },
  {
   "t": "10:10",
   "cap": "cap-04",
   "capability": "Track a habit with check-ins and streak stats",
   "task": "Create daily habit, check in 3 days, read back",
   "route": "api",
   "documented": true,
   "result": "partial",
   "verified": true,
   "evidence": "POST /open/v1/habit -> 6ac47d6c…; POST /open/v1/habit/{id}/checkin stamps 20261004-06 status 2 -> 200; GET /open/v1/habit/checkins returns all 3 check-ins; but GET /open/v1/habit/{id} shows totalCheckIns 0, currentStreak null",
   "notes": "Check-ins verified; streak stats not reflected in API right after check-in",
   "quality": {
    "verify_route": "yes",
    "docs_match": "drift"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-05",
   "capability": "Run a Pomodoro focus timer on a task",
   "task": "Log a 25-min pomodoro on a task",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/focus type 0, taskId 6ac47d26…, 04:00-04:25 -> id 6ac47d78…, duration 1500000; GET /open/v1/focus/{id}?type=0 and GET /open/v1/focus?from..to both return it",
   "notes": "API records a completed focus session (no live timer start/stop); that is what the stats count",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-06",
   "capability": "Set a reminder/notification on a task",
   "task": "Task with reminder 15 min before",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/task reminders ['TRIGGER:-PT15M'] -> GET /open/v1/project/{p}/data shows reminders ['TRIGGER:-PT15M']",
   "notes": "Notification firing not observed (would be 8 Oct)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-07",
   "capability": "Capture tasks by voice",
   "task": "Voice capture",
   "route": "none",
   "documented": true,
   "result": "plan_gated",
   "verified": false,
   "evidence": "Map marks paid; pricing page lists 'AI Features' in Premium compare table; no API",
   "notes": ""
  },
  {
   "t": "10:10",
   "cap": "cap-08",
   "capability": "Track a countdown to an important date",
   "task": "Create a countdown",
   "route": "api",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "Docs only have GET /open/v1/countdown (returns []); no create endpoint in docs or MCP (only list_countdowns)",
   "notes": "No headless way to create a countdown",
   "quality": {
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-10",
   "capability": "Switch list to Kanban view",
   "task": "Switch list to kanban and add a column",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/project/6ac47d1f… viewMode kanban -> 200 viewMode kanban; POST /open/v1/project/{id}/column 'Doing' -> GET column lists it",
   "notes": "Timeline/Eisenhower not tried (Premium per pricing page)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-11",
   "capability": "Apply a smart filter",
   "task": "Filter high priority tasks with tag",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/task/filter {tag:[agentdrives],priority:[5],status:[0]} -> exactly the tagged High task",
   "notes": "Ad-hoc filter; saving a named Smart List filter not in API",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-12",
   "capability": "Add tags to a task",
   "task": "Tag a task, create tag, filter by tag",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Task created with tags ['agentdrives'] (read back in project data); POST /open/v1/tag -> GET /open/v1/tag lists it; filter by tag returns the task",
   "notes": "Tagging a task does not create a tag object (GET /open/v1/tag was [] until POST /open/v1/tag)",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-13",
   "capability": "Add checklist items",
   "task": "Task with 2 checklist items, complete one",
   "route": "mcp",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/task items Outline/Draft -> kind CHECKLIST; MCP complete_checklist_item (first try failed: param is checklist_item_id, clear pydantic error) -> GET shows Outline status 1",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "error_legibility": "clear",
    "recoverable": "yes"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-15",
   "capability": "Set task priority",
   "task": "High priority task",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "priority 5 set on create, read back in project data and filter priority [5]",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-16",
   "capability": "Break a task into subtasks",
   "task": "Create subtask under parent",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/task parentId 6ac47d26… -> project data shows child parentId set and parent childIds ['6ac47d2d…']",
   "notes": "create response itself omits parentId",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-17",
   "capability": "Set a recurring rule",
   "task": "Weekly repeating task, complete it",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "repeatFlag RRULE:FREQ=WEEKLY;INTERVAL=1; complete -> task stays status 0 with dueDate moved 2026-10-08 -> 2026-10-15",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-18",
   "capability": "Set a task's time duration",
   "task": "Task 09:00-10:30",
   "route": "api",
   "documented": true,
   "result": "plan_gated",
   "verified": true,
   "evidence": "POST and update with startDate 09:00, dueDate 10:30 -> both returned startDate=dueDate=10:30 (no error); pricing page lists 'Task Duration' under Premium",
   "notes": "Silently dropped on free plan: no error says it is Premium",
   "quality": {
    "error_legibility": "silent"
   }
  },
  {
   "t": "10:10",
   "cap": "cap-19",
   "capability": "Comment on a task",
   "task": "Add and read a comment",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "POST /open/v1/project/{p}/task/{t}/comment -> id 6ac47d32…; GET …/comments returns it (GET on …/comment singular -> 500 'Request method GET not supported')",
   "notes": "",
   "quality": {
    "verify_route": "yes",
    "docs_match": "match"
   }
  },
  {
   "t": "10:10",
   "cap": "discovery",
   "capability": "API errors",
   "task": "Error shapes",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Empty title -> HTTP 500 application/json {errorCode:app_runtime, errorMessage:'task title is empty'}; unknown project -> 500 'Unknown exception'; no token -> 401 WWW-Authenticate Bearer",
   "notes": "Validation errors come back as 500, not 4xx; not problem+json",
   "quality": {
    "error_legibility": "vague"
   }
  },
  {
   "t": "14:49",
   "cap": "cap-04",
   "capability": "Track a habit with check-ins and streak stats",
   "task": "Check the API-created habit and its streak in the web app",
   "route": "browser",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "https://ticktick.com/webapp/#q/all/habit shows 'Develop a habit' (empty) after reload, also after updating the habit with iconRes/color; GET /open/v1/habit still lists it; GET /open/v1/habit/sections []",
   "notes": "API-created habit does not appear in the web app, so streak stats could not be seen; cause unknown"
  },
  {
   "t": "14:49",
   "cap": "pay",
   "capability": "Pay",
   "task": "Probe agent payment rails and checkout",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "x402./mpp./agents.ticktick.com do not resolve; no 402 on api.ticktick.com (401 Bearer); no /.well-known/ucp, no openapi.json, no ticktick listing in x402 Bazaar or mpp.dev/api/services; Settings > Premium > US$4.99/Month > Upgrade Now -> Stripe Checkout (checkout.stripe.com, 'TickTick Limited', card fields, page loads hCaptcha script, checkbox 'I am an AI agent and have followed the instructions above'). Not paid.",
   "notes": "Card-only hosted checkout; free plan exists; no billing API"
  },
  {
   "t": "14:49",
   "cap": "cleanup",
   "capability": "Clean up created data",
   "task": "Delete focus, list, tag",
   "route": "api",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "DELETE /open/v1/focus/{id}?type=0 -> 200 then GET 404; DELETE /open/v1/project/{id} -> 200, GET /open/v1/project []; MCP delete_tag -> deleted, GET /open/v1/tag []",
   "notes": "No habit delete endpoint in docs or MCP (habit left; removed with the account)"
  },
  {
   "t": "15:56",
   "cap": "delete",
   "capability": "Delete account",
   "task": "Delete account and data",
   "route": "none",
   "documented": true,
   "result": "failed",
   "verified": true,
   "evidence": "No account-deletion endpoint in the Open API docs or the 55 MCP tools",
   "notes": "headless delete not offered"
  },
  {
   "t": "15:56",
   "cap": "delete",
   "capability": "Delete account",
   "task": "Delete account in web app",
   "route": "browser",
   "documented": true,
   "result": "done",
   "verified": true,
   "evidence": "Settings > Account > Delete Account: tick two confirmations, enter password, Confirm -> logged out to https://ticktick.com/; afterwards GET /open/v1/project with the key -> 401 invalid_token and MCP tools/call -> 401",
   "notes": "Immediate; no confirmation mail seen in the agent's inbox"
  },
  {
   "t": "15:56",
   "cap": "cancel",
   "capability": "Cancel plan",
   "task": "Cancel subscription",
   "route": "none",
   "documented": true,
   "result": "skipped",
   "verified": false,
   "evidence": "No plan was started (free plan); Premium is a Stripe Checkout subscription; no billing API in docs",
   "notes": "Nothing recurring to cancel on this drive"
  }
 ],
 "stale": false,
 "icon": null,
 "monitored": false,
 "verdict": "L3 · Does the work: our agent gets in on its own, signing up through the web form, making a personal API key in Settings, and calling the project endpoint without hitting a CAPTCHA or needing a human. No checkpoint stopped it. Through the documented REST API and the official MCP server, it created a task and read it back, reaching lists, tags, reminders, repeats, comments, Kanban, focus records and habit check-ins. Premium is a card-only Stripe Checkout page, not tried on this drive, and deleting the account needs the web app, a password and confirmation steps.",
 "page": "https://agentdrives.com/tools/ticktick?via=api"
}