Docs

MCP setup

Every account gets its own MCP endpoint, scoped to just that account's tasks — no shared or global token.

1. Generate a token

Open the Account panel in the bottom-left of the sidebar and generate an MCP token. It's shown once, at generation — copy it somewhere safe.

2. Point an MCP client at it

Add Done as a remote MCP server, using the token as a bearer credential:

{
  "mcpServers": {
    "done": {
      "url": "https://trydone.app/mcp",
      "headers": { "Authorization": "Bearer <your-generated-mcp-token>" }
    }
  }
}

A Claude agent using that token can only ever see and edit your account's tasks.

2b. Or connect via claude.ai custom connectors

On claude.ai you can add Done as a custom connector instead of editing a config file:

  1. Go to Settings → Connectors → Add custom connector.
  2. Give it a name (e.g. “Done”) and set the remote MCP server URL to https://trydone.app/mcp.
  3. Open Advanced settings and add a request header: name it Authorization, and for the value enter Bearer <your-generated-mcp-token> (including the space after “Bearer”) — mark it Required.
  4. Click Add, then Connect, and enable the connector in a chat.

Claude stores the header value securely and never displays it again after you save it. Done has no OAuth flow, so this header-based auth is the only way to connect it as a custom connector — if your account doesn't yet show request headers in the connector dialog, that feature is still in staged rollout; use the config-file method above instead.

3. Tools available to the agent

The MCP server exposes workflow-shaped tools, not raw CRUD:

list_my_tasksPull the ready-to-work queue — assigned to Claude, not blocked, highest priority first. Call this first.
list_tasksSee the whole board; filter by status/priority/project/parent, or search titles.
get_taskLoad one task in full: notes, subtasks, blockers, and the whole activity feed.
claim_taskPick it up: set in-progress, assign to Claude, and post a starting comment.
comment_on_taskReport progress or deliver results into the activity feed (markdown).
complete_taskMark done directly — requires a summary. Only works if the task has auto_ok=true; otherwise it errors and tells you to use propose_completion.
propose_completionFor a non-auto_ok task: post a summary and set status to pending_approval until a human approves or rejects it.
approve_task / reject_taskResolve a pending_approval task (a supervising agent can do this too, not just a human).
propose_planBefore substantial work: post the plan and set status to plan_proposed until a human approves it — the pre-execution counterpart of propose_completion.
approve_plan / reject_planResolve a plan_proposed task's plan (a supervising agent can do this too, not just a human).
create_task / update_task / delete_taskFull task CRUD, validated the same way the REST API is. delete_task moves it to Trash, not a hard delete. Accepts references — URLs/paths for context, fetched via the agent's own MCP connectors.
quick_captureCreate a task from raw text — parses due dates, priority, @claude, ~estimate, #project.
decompose_taskBreak a task into several subtasks in one call.
block_task / unblock_taskManage blocked-by dependencies (cycle-checked).
run_triageBulk-assign itself to open, unassigned tasks whose title matches a rule.
get_digest / get_weekly_review / get_statsOrient at the start of a session, or pull a fuller productivity picture (trend, streak, breakdowns).
list_projects / create_project / update_project / delete_projectManage sidebar projects.
list_tags / create_tag / delete_tag / tag_task / untag_taskManage and apply cross-cutting tags.
list_trash / restore_taskSee what's in Trash and bring a task back out of it.

A typical agent run

get_digest list_my_tasks get_task claim_task → work → comment_on_task complete_task. You review results in the task's Activity panel and stay the accountable owner.

Run it on a schedule

Done is a passive queue — it can't reach out and start a Claude run — so to have Claude work your tasks unattended, schedule Claude to poll Done rather than the other way around. Add Done as a connector (above), then create a Routine at claude.ai/code on whatever cadence you like (hourly is plenty) with this as its prompt:

You are my Done task runner. Work my queue through the Done MCP connector only — never touch anything outside my Done account.

Each run:
1. Call get_digest, then list_my_tasks, to see what's assigned to me (Claude) and ready.
2. For each ready task, decide what to do:
   - in_progress with plan_approved_at set → its plan is approved, so DO THE WORK now. Read it with get_task (notes_for_agent, description, references), carry it out, post progress with comment_on_task, and when it's finished call propose_completion with a summary — or complete_task if the task is auto_ok.
   - not_started and small or auto_ok → just do it, then complete_task (auto_ok) or propose_completion.
   - not_started and substantial or ambiguous (multi-step, judgment calls, anything I'd want to sign off on the approach for) → do NOT start it. Call propose_plan with a short plan of how you intend to tackle it, then move on. It waits for my approval and comes back to you once I approve it in the Control Room.
3. Respect the gates: never force a non-auto_ok task to done, and never act on a task that isn't assigned to me.
4. If nothing is ready, stop — don't invent work.

End with a one-line summary: plans proposed, tasks worked, tasks completed.

Each run it proposes a plan for any substantial task and waits, and executes whatever you've approved in the Control Room since last time. You approve; Claude does the work — you never have to kick off a run by hand. The same setup is a click away in the Account panel (“Put Claude to work on your queue”).

Notes

  • There is no OAuth flow on the MCP endpoint yet — it's a long-lived per-account bearer token, generated in-app.
  • The token is scoped to a single account; there is no cross-account or global token.
  • Regenerating a token immediately invalidates the previous one.