This document covers all tools provided by the Chorus MCP Server, including tool names, descriptions, input parameters, and output formats.
The Chorus MCP Server provides different tool sets based on Agent roles:
| Role | Tool Set |
|---|---|
| Developer Agent | Public + Session + Developer |
| PM Agent | Public + Session + PM |
| Admin Agent | Public + Session + Admin + PM + Developer |
Agents can filter results by project(s) using HTTP headers during MCP connection. This is useful when an agent works on multiple projects and wants to focus on a specific subset.
| Header | Format | Example | Description |
|---|---|---|---|
X-Chorus-Project |
Single UUID or comma-separated UUIDs | uuid1 or uuid1,uuid2,uuid3 |
Filter by specific project(s) |
X-Chorus-Project-Group |
Group UUID | group-uuid-here |
Filter by project group (includes all projects in the group) |
- No header: Returns results from all projects (default, backward compatible)
- X-Chorus-Project: Returns results only from specified project(s)
- X-Chorus-Project-Group: Returns results from all projects in the specified group
- Priority:
X-Chorus-Project-Grouptakes precedence overX-Chorus-Projectif both are provided
The following tools respect project filtering:
chorus_checkin- Returns filtered assignmentschorus_get_my_assignments- Returns filtered ideas and tasks
// .mcp.json configuration for single project
{
"mcpServers": {
"chorus": {
"type": "http",
"url": "http://localhost:3000/api/mcp",
"headers": {
"Authorization": "Bearer cho_xxx",
"X-Chorus-Project": "project-uuid-here"
}
}
}
}
// .mcp.json configuration for multiple projects
{
"mcpServers": {
"chorus": {
"type": "http",
"url": "http://localhost:3000/api/mcp",
"headers": {
"Authorization": "Bearer cho_xxx",
"X-Chorus-Project": "uuid1,uuid2,uuid3"
}
}
}
}
// .mcp.json configuration for project group
{
"mcpServers": {
"chorus": {
"type": "http",
"url": "http://localhost:3000/api/mcp",
"headers": {
"Authorization": "Bearer cho_xxx",
"X-Chorus-Project-Group": "group-uuid-here"
}
}
}
}MCP sessions implement sliding window expiration with activity tracking to balance resource efficiency with user experience.
- Activity tracking: Each session records
lastActivitytimestamp - 30-minute timeout: Sessions expire after 30 minutes of inactivity (not from creation time)
- Auto-renewal: Every MCP request automatically renews the session by updating
lastActivity - Periodic cleanup: Server checks for expired sessions every 5 minutes and cleans them up
- Memory storage: Sessions are stored in-memory and lost on server restart
Time 0:00 - Session created (lastActivity = 0:00)
Time 0:15 - API call made (lastActivity updated to 0:15)
Time 0:30 - API call made (lastActivity updated to 0:30)
Time 0:55 - No activity since 0:30 → Session expires (25 minutes inactive)
Time 1:00 - Cleanup runs, session deleted from memory
Time 1:05 - Client tries to use session → HTTP 404: "Session not found"
When a session expires:
- Server returns HTTP 404:
{"jsonrpc":"2.0","error":{"code":-32001,"message":"Session not found. Please reinitialize."},"id":null} - MCP client should automatically reinitialize by creating a new session
- This reconnection is transparent in clients that support auto-reconnect
✅ No mid-work expiration: Active agents can work for hours without timeout
✅ Resource efficient: Inactive sessions are cleaned up automatically
- Implement auto-reconnect: Handle HTTP 404 by reinitializing the session
- Keep sessions alive: Regular tool calls automatically prevent timeout
- Clean shutdown: Call DELETE
/api/mcpwhen done to free resources
Tools available to all Agents.
Description: Agent check-in. Returns agent identity (including owner/master info), roles, assigned work, and pending counts. Recommended at session start.
Project Filtering: Results can be filtered by project using HTTP headers during MCP connection:
X-Chorus-Project: Single or multiple project UUIDs (comma-separated)X-Chorus-Project-Group: Project group UUID (includes all projects in the group)- No header: Returns all projects (default behavior)
Input: None
Output:
{
"checkinTime": "ISO timestamp",
"agent": {
"uuid": "Agent UUID",
"name": "Agent name",
"roles": ["developer"],
"persona": "Persona description",
"systemPrompt": "System prompt (optional)",
"owner": { "uuid": "User UUID", "name": "Owner Name", "email": "owner@example.com" }
},
"assignments": {
"ideas": [...],
"tasks": [...]
},
"pending": {
"ideasCount": 0,
"tasksCount": 0
},
"notifications": {
"unreadCount": 0
}
}Description: List all projects for the current company (paginated). Returns projects with counts of ideas, documents, tasks, and proposals.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| page | number | No | Page number (default 1) |
| pageSize | number | No | Items per page (default 20) |
Output: { projects: [...], total: number }
Description: Get project details and background information
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
Output: Project details JSON
Description: Get the list of Ideas for a project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| status | string | No | Filter by status: open, elaborating, proposal_created, completed, closed |
| page | number | No | Page number (default 1) |
| pageSize | number | No | Items per page (default 20) |
Output:
{
"ideas": [...],
"total": 10,
"page": 1,
"pageSize": 20
}Description: Get detailed information for a single Idea
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output: Idea details JSON
Description: Get the list of documents for a project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| type | string | No | Filter by type: prd, tech_design, adr, etc. |
| page | number | No | Page number |
| pageSize | number | No | Items per page |
Output: Document list JSON
Description: Get detailed content of a single document
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| documentUuid | string | Yes | Document UUID |
Output: Document details JSON
Description: Get the list of proposals and their statuses for a project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| status | string | No | Filter by status: draft, pending, approved, rejected, revised |
| page | number | No | Page number |
| pageSize | number | No | Items per page |
Output: Proposal list JSON
Description: Get detailed information for a single proposal, including document drafts and task drafts
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
Output: Proposal details JSON (includes documentDrafts and taskDrafts)
Description: List tasks for a project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| status | string | No | Filter by status: open, assigned, in_progress, to_verify, done, closed |
| priority | string | No | Filter by priority: low, medium, high |
| proposalUuids | string[] | No | Filter tasks by proposal UUIDs |
| page | number | No | Page number |
| pageSize | number | No | Items per page |
Output: Task list JSON
Description: Get detailed information and context for a single task
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Task details JSON including:
acceptanceCriteriaItems: Array of structured acceptance criteria (each withuuid,description,required,devStatus,devEvidence,status,evidence, etc.)acceptanceStatus: Computed status —"not_started"|"in_progress"|"passed"|"failed"acceptanceSummary:{ total, required, passed, failed, pending, requiredPassed, requiredFailed, requiredPending }
Description: Get the activity stream for a project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| page | number | No | Page number |
| pageSize | number | No | Items per page (default 50) |
Output: Activity list JSON
Description: Get all Ideas and Tasks assigned to the current Agent
Project Filtering: Results can be filtered by project using HTTP headers during MCP connection:
X-Chorus-Project: Single or multiple project UUIDs (comma-separated)X-Chorus-Project-Group: Project group UUID (includes all projects in the group)- No header: Returns all projects (default behavior)
Input: None
Output:
{
"ideas": [...],
"tasks": [...]
}Description: Get claimable Ideas in a project (status=open)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
Output: List of claimable Ideas
Description: Get claimable Tasks in a project (status=open)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| proposalUuids | string[] | No | Filter tasks by proposal UUIDs |
Output: List of claimable Tasks
Description: Get unblocked tasks — tasks with status open/assigned where all dependencies are resolved (done/closed). Used to discover which tasks are ready to start. Note: to_verify is NOT considered resolved — only done and closed unblock dependents.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| proposalUuids | string[] | No | Filter tasks by proposal UUIDs |
Output:
{
"tasks": [...],
"total": 3
}Each task in the response includes the full TaskResponse format (with dependsOn, dependedBy, assignee, etc.).
Description: Answer elaboration questions for an Idea. Submits answers for a specific elaboration round. When all required questions are answered, the round moves to validation.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| roundUuid | string | Yes | Elaboration round UUID |
| answers | array | Yes | Answers to submit |
answers array item fields:
| Field | Type | Required | Description |
|---|---|---|---|
| questionId | string | Yes | Question ID to answer |
| selectedOptionId | string|null | Yes | Selected option ID (null if using custom text only) |
| customText | string|null | Yes | Custom text answer (null if using selected option only) |
Output: Updated Elaboration Round JSON (includes questions with their answers)
Description: Get the full elaboration state for an Idea, including all rounds, questions, answers, and a summary of progress.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output:
{
"ideaUuid": "...",
"depth": "standard",
"status": "resolved",
"rounds": [
{
"uuid": "...",
"roundNumber": 1,
"status": "validated",
"questions": [...],
"createdAt": "ISO timestamp"
}
],
"summary": {
"totalQuestions": 5,
"answeredQuestions": 5,
"validatedRounds": 1,
"pendingRound": null
}
}Description: Search for users and agents that can be @mentioned. Returns name, type, and UUID. Use the UUID to write mentions as @[Name](type:uuid) in comment/description text.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | Yes | Name or keyword to search |
| limit | number | No | Max results to return (default: 10) |
Output:
[
{ "type": "user", "uuid": "...", "name": "Yifei", "email": "yifei@...", "avatarUrl": "..." },
{ "type": "agent", "uuid": "...", "name": "Claude Dev", "roles": ["developer"] }
]Permission scoping:
- User caller: all company users + own agents
- Agent caller: all company users + same-owner agents
Description: Search across tasks, ideas, proposals, documents, projects, and project groups. Supports scoping to project groups or specific projects.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | Yes | Search query (matches title, description, content) |
| scope | enum | No | Search scope: global, group, project (default: global) |
| scopeUuid | string | No | Project group UUID (scope=group) or project UUID (scope=project) |
| entityTypes | string[] | No | Entity types to search: task, idea, proposal, document, project, project_group (default: all) |
Output:
{
"results": [
{
"entityType": "task",
"uuid": "...",
"title": "Task title",
"snippet": "...excerpt around match...",
"status": "open",
"projectUuid": "...",
"projectName": "Project A",
"updatedAt": "ISO timestamp"
}
],
"counts": {
"tasks": 5,
"ideas": 3,
"proposals": 2,
"documents": 4,
"projects": 1,
"projectGroups": 1
}
}Usage examples:
- Global search:
{ query: "authentication" } - Search in a project group:
{ query: "authentication", scope: "group", scopeUuid: "group-uuid" } - Search in a specific project:
{ query: "authentication", scope: "project", scopeUuid: "project-uuid" } - Search only tasks and ideas:
{ query: "authentication", entityTypes: ["task", "idea"] }
Description: List all project groups for the current company. Returns groups with project counts.
Input: None
Output:
{
"groups": [
{
"uuid": "Group UUID",
"name": "Group name",
"description": "...",
"projectCount": 3,
"createdAt": "ISO timestamp",
"updatedAt": "ISO timestamp"
}
],
"total": 1
}Description: Get a single project group by UUID with its projects list.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| groupUuid | string | Yes | Project Group UUID |
Output:
{
"uuid": "Group UUID",
"name": "Group name",
"description": "...",
"projectCount": 2,
"projects": [
{ "uuid": "...", "name": "Project A", "description": "..." }
],
"createdAt": "ISO timestamp",
"updatedAt": "ISO timestamp"
}Description: Get aggregated dashboard stats for a project group (project count, tasks, completion rate, ideas, proposals, activity stream).
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| groupUuid | string | Yes | Project Group UUID |
Output:
{
"group": { "uuid": "...", "name": "...", "description": "..." },
"stats": {
"projectCount": 3,
"totalTasks": 15,
"completedTasks": 8,
"completionRate": 53,
"openIdeas": 4,
"activeProposals": 2
},
"projects": [
{ "uuid": "...", "name": "...", "taskCount": 5, "completionRate": 60 }
],
"recentActivity": [...]
}Description: Add a comment to an Idea/Proposal/Task/Document
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| targetType | enum | Yes | Target type: idea, proposal, task, document |
| targetUuid | string | Yes | Target UUID |
| content | string | Yes | Comment content |
Output: Created comment JSON
Description: Get the list of comments for an Idea/Proposal/Task/Document
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| targetType | enum | Yes | Target type: idea, proposal, task, document |
| targetUuid | string | Yes | Target UUID |
| page | number | No | Page number |
| pageSize | number | No | Items per page |
Output: Comment list JSON
Available to all Agents. Used to manage Agent work sessions (e.g., sub-agent workers in swarm mode).
Description: Create a new Agent Session (e.g., representing a sub-agent worker)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Session name (e.g., "frontend-worker") |
| description | string | No | Session description |
| expiresAt | string | No | Expiration time (ISO timestamp) |
Output:
{
"uuid": "Session UUID",
"agentUuid": "Agent UUID",
"name": "frontend-worker",
"description": "...",
"status": "active",
"lastActiveAt": "ISO timestamp",
"expiresAt": null,
"createdAt": "ISO timestamp",
"activeCheckins": []
}Description: List all Sessions for the current Agent
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | string | No | Filter by status: active, inactive, closed |
Output:
{
"sessions": [...],
"total": 3
}Description: Get Session details and its active Task checkins
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
Output: Session details JSON (includes activeCheckins list)
Description: Close a Session (active/inactive → closed). Automatically checks out all active Task checkins.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
Output: Updated Session JSON
Description: Reopen a closed Session (closed → active). Used to reuse a previous session without creating a new one.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
Output: Updated Session JSON (status=active, lastActiveAt refreshed)
Description: Check in a Session to a Task, indicating work has started
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
| taskUuid | string | Yes | Task UUID |
Output: Checkin record JSON
Description: Check out a Session from a Task, indicating work has ended
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
| taskUuid | string | Yes | Task UUID |
Output: Updated checkin record JSON
Description: Session heartbeat, updates lastActiveAt. Active sessions with no heartbeat for 1 hour are automatically marked as inactive.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| sessionUuid | string | Yes | Session UUID |
Output: Confirmation message (includes updated lastActiveAt)
Available to PM Agent and Admin Agent. Not available to Developer Agent.
Description: Claim an Idea (open → elaborating). Claiming automatically transitions the Idea to 'elaborating' status. After claiming, start elaboration with chorus_pm_start_elaboration or skip with chorus_pm_skip_elaboration.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output: Updated Idea JSON
Description: Release a claimed Idea (elaborating → open)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output: Updated Idea JSON
Description: Update Idea status (only the assignee can perform this). Valid statuses: open, elaborating, proposal_created, completed, closed. Claiming auto-transitions to elaborating; use this tool for proposal_created (after Proposal submission) or completed (after approval).
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| status | enum | Yes | New status: proposal_created, completed |
Output: Updated Idea JSON
Description: Create a proposal container (can include document drafts and task drafts)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| title | string | Yes | Proposal title |
| description | string | No | Proposal description |
| inputType | enum | Yes | Input source type: idea, document |
| inputUuids | string[] | Yes | List of input UUIDs |
| documentDrafts | array | No | List of document drafts |
| taskDrafts | array | No | List of task drafts |
Output: Created Proposal JSON
Description: Validate a Proposal's completeness before submission. Returns errors (block submission), warnings (advisory), and info (hints). Call this before chorus_pm_submit_proposal to preview validation issues.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID to validate |
Output:
{
"valid": true,
"issues": [
{
"id": "E1",
"level": "error",
"message": "Proposal must contain at least one PRD document draft",
"field": null
},
{
"id": "W2",
"level": "warning",
"message": "Task draft \"Implement API\" is missing a description",
"field": "Implement API"
}
]
}Validation checks:
| ID | Level | Check |
|---|---|---|
| E1 | error | At least one PRD document draft required |
| E2 | error | Every document draft must have content >= 100 characters |
| E3 | error | At least one task draft required |
| E4 | error | inputUuids must be non-empty |
| E5 | error | All input Ideas must have elaborationStatus = 'resolved' |
| W1 | warning | At least one tech_design document draft recommended |
| W2 | warning | Every task draft should have a description |
| W3 | warning | Every task draft should have acceptance criteria |
| W4 | warning | When >= 2 tasks, at least one should declare dependencies |
| W5 | warning | Proposal description should be non-empty |
| I1 | info | Every task draft should have priority set |
| I2 | info | Every task draft should have storyPoints set |
Usage: Call before chorus_pm_submit_proposal to preview issues. Errors will block submission; warnings and info are advisory. submitProposal also runs this validation internally and rejects if errors are found.
Description: Submit a Proposal for approval (draft → pending). Runs chorus_pm_validate_proposal internally and rejects with a formatted error if any error-level issues are found. Call chorus_pm_validate_proposal first to preview issues before submitting.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
Output: Updated Proposal JSON (status changes to pending)
Description: Create a document (PRD, technical design, ADR, etc.)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| type | enum | Yes | Document type: prd, tech_design, adr, spec, guide |
| title | string | Yes | Document title |
| content | string | No | Document content (Markdown) |
| proposalUuid | string | No | Associated Proposal UUID |
Output: Created Document JSON
Description: Batch create tasks (can be associated with a Proposal, supports intra-batch dependencies)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| proposalUuid | string | No | Associated Proposal UUID |
| tasks | array | Yes | Task list |
tasks array item fields:
| Field | Type | Required | Description |
|---|---|---|---|
| title | string | Yes | Task title |
| description | string | No | Task description |
| priority | enum | No | Priority: low, medium, high |
| storyPoints | number | No | Effort estimate (Agent hours) |
| acceptanceCriteria | string | No | Acceptance criteria (Markdown, legacy) |
| acceptanceCriteriaItems | array | No | Structured acceptance criteria: [{ description: string, required?: boolean }] |
| draftUuid | string | No | Temporary UUID for intra-batch dependsOnDraftUuids references |
| dependsOnDraftUuids | string[] | No | List of intra-batch draftUuids this task depends on |
| dependsOnTaskUuids | string[] | No | List of existing Task UUIDs this task depends on |
Output:
{
"tasks": [...],
"count": 3,
"draftToTaskUuidMap": { "draft-1": "real-uuid-1", ... },
"warnings": ["..."]
}draftToTaskUuidMap: Only returned when any task provides a draftUuidwarnings: Only returned when there are issues creating dependencies (tasks themselves are created successfully)
Description: Update document content (increments version number)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| documentUuid | string | Yes | Document UUID |
| title | string | No | New title |
| content | string | No | New content (Markdown) |
Output: Updated Document JSON
Description: Add a document draft to a pending Proposal container
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| type | string | Yes | Document type |
| title | string | Yes | Document title |
| content | string | Yes | Document content (Markdown) |
Output: Updated Proposal JSON
Description: Add a task draft to a pending Proposal container
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| title | string | Yes | Task title |
| description | string | No | Task description |
| storyPoints | number | No | Effort estimate (Agent hours) |
| priority | enum | No | Priority: low, medium, high |
| acceptanceCriteria | string | No | Acceptance criteria (Markdown, legacy) |
| acceptanceCriteriaItems | array | No | Structured acceptance criteria: [{ description: string, required?: boolean }] |
| dependsOnDraftUuids | string[] | No | List of dependent taskDraft UUIDs (automatically converted to real dependencies upon approval) |
Output: Updated Proposal JSON
Description: Update a document draft in a Proposal
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| draftUuid | string | Yes | Document draft UUID |
| type | string | No | Document type |
| title | string | No | Document title |
| content | string | No | Document content |
Output: Updated Proposal JSON
Description: Update a task draft in a Proposal
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| draftUuid | string | Yes | Task draft UUID |
| title | string | No | Task title |
| description | string | No | Task description |
| storyPoints | number | No | Effort estimate |
| priority | enum | No | Priority |
| acceptanceCriteria | string | No | Acceptance criteria |
| dependsOnDraftUuids | string[] | No | List of dependent taskDraft UUIDs |
Output: Updated Proposal JSON
Description: Remove a document draft from a Proposal
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| draftUuid | string | Yes | Document draft UUID |
Output: Updated Proposal JSON
Description: Remove a task draft from a Proposal
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| draftUuid | string | Yes | Task draft UUID |
Output: Updated Proposal JSON
Description: Add a task dependency (taskUuid depends on dependsOnTaskUuid). Includes same-project validation, self-dependency check, and DFS cycle detection.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID (downstream task) |
| dependsOnTaskUuid | string | Yes | Dependent Task UUID (upstream task) |
Output: Created dependency JSON
{
"taskUuid": "...",
"dependsOnUuid": "...",
"createdAt": "ISO timestamp"
}Error scenarios:
- Self-dependency:
A task cannot depend on itself - Task not found:
Task not found/Dependency task not found - Cross-project:
Tasks must belong to the same project - Cycle detected:
Adding this dependency would create a cycle
Description: Remove a task dependency
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| dependsOnTaskUuid | string | Yes | Dependency Task UUID to remove |
Output:
{
"success": true,
"taskUuid": "...",
"dependsOnTaskUuid": "..."
}Description: Assign a task to a specified Developer Agent (task must be in open or assigned status)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| agentUuid | string | Yes | Target Developer Agent UUID |
Output: Updated Task JSON
Validation rules:
- Task must be in open or assigned status
- Target Agent must exist and belong to the same company
- Target Agent must have the developer or developer_agent role
Description: Start an elaboration round for an Idea. Creates structured questions for the Idea creator/stakeholder to answer, clarifying requirements before proposal creation. Recommended for every Idea. Structured elaboration improves Proposal quality and reduces rejection cycles.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| depth | enum | Yes | Elaboration depth: minimal, standard, comprehensive |
| questions | array | Yes | Questions to ask (1-15 per round) |
questions array item fields:
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Unique question identifier |
| text | string | Yes | Question text |
| category | enum | Yes | Category: functional, non_functional, business_context, technical_context, user_scenario, scope |
| options | array | Yes | Answer options (2-5 required) |
| required | boolean | No | Whether the question is required (default: true) |
options array item fields:
| Field | Type | Required | Description |
|---|---|---|---|
| id | string | Yes | Option identifier |
| label | string | Yes | Option label |
| description | string | No | Option description |
Output: Created Elaboration Round JSON
Description: Validate answers from an elaboration round. If no issues are found, the elaboration is marked as resolved. If issues exist, optionally provide follow-up questions for a new round.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| roundUuid | string | Yes | Elaboration round UUID |
| issues | array | Yes | List of issues found (empty array = all valid) |
| followUpQuestions | array | No | Follow-up questions for a new round (only if issues found) |
issues array item fields:
| Field | Type | Required | Description |
|---|---|---|---|
| questionId | string | Yes | Question ID with the issue |
| type | enum | Yes | Issue type: contradiction, ambiguity, incomplete |
| description | string | Yes | Issue description |
followUpQuestions array item fields: Same as questions in chorus_pm_start_elaboration.
Output: Validation result JSON. If issues are empty, elaboration status changes to resolved. If follow-up questions are provided, a new round is created with status pending_answers.
Description: Skip elaboration for an Idea (marks as resolved with minimal depth). Use only for trivially clear Ideas (e.g., bug fixes with clear reproduction steps). A reason is required and logged in the activity stream. Prefer chorus_pm_start_elaboration for most Ideas.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| reason | string | Yes | Reason for skipping elaboration |
Output:
{
"ideaUuid": "...",
"action": "elaboration_skipped",
"reason": "Bug fix with clear reproduction steps"
}Description: Move an Idea to a different project within the same company. Also moves linked draft/pending Proposals.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
| targetProjectUuid | string | Yes | Target Project UUID |
Output: Updated Idea JSON ({ uuid, project: { uuid, name } })
Description: Create an Idea in a project (submit requirements on behalf of humans or from discovered requirements)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| title | string | Yes | Idea title |
| content | string | No | Idea detailed description |
Output: Created Idea JSON ({ uuid, title })
Available to Developer Agent and Admin Agent. Not available to PM Agent.
Description: Claim a Task (open → assigned)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Updated Task JSON
Description: Release a claimed Task (assigned → open)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Updated Task JSON
Description: Update task status (only the assignee can perform this)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| status | enum | Yes | New status: in_progress, to_verify |
| sessionUuid | string | No | Associated Session UUID (used to attribute which worker performed the action) |
Behavior:
- When
sessionUuidis provided, the Activity record includes session attribution, and a session heartbeat is automatically sent. - Dependency enforcement: When transitioning to
in_progress, the system checks that alldependsOntasks are resolved (doneorclosed). If any dependency is unresolved, the request is rejected with a detailed error listing each blocker's title, status, assignee, and active session info. Usechorus_get_unblocked_tasksto find tasks that are ready to start.
Output: Updated Task JSON (or error with blocker details if dependencies are unresolved)
Description: Submit a task for human verification (in_progress → to_verify)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| summary | string | No | Work summary |
Output: Updated Task JSON
Description: Report work progress or completion
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| report | string | Yes | Work report content |
| status | enum | No | Optionally update status simultaneously: in_progress, to_verify |
| sessionUuid | string | No | Associated Session UUID (used to attribute which worker performed the action) |
Behavior: When sessionUuid is provided, the Activity record includes session attribution, and a session heartbeat is automatically sent.
Output: Confirmation message
Available only to Admin Agent. Used to perform approval, verification, and project management operations on behalf of humans.
Description: Create a new project
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Project name |
| description | string | No | Project description |
Output: Created Project JSON
Description: Approve a Proposal
Important behavior: Upon approval, the system automatically materializes all drafts in the Proposal into actual resources:
documentDrafts→ Automatically creates corresponding Documents (linked to this Proposal)taskDrafts→ Automatically creates corresponding Tasks (linked to this Proposal)
Therefore, after approval there is no need to manually call chorus_pm_create_tasks or chorus_pm_create_document to create these resources, as doing so would produce duplicate data. chorus_pm_create_tasks and chorus_pm_create_document are only for creating resources directly without going through the Proposal flow.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| reviewNote | string | No | Review note |
Output: Updated Proposal JSON
Description: Reject a Proposal
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| proposalUuid | string | Yes | Proposal UUID |
| reviewNote | string | Yes | Rejection reason (required) |
Output: Updated Proposal JSON
Description: Report self-check results on acceptance criteria for a task (Developer tool)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| criteria | array | Yes | Array of { uuid: string, devStatus: "passed"|"failed", devEvidence?: string } |
Output: Updated acceptance status { items, status, summary }
Description: Mark acceptance criteria as passed or failed during admin verification (batch)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| criteria | array | Yes | Array of { uuid: string, status: "passed"|"failed", evidence?: string } |
Output: Updated acceptance status { items, status, summary }
Description: Verify a Task (to_verify → done). Acceptance criteria gate: If the task has structured acceptance criteria, all required criteria must have status: "passed" before verification is allowed. Tasks without structured criteria are not gated (backward compatible).
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Updated Task JSON (or error if acceptance criteria gate blocks verification)
Description: Reopen a Task (to_verify → in_progress, used when verification fails). If the task has unresolved dependencies, use force=true to bypass the dependency check.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
| force | boolean | No | Force status change, bypassing dependency check. When used, a force_status_change activity is logged. |
Output: Updated Task JSON
Description: Close a Task (any status → closed)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Updated Task JSON
Description: Close an Idea (any status → closed)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output: Updated Idea JSON
Description: Delete an Idea
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| ideaUuid | string | Yes | Idea UUID |
Output: Confirmation message
Description: Delete a Task
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| taskUuid | string | Yes | Task UUID |
Output: Confirmation message
Description: Delete a Document
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| documentUuid | string | Yes | Document UUID |
Output: Confirmation message
Description: Create a new project group (Admin exclusive)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | Project group name |
| description | string | No | Project group description |
Output: Created Project Group JSON (includes uuid, name, description, projectCount, createdAt, updatedAt)
Description: Update a project group (Admin exclusive)
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| groupUuid | string | Yes | Project Group UUID |
| name | string | No | New group name |
| description | string | No | New group description |
Output: Updated Project Group JSON
Description: Delete a project group (Admin exclusive). Projects in the group become ungrouped.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| groupUuid | string | Yes | Project Group UUID |
Output: Confirmation message
Description: Move a project to a different group or ungroup it (Admin exclusive). Set groupUuid to null to ungroup.
Input:
| Parameter | Type | Required | Description |
|---|---|---|---|
| projectUuid | string | Yes | Project UUID |
| groupUuid | string|null | Yes | Target Project Group UUID (null to ungroup) |
Output:
{
"uuid": "Project UUID",
"name": "Project name",
"groupUuid": "Group UUID or null"
}- Agent: Sr. Claude (uuid: 1e7019fd-..., roles: developer_agent, pm_agent, admin_agent)
- Server: localhost:3000
| # | Tool | Action | Result | Notes |
|---|---|---|---|---|
| 1 | chorus_checkin | Agent check-in | ✅ Pass | Returns agent info, assignments, pending |
| 2 | chorus_admin_create_project | Create project | ✅ Pass | Returns project UUID |
| 3 | chorus_get_project | Get project details | ✅ Pass | |
| 4 | chorus_pm_create_idea | Create Idea | ✅ Pass | status=open |
| 5 | chorus_get_ideas | Get Ideas list | ✅ Pass | Pagination correct |
| 6 | chorus_get_idea | Get single Idea | ✅ Pass | id field (should be hidden) |
| 7 | chorus_get_available_ideas | Get claimable Ideas | ✅ Pass | |
| 8 | chorus_claim_idea | Claim Idea | ✅ Pass | open → elaborating |
| 9 | chorus_update_idea_status | Update Idea status | ✅ Pass | (status transitions) |
| 10 | chorus_get_my_assignments | Get my assignments | ✅ Pass | ideas and tasks lists |
| 11 | chorus_add_comment (idea) | Comment on Idea | ✅ Pass | |
| 12 | chorus_get_comments | Get comments list | ✅ Pass | |
| 13 | chorus_pm_create_proposal | Create Proposal | ✅ Pass | Contains documentDrafts + taskDrafts, status=draft |
| 14 | chorus_get_proposals | Get Proposals list | ✅ Pass | |
| 15 | chorus_get_proposal | Get single Proposal | ✅ Pass | |
| 16 | chorus_pm_add_document_draft | Add document draft | ✅ Pass | Appended to documentDrafts |
| 17 | chorus_pm_add_task_draft | Add task draft | ✅ Pass | |
| 18 | chorus_pm_update_document_draft | Update document draft | ✅ Pass | |
| 19 | chorus_pm_update_task_draft | Update task draft | ✅ Pass | |
| 20 | chorus_pm_remove_task_draft | Remove task draft | ✅ Pass | |
| 21 | chorus_pm_submit_proposal | Submit Proposal for approval | ✅ Pass | draft → pending (new tool) |
| 22 | chorus_admin_approve_proposal | Approve Proposal | ✅ Pass | pending → approved, |
| 23 | chorus_add_comment (proposal) | Comment on Proposal | ✅ Pass | |
| 24 | chorus_pm_create_tasks | Batch create tasks | ✅ Pass | |
| 25 | chorus_pm_create_document | Create document | ✅ Pass | version=1 |
| 26 | chorus_pm_update_document | Update document | ✅ Pass | version auto-increments to 2 |
| 27 | chorus_list_tasks | List tasks | ✅ Pass | |
| 28 | chorus_get_available_tasks | Get claimable Tasks | ✅ Pass | |
| 29 | chorus_claim_task | Claim Task | ✅ Pass | open → assigned |
| 30 | chorus_update_task | Update task status | ✅ Pass | assigned → in_progress |
| 31 | chorus_report_work | Report work progress | ✅ Pass | Records activity |
| 32 | chorus_add_comment (task) | Comment on Task | ✅ Pass | |
| 33 | chorus_submit_for_verify | Submit for verification | ✅ Pass | in_progress → to_verify |
| 34 | chorus_admin_reopen_task | Reopen Task | ✅ Pass | to_verify → in_progress |
| 35 | chorus_admin_verify_task | Verify Task | ✅ Pass | to_verify → done |
| 36 | chorus_release_task | Release claimed Task | ✅ Pass | assigned → open |
| 37 | chorus_admin_close_task | Close Task | ✅ Pass | any → closed |
| 38 | chorus_get_task | Get single Task | ✅ Pass | id field (should be hidden) |
| 39 | chorus_get_document | Get single document | ✅ Pass | |
| 40 | chorus_get_activity | Get activity stream | ✅ Pass | Recorded submit, comment_added, etc. |
| 41 | chorus_release_idea | Release claimed Idea | ✅ Pass | assigned → open |
| 42 | chorus_admin_close_idea | Close Idea | ✅ Pass | any → closed |
| 43 | chorus_admin_reject_proposal | Reject Proposal | ✅ Pass | pending → rejected, includes reviewNote |
| 44 | chorus_admin_delete_task | Delete Task | ✅ Pass | |
| 45 | chorus_admin_delete_document | Delete Document | ✅ Pass | |
| 46 | chorus_admin_delete_idea | Delete Idea | ✅ Pass |
- Issue: After Proposal creation status=draft, but no MCP tool could submit it to pending status, making
admin_approve_proposalunusable (only accepts pending status) - Fix: Added
chorus_pm_submit_proposaltool insrc/mcp/tools/pm.ts
- Issue:
chorus_get_ideaandchorus_get_taskreturnedid(database auto-increment ID) andcompanyUuidand other internal fields - Fix: Changed to call
ideaService.getIdea()andtaskService.getTask(), returning formatted responses
- Issue: PM Agent was incorrectly registered with the Developer tool set
- Fix: Modified
src/mcp/server.tsso PM Agent only registers Public + PM tools
- Issue: Only
submit_for_verifyandreport_workgenerated Activity records, 12 other operations were missing - Fix: Added Activity records for the following operations:
- PM:
claim_idea,release_idea,update_idea_status - Developer:
claim_task,release_task,update_task - Admin:
approve_proposal,reject_proposal,verify_task,reopen_task,close_task,close_idea
- PM:
- Approving a Proposal automatically materializes drafts into actual Tasks and Documents
- After approval, there is no need to manually call
pm_create_tasksorpm_create_document