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:

https://trydone.app/mcp
  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.

Connect a personal agent

Personal agents that can add a remote MCP server connect to Done the same way: point them at https://trydone.app/mcp, then sign in with OAuth or give them an MCP token from step 2. A read-only or single-project token is a good start for an agent you're still getting to know.

Meta Muse

Muse adds new tools as custom connectors, and you ask for one in the chat. Tell Muse: “Create a custom connector for Done's MCP server at https://trydone.app/mcp.” When it asks for credentials, give it your MCP token through its secure credentials prompt, not in the chat itself.

Hermes Agent (Nous Research)

Add Done to ~/.hermes/config.yaml, then run hermes mcp login done to approve access in Done, and hermes mcp test done to check it lists Done's tools:

mcp_servers:
  done:
    url: "https://trydone.app/mcp"
    auth: oauth

To use a token instead, replace auth: oauth with headers: { Authorization: "Bearer <your-mcp-token>" }.

OpenClaw (formerly Clawdbot)

Add Done as a streamable-HTTP server, sign in, then probe it:

openclaw mcp add done --url https://trydone.app/mcp --transport streamable-http
openclaw mcp login done
openclaw mcp doctor done --probe

Use the OAuth sign-in rather than a static Authorization header: some OpenClaw versions don't forward custom headers on streamable-HTTP servers.

Poke

In Poke, open Integrations → New, name it Done, set the MCP Server URL to https://trydone.app/mcp, paste your MCP token as the API Key, and click Create Integration.

Instinct

Instinct doesn't publish setup steps for outside tools yet. If yours can add a custom MCP connection, give it the URL https://trydone.app/mcp and an MCP token, sent as Authorization: Bearer <token>.

Any other agent that can add a remote MCP server works too: use the OAuth steps in 1 if it supports OAuth, or a token from 2 if not. Either way it's listed under Settings → Agent access, where you can revoke it in a click.

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, not paused, highest priority first. Call this first. When it comes back empty it says why, with a hidden breakdown (blocked/done/wont_do/pending_approval/plan_proposed/needs_input/paused/claimed_by_other) — so “nothing to do” and “everything is paused” don’t read the same. Pass include_paused to list the paused ones and report what the run skipped; it lifts nothing — they still can’t be worked.
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.
handoff_task
Pass a task you own to another named agent on the roster, mid-flow. It moves to their queue immediately — claim released, back to not_started, your note posted — and agent_ok is reset, so the next agent proposes completion unless a human re-enables it.
list_agents
The account's agent roster and which agent you are. Your lane comes from your credential's name, never an argument; queue tools only return your own lane's tasks. Empty roster = one shared queue.
pause_board
The same stop button one tier up: stops every agent on the account being handed work until a human resumes it. For a wall that isn’t one task’s — credentials gone, every task failing the same way, a loop that spans tasks. After it, list_my_tasks and next_task refuse and hand the reason back rather than returning an empty queue, so a run that finds the board stopped logs why. Work already in hand can still be closed out. Resuming is human-only, in the Account panel.
pause_task
Stop work on a task and keep every agent off it until a human resumes it. For being STUCK in a way no question would fix — a loop, a missing credential, a task that can't be done as written. A reason is required, and you cannot un-pause: resuming is a human action in the app, so an agent that paused itself for looping can't put itself back in the loop.
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.
runner_heartbeat
For a self-hosted runner box only: register it against the account and report its health, so its owner sees it in Done rather than by reading logs over SSH. The one state nothing else can show is a box that is connected and broken — its Done token is fine so it holds the event stream and reads as “listening”, while its expired model login kills every run.
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.
list_routines
Read-only: the recurring routines a human scheduled on your boards — schedule, timezone, next run, paused, and recent runs. Each slot spawns an ordinary task assigned to you with a trigger, so runs arrive through list_triggers and next_task like any other request. There is no tool to create or change one: an agent that could schedule itself would be enqueuing its own work.
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.
create_artifact_upload
Attach a real file — a PDF, a screenshot, a spreadsheet — to a task. Returns a one-time upload link: PUT the raw bytes to it with no Authorization header, then set the deliverable’s artifact_id with update_task. The link works once and expires after 15 minutes. Refused for a read-only token, a task outside the token’s project or workspace, a task in Trash, or a file past the size limits.
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_brief_edit
Propose new wording for a project’s or a task’s agent brief — typically after a rejection the brief should have prevented. A full replacement plus a reason, shown to the human as current vs proposed in Needs you. Writes nothing: a person applies or dismisses it, and applying is refused if the brief changed since. The workspace brief can’t be proposed.
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_agent_roster
What each named agent has actually done: runs, minutes and tool calls spent, approved vs rejected tasks, the rejection rate, the impact/value the approved ones delivered, and tool calls spent per approved task. Reports only.
get_agent_economics
Cost vs value per agent and per project over a window of days: tool calls, minutes and budget spent, approved vs rejected, the rejection rate, the value and impact the approved tasks delivered, and tool calls and minutes per approved task. In units, not money. Narrowed to a scoped token's project or workspace. Reports only.
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_connections
The human's connected apps — Drive, Gmail, Notion, GitHub, Linear, Slack, Fireflies, Granola, PostHog — and what each connection actually holds, which can be less than the provider offers if the consent screen was narrowed.
search_context
Search the connected apps for something to read. Returns hits — title, kind, link and a ref — never bodies. A broken connection is named rather than failing the whole search.
read_context
Read one hit from search_context as plain text, by connection and ref. A Slack ref returns the whole thread.
save_context
Save a text document into a connected app that can hold one (Drive today) — how a deliverable leaves Done. There is no send-mail or post-to-Slack here at all.
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_day — Draft a realistic, prioritized plan for today from my open tasks.
    • work_next — Claim and work the single highest-priority ready task.
    • daily_review — Summarize what got done, what's overdue, and what to focus on next.
    • groom_board — Find the open work that quietly died and propose what to do about each — proposes only.
    • answer_backlog — Pick up the tasks whose parked questions I've already answered.
    • prep_meetings — Match today's calendar events to the tasks they're about, and prep each one.
    • triage_task — Assess 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 Needs you 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 doesn't run an agent on its own servers. To have your tasks worked unattended, something has to call it, like a scheduler in the MCP client you already use. Every MCP client connects the same way; only the scheduling differs:

Claude — Routines

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 Claude plan (Pro, Max, Team, or Enterprise) with Claude Code on the web enabled.

ChatGPT — Scheduled tasks

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

  1. Add Done as an MCP server or custom connector pointing at https://trydone.app/mcp (Streamable HTTP, no token or headers), 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: If ChatGPT can read your queue but can't claim, comment on, or complete anything, check that Developer mode is on. Some ChatGPT plans still limit what a custom connector may write.

Anything else — Your 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 Needs you.
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 Settings → Where agents run, 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 Needs you 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.