New: AI spend limits now cover the agent builder and the project planner →
Product
AI Teammates
Solutions
Resources
PricingEnterprise
Start free Book a demo Log in
For AI agents

MCP server

Connect Claude Code, Cursor, Claude Desktop or your own agent to a workspace. 25 tools, including a work queue: claim the next task, do it, complete it.

TaskCrew ships a Model Context Protocol server so any AI agent — Claude Code, Cursor, Claude Desktop, your own agent — can read and change work in a workspace: create tasks, pick up the next to-do, comment, finish work, read and write wiki pages.

  • URL: <PUBLIC_API_URL>/mcp (for local development http://localhost:4000/mcp)
  • Transport: Streamable HTTP, stateless (POST /mcp; GET/DELETE answer 405 — there are no sessions)
  • Auth: a personal API token: Authorization: Bearer tc_…

Create a token in Settings → Developers & AI agents (/w/<workspace>/settings/developers). The page also shows ready-to-paste setup snippets with your token filled in.

A token acts as you, in one workspace: tools see exactly the projects, lists and wikis you can see, and every change is recorded as yours (activity, notifications and automations fire as if you made it in the app).

Setup#

Claude Code#

claude mcp add --transport http taskcrew http://localhost:4000/mcp --header "Authorization: Bearer tc_…"

Cursor (and other apps with remote MCP + headers)#

~/.cursor/mcp.json:

{
  "mcpServers": {
    "taskcrew": {
      "url": "http://localhost:4000/mcp",
      "headers": { "Authorization": "Bearer tc_…" }
    }
  }
}

Claude Desktop (or apps that only launch local servers)#

Use the mcp-remote bridge (needs Node.js):

{
  "mcpServers": {
    "taskcrew": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "http://localhost:4000/mcp", "--header", "Authorization: Bearer tc_…"]
    }
  }
}

Tools#

Lists are referenced by name, key or id, tasks by key (DEV-12) or id, states / labels / custom fields by name, people by email, name or "me", placeholder people (names to plan with, never members) by name in their own arguments. Results are compact JSON; errors come back as tool errors with a message that says how to fix the call (e.g. the valid state names). Tasks in a list's Trash are invisible to every tool (never listed, searched or claimed); there are no tools to delete or restore tasks.

