Docs

MCP setup

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

1. Connect over OAuth (recommended)

Done is a full OAuth 2.1 authorization server for its MCP endpoint, so clients that speak OAuth — claude.ai, ChatGPT connectors, and Claude Desktop — connect themselves with no token to copy. Add Done as a custom connector by URL only:

  1. Go to Settings → Connectors → Add custom connector.
  2. Set the remote MCP server URL to https://trydone.app/mcp and click Add.
  3. Click Connect. The client discovers Done's OAuth endpoints, registers itself, and sends you to Done to sign in and approve access.
  4. Approve, and the connector is live — scoped to your account alone.

2. Or use a bearer token

For clients configured by hand (or a script), generate a token instead. Open the Account panel in the bottom-left of the sidebar and generate an MCP token — it's shown once, so copy it somewhere safe. You can mint a full-access token, a read-only one, or one scoped to a single project. Then point a client at the endpoint:

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

On claude.ai you can also paste that same Authorization: Bearer <token> as a request header under a custom connector's Advanced settings. Either way, an agent using the token only ever sees and edits what the token is scoped to.

3. Tools available to the agent

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

list_my_tasks
Pull the ready-to-work queue — assigned to an AI agent, not blocked, highest priority first. Call this first.
next_task
Atomically claim the single highest-priority ready task — the dequeue. Use in a fleet so two agents never grab the same one.
list_tasks
See the whole board; filter by status/priority/project/parent, or search titles.
get_task
Load one task in full: notes, subtasks, blockers, and the activity feed — plus all three tiers of standing brief (workspace_brief, project_brief, the task's own notes_for_agent). Precedence: workspace → project → task, most specific last. Budgeted: the feed returns the newest 50 entries by default (limit, 0–500) and include narrows the sections; anything left out is named in context_summary, so a short payload is never mistaken for a complete history.
claim_task / release_task
Pick a task up (in-progress, assigned to an agent, starting comment) — pass your `agent` id (e.g. "ChatGPT") so a fleet doesn't double-book — or put it back if you can't finish it now.
decline_task
Hand a task back off your queue entirely — clears the assignee and your claim and returns it to not_started, with your reason posted to the thread. For work that was assigned to you but shouldn't be. release_task only drops the lease; this drops the assignment.
comment_on_task
Deliver results and conclusions into the task's thread — the lane a human reads. One dense comment per run, not a play-by-play: status changes, claims and run traces are recorded automatically in the task's history.
check_criterion
Tick one acceptance criterion off as met. This is the progress channel — mark conditions as you satisfy them instead of narrating progress into comments. Ticking every box does not complete the task.
ask_decision
Park a question for the human and move on — the one way to involve them without ending your run. The task drops out of your queue as needs_input; you pick it back up with the answer attached. Requires a recommendation. One open blocking question per task.
list_open_decisions / withdraw_decision
See every question currently waiting on a human, or withdraw one you worked out yourself. Check this first each run: a task whose question was answered is the cheapest work available.
check_night_budget
Ask whether you may start another task tonight. Task budgets cap one task; this caps a whole unattended session, so an overnight routine can't spend a week's headroom in one night.
delete_comment
Remove one of the agent's own comments — a retry's duplicate, or a draft it replaced. Your comments and the status history can't be deleted.
complete_task
Mark done directly — requires a summary. Only works if the task has agent_ok=true; otherwise it errors and tells you to use propose_completion.
propose_completion
For a non-agent_ok task: post a summary and set status to pending_approval until a human approves or rejects it.
approve_task / reject_task
Resolve a pending_approval task (a supervising agent can do this too, not just a human).
propose_plan
Before 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_plan
Resolve a plan_proposed task's plan (a supervising agent can do this too, not just a human).
create_task / update_task / delete_task
Full 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_capture
Create a task from raw text — parses due dates, priority, @agent (also @claude/@chatgpt), ~estimate, #project.
decompose_task
Break a task into several subtasks in one call.
render_plan
Lay a task's sub-steps out as a plan: a markdown checklist, structured JSON, and an interactive widget for hosts that render MCP UI. Call after decompose_task/propose_plan.
set_step_status
Check a plan sub-step off or reopen it, returning the refreshed plan. Marking an agent's own non-agent_ok step still routes through the approval gate.
block_task / unblock_task
Manage blocked-by dependencies (cycle-checked).
start_run / end_run / check_budget
Open and close an auditable work session; check a task's remaining tool-call / minute budget. Once a budgeted task is spent, start_run is refused. Pass trace_url on start_run to link the session transcript, so “why did it do that at 3am” is one click from the run.
fleet_status
Live snapshot of every task an agent currently holds a claim on, how long, and whether the lease has lapsed — use to see who's working what before grabbing a task.
list_triggers / claim_trigger
Requests a human addressed to you — a “Run now” press, or @claude in a comment. Each is a durable row that waits until an agent connects, and reaches a connected one instantly over the live event stream. An explicit ask outranks queue order, so next_task ranks a requested task first. claim_trigger acknowledges one atomically, so a fleet doesn't double-work it.
search_activity
Search the activity feed across every task you can see, instead of reading one task at a time — a substring match on comments, status changes and agent write-ups, newest first, narrowable by task_id/author/kind/since.
changes_since
The pull counterpart to the live event stream, for a session that connects, works, and exits: pass your last cursor and get back only what changed since. No cursor anchors one and returns no deltas — a first call can't dump the whole board. Triggers aren't included; list_triggers stays the source for those.
list_claude_shipped
List the tasks an AI agent marked done, newest first — for a standup, a retro, or 'how much did the agent actually do?'.
list_stale_tasks
Find open work that has gone quiet, with the evidence to decide what to do about it — days inactive, subtask progress, open blockers, and reason codes. The grooming sweep.
get_evidence
Everything a human approving a task would want to check, in one call: criteria progress, spend against budget, receipts, deliverables and trace links.
propose_capture / list_capture_inbox
The front door: propose a task the human hasn't typed yet, for their capture inbox. Creates nothing — accepting is the human's write. The listing reports the accept/dismiss ratio that decides whether the surface earns its place.
propose_edit
Suggest changes to a task’s fields without making them — a current-vs-proposed diff a human accepts or dismisses one field at a time, so three right suggestions aren’t rejected along with the fourth. Writes nothing. A field you can’t set isn’t one you can propose.
propose_grooming / list_grooming_proposals
Turn a stale sweep into one reviewable batch: a recommended disposition per task, each with a reason. Writes nothing — a human approves each item in the app, and that approval is the write.
get_autonomy_ledger
See where agent_ok has been earned: approvals and rejections grouped by project or tag, with the current approval streak. Reports only — granting autonomy is a human action.
get_digest / get_weekly_review / get_stats
Orient at the start of a session, or pull a fuller productivity picture (trend, streak, breakdowns).
list_projects / create_project / update_project / delete_project
Manage sidebar projects. create_project takes an optional workspace_id (from list_workspaces) to file the project into a shared workspace instead of the personal one; a subproject takes its parent's workspace, so don't send both.
list_workspaces
The workspaces this account belongs to — id, name, role (owner or member), and notes_for_agent, the workspace's standing brief. A workspace is who can see a set of tasks. Read-only: workspaces are created and shared by the human, in Account → Workspaces & team, and the brief is the human's to write.
list_goals / create_goal / update_goal / delete_goal
Manage goals — the North Star tier above projects. File projects/tasks under one via goal_id; deleting a goal unfiles its work rather than destroying it.
list_tags / create_tag / delete_tag / tag_task / untag_task
Manage and apply cross-cutting tags.
list_trash / restore_task
See what's in Trash and bring a task back out of it.
list_calendar_events
List the human's cached calendar events — title, time, location, organiser, attendees — from their connected Google accounts. Use before deciding which task a meeting belongs to.
suggest_event_matches
Rank likely task↔calendar-event pairs, best first, with the evidence behind each one. Nothing is linked by calling this — confirm with link_task_to_event.
link_task_to_event / unlink_task_from_event
Record — or remove — that a task and a calendar event are the same thing, so the task gets pinned at the meeting's real time instead of packed into free time.

Prompts & resources

Beyond tools, the server is fully MCP-native: it also exposes prompts and resources, so a client can offer ready-made workflows and attach live data as context.

  • prompts/list · one-line templates that map to real workflows, so a client can surface them as slash-commands:
    • plan_my_dayDraft a realistic, prioritized plan for today from my open tasks.
    • work_nextClaim and work the single highest-priority ready task.
    • daily_reviewSummarize what got done, what's overdue, and what to focus on next.
    • groom_boardFind the open work that quietly died and propose what to do about each — proposes only.
    • answer_backlogPick up the tasks whose parked questions I've already answered.
    • prep_meetingsMatch today's calendar events to the tasks they're about, and prep each one.
    • triage_taskAssess one task and either plan it or flag what's blocking it.
  • resources/list · read-only views a client can attach: done://digest, done://queue, and a done://task/<id> per open task. Scoped tokens only ever see their own project.

A typical agent run

get_digest list_open_decisions next_task get_task → work, ticking check_criterion as each condition is met → comment_on_task once with the write-up → propose_completion. You review results in the task's thread and stay the accountable owner.

Asking without stalling

An agent that hits a genuine fork — spending money, anything outward-facing, anything irreversible — shouldn't guess, and shouldn't sit there either. It calls ask_decision and moves on: the task drops out of its queue as needs_input, you answer in the Control Room or straight from a Slack DM, and the task re-enters the queue with your answer attached — so the next run reads the answer instead of re-deriving the question.

Every question carries the agent's own recommendation and the reasoning behind it, so answering is usually one click rather than a writing task. Answering is not an approval: it hands the task back and never closes anything. Only one blocking question can be open per task, which keeps a decision inbox from becoming the comment feed it replaced.

This is what makes an overnight routine worth leaving running. Without it, the first ambiguity at 3am stops the whole night; with it, that one task parks and the agent keeps working the rest.

Run it on a schedule

Done ships no agent and no scheduler. It's a passive queue — it can't reach out and start a run — so to have your tasks worked unattended, something outside Done has to wake up on a cadence and call it. Every MCP client connects the same way; only the scheduling differs:

ClaudeRoutines

Runs in Anthropic's cloud on a schedule, with Done attached as a connector.

  1. Add Done as a connector at claude.ai/customize/connectors, with the MCP server URL https://trydone.app/mcp. It has to live on your claude.ai account — a routine can't see MCP servers you added locally in the CLI.
  2. Open claude.ai/code/routines and click New routine — or run /schedule in the Claude Code CLI and describe what you want in plain words.
  3. Paste one of Done's prompts as the instructions. A routine runs with nobody watching, so the prompt has to stand on its own; that's exactly what the ones in the Prompts view are written for.
  4. Give it a schedule trigger — hourly, daily, weekdays, or weekly. One hour is the shortest interval allowed.
  5. Under Connectors, leave Done included and drop the ones this routine has no business touching. Create it, then hit Run now once so you can watch the first run end to end.

Before you start: Routines need a paid plan (Pro, Max, Team, or Enterprise) with Claude Code on the web enabled.

ChatGPTScheduled tasks

A timer-based task that reaches Done through a custom connector.

  1. Add Done as a custom connector in developer mode, pointing at https://trydone.app/mcp, and sign in when it asks.
  2. Start a chat, paste one of Done's prompts, and ask for it on a schedule — "run this every weekday at 8am".
  3. Manage what you created under Tasks in your profile menu. Tasks fire on a timer only, at most about hourly, and auto-pause if you ignore them for long enough.

Before you start: On Plus and Pro, custom MCP connectors are read-only — an agent can read your queue but can't claim, comment on, or complete anything. Writing back needs a Business, Enterprise, or Edu plan.

Anything elseYour own scheduler

Any MCP client, woken by whatever you already use to run things on a timer.

  1. Point the client at https://trydone.app/mcp, sending your token as an Authorization: Bearer header.
  2. Have cron, a CI schedule, a workflow runner — whatever you already trust to run on a timer — start that client with one of Done's prompts as its instructions.
  3. Give the run somewhere to report. Every prompt in the library ends by writing back into Done, so the board is the log and you don't need a second place to look.

Whichever path you take, this is the prompt to give it:

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 list_open_decisions first, then get_digest and list_my_tasks, to see what's assigned to me (the AI agent) and ready. A task whose parked question I've since answered is the cheapest work on the board — the context is written down and the blocker just cleared — so start there.
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, acceptance_criteria, description, references), carry it out, and when it's finished call propose_completion with a summary — or complete_task if the task is agent_ok.
   - not_started and small or agent_ok → just do it, then complete_task (agent_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. Report progress by ticking the acceptance criteria with check_criterion as you actually meet each one — not by narrating into comments. Post at most ONE dense comment_on_task per task per run: what you did, what you found, what's left. A running commentary is noise.
4. Hit a real fork — spending money, anything outward-facing (an email, a post, a reply to a customer), anything irreversible — and call ask_decision with your own recommendation, then MOVE ON to the next task. Don't guess, and don't sit there waiting. If you later work the answer out yourself, withdraw_decision rather than leaving a stale question in my queue.
5. If a task was assigned to me but shouldn't be — it needs my accounts, my signature, or my judgment — hand it back with decline_task and a one-line reason. Declining is a valid outcome.
6. Respect the gates: never force a non-agent_ok task to done, and never act on a task that isn't assigned to me.
7. For any task that has sub-steps (a plan) — one you decomposed, or that already had subtasks — call render_plan on it so I get the laid-out plan with progress and an "Open in Done" link.
8. If nothing is ready, stop — don't invent work.

If you're running unattended overnight, wrap the run: call start_run at the top and check_night_budget before picking up each task, so you stop at the caps I set in Account → Notifications, and call end_run when you finish.

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

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; the agent 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 an AI agent to work on your queue”).

Notes

  • Connect over OAuth (clients that discover /.well-known/oauth-authorization-server) or with a long-lived per-account bearer token generated in-app — both work against the same endpoint.
  • Every token and grant is scoped to a single account; there is no cross-account or global token. Bearer tokens can be further narrowed to read-only or a single project.
  • Regenerating or revoking a token invalidates it immediately.
  • The Free plan includes 100 agent (MCP) calls a month; Pro and Teams are unlimited. See pricing.