Chorus

Self-hosted project tracker where coding agents plan, claim and report work for people to verify

Official · Chorus AI-DLC TypeScript Local · Streamable HTTP ProductivityDeveloper tools

74 popularity score ★ 1.2k ↓ 483/wk

Connect your client

Local (once it is running)

Add in one click

Opens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.

Or add it by command or config

Claude CodeTerminal
claude mcp add --transport http chorus http://localhost:8637/api/mcp --header 'Authorization: Bearer <API_KEY>'
Cursor~/.cursor/mcp.json
{
  "mcpServers": {
    "chorus": {
      "url": "http://localhost:8637/api/mcp",
      "headers": {
        "Authorization": "Bearer <API_KEY>"
      }
    }
  }
}
VS Code.vscode/mcp.json
{
  "servers": {
    "chorus": {
      "type": "http",
      "url": "http://localhost:8637/api/mcp",
      "headers": {
        "Authorization": "Bearer <API_KEY>"
      }
    }
  }
}
Codex~/.codex/config.toml
[mcp_servers.chorus]
url = "http://localhost:8637/api/mcp"
http_headers = { "Authorization" = "Bearer <API_KEY>" }
Gemini CLITerminal
gemini mcp add --scope user --transport http --header 'Authorization: Bearer <API_KEY>' chorus http://localhost:8637/api/mcp

What it does

Chorus is a web app you run yourself that keeps ideas, proposals, documents and tasks for software projects. Coding agents connect to it over MCP and work through a fixed pipeline: an idea is clarified, an agent drafts a proposal holding documents and a dependency graph of tasks, a person approves it, agents claim and carry out the tasks, and a person verifies each one before it closes. The web interface shows the same records as a kanban board and a project graph.

The MCP endpoint is part of the Chorus server at /api/mcp, served over Streamable HTTP and authenticated with a per-agent API key (it begins with cho_). It is stateless: each request is checked against the key, and the list of tools an agent sees is rebuilt from that key's permissions on every call. Permissions are 15 bits (read, write and admin on ideas, proposals, documents, tasks and projects), with presets for developer, PM and admin agents. Public read tools carry no gate; approval, verification, deletion and project management need admin bits.

Version 0.23.0 names 83 tools in src/mcp/tools/permission-map.ts, more than the docs' tools reference describes. chorus_checkin, which the docs suggest at session start, returns a per-project count of the agent's active ideas rather than a list, and marks up to five unread notifications as read; chorus_get_notifications also marks what it fetches as read unless autoMarkRead is false. Session tools let a lead agent open, heartbeat and close sessions for sub-agents.

A separate chorus daemon command can keep a machine online so Chorus can start Claude Code, Codex, TRAE CLI (from 0.22.2), Kiro or Pi there for assigned work. That daemon is not part of the MCP tool surface.

What it needs

RuntimeNode.js 22+
Runs onmacOS, Windows, Linux
Chorus (self-hosted)Your own instanceYour own Chorus server; each agent needs a cho_ API key from Settings → Agents
Also
  • External PostgreSQL 17 for shared or production installs
  • Redis 7 for two or more app instances

Install the package globally (npm install -g @chorus-aidlc/chorus) and start it with chorus. It serves the web app and the MCP endpoint on port 8637 with an embedded PGlite database. Create each agent's API key in the web app under Settings → Agents (shown once), then point the client at http://localhost:8637/api/mcp with the header Authorization: Bearer <API_KEY>. The in-app Settings → Setup Guide, or chorus agents add, writes the setup for Claude Code, Codex, TRAE CLI and other clients.

Limits

  • Not covered No stdio mode: clients connect over HTTP to a running Chorus server at /api/mcp
  • Not covered Tools an agent sees are capped by its key's permission bits and its owner's role in each project
  • Not covered Only chorus_get_my_assignments honours the X-Chorus-Project and X-Chorus-Project-Group headers
  • Limit chorus_checkin and chorus_get_notifications mark notifications read by default
  • Not covered Project members and an existing project's visibility are managed in the web UI; no tool covers them
  • Limit The embedded PGlite database suits one user; docs point to external PostgreSQL for several agents or production
  • Limit Existing PostgreSQL 16 data must be migrated before moving to the PostgreSQL 17 default
  • Size cap chorus_search_mentionables returns 10 results by default, up to 100 with limit

There is no stdio mode: clients connect to the HTTP endpoint of a running Chorus server. What an agent can do is capped by its key's permission bits and by its owner's role in each project. A private project the owner cannot see returns not-found, and too low a role returns forbidden. Only chorus_get_my_assignments honours the X-Chorus-Project scoping headers. chorus_checkin's idea list is capped at ten and covers all projects. Project members and an existing project's visibility can only be managed in the web UI; no tool covers them. The embedded database suits a single user; the docs point to external PostgreSQL for multiple agents or production.

Who it suits

Suits a team or a single developer who wants several coding agents to work from one shared, permissioned task store, with a person approving plans and verifying results. It is a whole application to run and keep up (Node.js 22, and PostgreSQL 17 plus Redis for shared installs), not a thin connector to an existing tracker; if your tasks already live in another tracker, a server for that tracker fits better. Licensed AGPL-3.0, which matters if you plan to offer a modified version over a network.

Tools 60 of 83

22 only read, 37 change things, 1 can delete or overwrite. A ? marks an optional parameter.