ToolWhat it does
list_projectsProjects you can see with their task lists, wikis and canvases.
list_listsTask lists with workflow states (name + category), labels, custom fields, the task types new tasks may have and the defaultType.
list_tasksTasks of a list, or "mine" (open tasks you are one of the assignees of). Filters: state, category (backlog/todo/started/done/canceled), assigned_to_me, open_only (default true), q, limit, include_archived (default false: archived tasks — done work moved out of the active list — are left out; listed ones read archived: true). A parent's subtasks reads "1 of 2 done · 1 canceled" (canceled subtasks are left out of the progress).
get_taskOne task with description, subtasks, last 30 comments (each with its id; replies carry replyTo, resolved threads resolved: true, assigned ones assignee) and custom fields by name; links lists the task's linked files ({ title, url }: Google Drive/Docs/Sheets/Slides, OneDrive, SharePoint — links only, reading them needs the matching connector; the Gmail, Google Drive, Calendar and Chat connectors are marked Preview: Google's servers are a Developer Preview and their sign-in has not been verified end to end yet). A subtask has parent. A task that is not a plain Task has type ("Milestone", "Approval", "Bug"…), here and in every task the tools return; a milestone is a key date (one day, its due date: a start date sent for it is dropped), and an answered Approval has decision ("Approved", "Changes requested" or "Rejected"). A task planned in a sprint of its list has sprint (its name, e.g. "Sprint 4"; set in TaskCrew).
create_tasklist, title, optional description, state, priority, due_date, start_date, assignees (list of "me", emails or names), placeholders (names of existing placeholder people), labels, type (a task type by name that the list allows; default: the list's default type), estimate (hours: "4h", "1h 30m", "1.5" or a number), parent (key → subtask; a subtask cannot have subtasks of its own: one under a subtask is refused with "A subtask cannot have subtasks of its own — use its checklist instead"), fields ({"Budget": 1200}; a Location field takes "19.0760, 72.8777" or a Google Maps, Apple Maps or OpenStreetMap link, and reads back as "Andheri site (19.076, 72.8777)").
update_taskChange title, description (description replaces, append_description appends), priority, dates, add_assignees / remove_assignees (the others stay), add_placeholders / remove_placeholders (placeholder people by name; the others stay), labels (replace), fields, type (by name, one the list allows), estimate (hours as in create_task; "" clears it).
move_taskMove to a state by name. done / started / todo pick the first state of that category. AI-teammate states cannot be chosen.
add_commentComment on a task (Markdown); reply_to (a comment id) replies in that thread.
claim_next_taskWork queue. See below.
watch_task / unwatch_taskStart or stop watching a task: watchers are notified about its comments, state changes and completion.
complete_taskMove to the first completed state, optionally posting a result comment first. An Approval task is refused (and so is move_task to a done state): its assignee answers it in TaskCrew.
searchBest matches first: tasks, wikiPages, comments (task key, author, snippet) and files (task attachments found by name or by the words inside them, with a snippet), plus notes, records… in other. "phrase", OR and -word work. Only what the token's person can open, in item types AI teammates may read (never vaults).
list_wiki_pagesPages of one wiki (wiki name or id) or of all wikis.
read_wiki_pageA page as Markdown. Live embeds read as !@[Task list](item:<id>) (Table, Dashboard) on a line of their own — the item's type and id, never its name.
write_wiki_pageCreate a page (wiki + title [+ parent_page_id]) or update one (page_id, mode: replace | append). Open editors see the change live.
list_tablesTables (small databases) you can see, with row counts and column names.
get_table_schemaColumns of a table: type, choices, and the filter operators each supports.
query_rowsRows of a table with values by column name. where ({"Status": "Done"}), conditions ([{"column": "Amount", "op": "gt", "value": 100}]), match all/any, search, sort_by + direction, limit, cursor.
add_rowsUp to 500 rows per call, values by column name ({"Name": "Ada", "Status": "Done", "Owner": "me", "Due": "today"}). The table's “a row is added” automations run for rows whose first column has a value (the first 100).
update_rowChange some values of a row (null clears); the table's “a row changes” automations run (and “a row is added” ones when its first column gets its first value).
delete_rowDelete a row.
list_playbooks / start_playbook / get_runPlaybooks with the questions (inputs; a choice question lists its options, and the answer must be one of them) and roles they ask for; start a run; follow a run. Steps whose condition does not apply to the answers are left out.

claim_next_task — a task list as a work queue#

Atomically takes the next task of a list and returns its full details:

  1. candidates: tasks in a Todo-category state (include_backlog: true adds backlog states), not handled by an AI teammate, and that nobody is assigned to (no person and no placeholder person) or that you are already one of the assignees of (optionally only with label);
  2. order: priority (urgent first), then oldest first;
  3. you are added as an assignee (anyone already on the task stays) and the task moves to the list's first In progress-category state, with activity entries — in one transaction using SELECT … FOR UPDATE SKIP LOCKED, so agents running in parallel never get the same task.

When nothing is waiting it returns {"task": null, …}.

Placeholder people#

Placeholder people are names to plan with ("Freelance designer"), never members: no email, access or notifications. Tasks list them apart from the people (placeholders: ["Freelance designer"]). create_task takes placeholders; update_task takes add_placeholders / remove_placeholders. A name matches an active placeholder exactly (any case), else the one whose name contains it; an unknown name answers with the active placeholders, an ambiguous one with the matches. An archived one can still be taken off a task. A placeholder's name in assignees is refused with a hint to use these arguments. No tool creates, archives or replaces placeholders (that is done in TaskCrew). AI teammates' create_task and update_task take the same arguments.

Task types#

Every task has a type: the built-in Task (the default), Milestone and Approval, or one of the workspace's own (e.g. Bug), which admins manage in TaskCrew. list_lists shows the types each list allows; create_task and update_task take type by name (any case). A type the list does not allow answers with the ones it does. Approval tasks are answered (approve, request changes, reject) by their assignee in TaskCrew, never by a token or an AI teammate. AI teammates' create_task and update_task take type too.

Estimates#

A task can have an estimate in hours. create_task and update_task take estimate: text like time typed in TaskCrew ("4" or "4h", "1.5", "1h 30m", "90m") or a number of hours, up to 999 h; "" clears it. Tasks read back with estimate: "1 h 30 m" when they have one (list_tasks, get_task and the results of the writes). Something that is not an estimate answers with the format. Workload in hours counts a task as its estimate instead of a typical task. AI teammates' create_task, create_subtask and update_task take estimate too.

Recipe: let Claude Code work through a list#

  1. Create a list, e.g. "Agent queue", and add tasks (people, automations and recurring tasks can add more).

  2. Connect Claude Code as above.

  3. Tell it:

    Use the TaskCrew MCP tools to work through the "Agent queue" list: call claim_next_task; if it returns a task, do the work it describes in this repository; then call complete_task with a short summary (or add_comment and leave it open if you are blocked). Repeat until no task is returned.

Every claimed task shows up as assigned to you and "In progress" in the app in real time; finished tasks move to "Done" with the agent's summary as a comment.

Security notes#

  • Only the SHA-256 hash of a token is stored; the token is shown once. Tokens can expire and be revoked any time (Settings → Developers). A token stops working when its owner leaves the workspace.
  • Requests with a token are confined to the token's workspace: anything else answers 404.
  • Tokens cannot create or revoke tokens, manage workspace members or invites, change project/list membership, or create workspaces — those need a signed-in person.
  • Tokens cannot change passwords or call any other account route (/api/auth/* except /api/auth/me).
  • There are no time-tracking tools, and AI teammates never log time (a token may log its owner's time through the REST API). A password change or reset does not revoke tokens; review them in Settings → Developers.

These pages are built from the same docs that ship with the code, so they change when the product does. See what changed in the changelog