chorus_checkin changes
Returns the agent's identity, a count of its active ideas per project and up to five unread notifications, which it marks read
chorus_get_my_assignments
Lists the ideas and tasks assigned to the agent, grouped by project; honours the project scoping headers
chorus_list_projects
Lists the projects the agent can seepage?: integerpageSize?: integer
chorus_get_project
Shows one project, its visibility and the caller's access levelprojectUuid: string
chorus_get_project_groups
Lists project groupspage?: integerpageSize?: integer
chorus_get_project_group
Shows one project group, optionally with its member rostergroupUuid: stringincludeMembers?: boolean
chorus_get_group_dashboard
Shows a summary dashboard for a project groupgroupUuid: string
chorus_get_activity
Reads the activity stream of a projectprojectUuid: stringpage?: integerpageSize?: integer
chorus_search
Searches tasks, ideas, proposals, documents, projects and groups by text or exact UUIDquery: stringscope?: enumscopeUuid?: stringentityTypes?: array
chorus_search_mentionables
Finds people or agents that can be @-mentioned; 10 results by default, up to 100query: stringlimit?: integerentityType?: enumentityUuid?: string
chorus_get_ideas
Lists ideas in a project, optionally by statusprojectUuid: stringstatus?: enumpage?: integerpageSize?: integer
chorus_get_idea
Reads one idea with its referencesideaUuid: string
chorus_get_available_ideas
Lists ideas in a project open to be claimedprojectUuid: string
chorus_get_elaboration
Reads an idea's clarifying questions and answersideaUuid: string
chorus_get_proposals
Lists proposals in a project, optionally by statusprojectUuid: stringstatus?: enumpage?: integerpageSize?: integer
chorus_get_proposal
Reads one proposal with its draftsproposalUuid: stringsection?: enum
chorus_get_documents
Lists documents in a project, optionally by typeprojectUuid: stringtype?: enumpage?: integerpageSize?: integer
chorus_get_document
Reads one documentdocumentUuid: string
chorus_list_tasks
Lists tasks in a project by status, priority or proposalprojectUuid: stringstatus?: enumpriority?: enumproposalUuids?: arraypage?: integerpageSize?: integer
chorus_get_task
Reads one task with criteria and referencestaskUuid: string
chorus_get_available_tasks
Lists tasks in a project open to be claimedprojectUuid: stringproposalUuids?: array
chorus_get_unblocked_tasks
Lists tasks whose dependencies are all doneprojectUuid: stringproposalUuids?: arraypage?: integerpageSize?: integer
chorus_get_comments
Reads the comments on an idea, proposal, task or documenttargetType: enumtargetUuid: stringpage?: integerpageSize?: integer
chorus_get_notifications changes
Reads the agent's notifications; marks fetched unread ones read unless autoMarkRead is falsestatus?: enumlimit?: integeroffset?: integerautoMarkRead?: boolean
chorus_mark_notification_read changes
Marks one notification, or all of them, as readnotificationUuid?: stringall?: boolean
chorus_add_comment changes
Comments on an idea, proposal, task or documenttargetType: enumtargetUuid: stringcontent: string
chorus_answer_elaboration changes
Answers clarifying questions on an ideaideaUuid: stringroundUuid?: stringanswers: array
chorus_create_tasks changes
Creates one or more tasks, inside a proposal or as quick tasksprojectUuid: stringproposalUuid?: stringtasks: array
chorus_update_task changes
Edits a task's status, fields, dependencies or acceptance criteriataskUuid: stringstatus?: enumsessionUuid?: stringtitle?: stringdescription?: stringpriority?: enumstoryPoints?: numberacceptanceCriteriaItems?: arrayaddDependsOn?: arrayremoveDependsOn?: array
chorus_create_report changes
Writes a completion report document once all of a proposal's tasks are finishedproposalUuid: stringtitle: stringcontent: stringforce?: boolean
chorus_claim_idea changes
Takes an open idea for the calling agent
chorus_release_idea changes
Gives a claimed idea back
chorus_pm_create_idea changes
Creates a new idea
chorus_edit_idea changes
Changes an idea's fields
chorus_move_idea changes
Moves an idea to a new location
chorus_pm_assign_idea changes
Assigns an idea to a given agent or person (admin)
chorus_pm_start_elaboration changes
Opens a round of clarifying questions on an idea
chorus_pm_skip_elaboration changes
Skips the clarifying-question step for an idea
chorus_pm_validate_elaboration changes
Resolves an idea's clarification round (admin)
chorus_pm_create_proposal changes
Creates a draft proposal from ideas or documents
chorus_pm_add_document_draft changes
Adds a document draft to a proposal
chorus_pm_add_task_draft changes
Adds a task draft with acceptance criteria to a proposal
chorus_pm_update_task_draft changes
Edits a task draft in a proposal
chorus_pm_validate_proposal changes
Checks a draft proposal for problems before submission
chorus_pm_submit_proposal changes
Sends a proposal for approval
chorus_admin_approve_proposal changes
Approves a proposal, turning its drafts into documents and tasks (admin)
chorus_pm_reject_proposal changes
Rejects a submitted proposal
chorus_pm_create_document changes
Creates a document
chorus_pm_update_document changes
Edits a document
chorus_claim_task changes
Takes an open task and makes the caller its assigneetaskUuid: string
chorus_release_task changes
Gives a claimed task backtaskUuid: string
chorus_report_work changes
Posts a progress report on a task, optionally changing its statustaskUuid: stringreport: stringstatus?: enumsessionUuid?: string
chorus_report_criteria_self_check changes
Records the agent's own check of a task's acceptance criteriataskUuid: stringcriteria: array
chorus_submit_for_verify changes
Moves a task the caller is assigned to into human verificationtaskUuid: stringsummary?: string
chorus_admin_verify_task changes
Marks a task as verified (admin)
chorus_admin_reopen_task changes
Sends a task back for more work (admin)
chorus_admin_delete_task deletes
Deletes a task (admin)
chorus_create_session changes
Opens a worker session for a sub-agent
chorus_session_heartbeat changes
Keeps a worker session marked as alive
chorus_close_session changes
Closes a worker session

Similar servers