CHAP Coordinator
NPM · @BRIGHTBEAMAI/CHAP-COORDINATOR-MCP · SCANNED SEP 24
Auditable records of human decisions over AI agent work. Approvals, edits, overrides, escalations.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 52 of 131 dependencies flagged as unhealthy (1 deprecated). View diagnostics → Partial
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (Apache-2.0).Pass
- Actively maintained (last published 16 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 7630 tokens (~195/item across 39 items; 39 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management91
- Stability check failed: the tool surface changed between 0.2.11 and 0.2.13: 0 tool removals, 2 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "chap.participant.leave" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 40 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
How do I install the CHAP Coordinator MCP server?
CHAP Coordinator runs locally as an npm package, launched with npx -y @brightbeamai/chap-coordinator-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @brightbeamai/chap-coordinator-mcp
claude mcp add brightbeamai-chap -- npx -y @brightbeamai/chap-coordinator-mcp
{
"mcpServers": {
"brightbeamai-chap": {
"command": "npx",
"args": [
"-y",
"@brightbeamai/chap-coordinator-mcp"
]
}
}
} {
"servers": {
"brightbeamai-chap": {
"command": "npx",
"args": [
"-y",
"@brightbeamai/chap-coordinator-mcp"
]
}
}
} codex mcp add brightbeamai-chap -- npx -y @brightbeamai/chap-coordinator-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"brightbeamai-chap": {
"type": "local",
"command": [
"npx",
"-y",
"@brightbeamai/chap-coordinator-mcp"
],
"enabled": true
}
}
} openclaw mcp add brightbeamai-chap --command npx --arg -y --arg @brightbeamai/chap-coordinator-mcp
mcp_servers:
brightbeamai-chap:
command: "npx"
args: ["-y", "@brightbeamai/chap-coordinator-mcp"] {
"McpServers": {
"brightbeamai-chap": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@brightbeamai/chap-coordinator-mcp"
]
}
}
} assistant mcp add brightbeamai-chap -t stdio -c npx -a -y @brightbeamai/chap-coordinator-mcp
{
"mcpServers": {
"brightbeamai-chap": {
"command": "npx",
"args": [
"-y",
"@brightbeamai/chap-coordinator-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 22 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 81 to 84.
- 20 Sept 26 −2
No change was recorded against any check on this day. Stability & Change Management went from 97 to 77.
- 18 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 91 to 94.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 81 to 84.
- 13 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 74 to 77.
- 11 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 67 to 71.
- 9 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 61 to 64.
- 7 Sept 26 +16
- Tool safety: pass → unverified ▼ security
- Stability: 0.57 → unverified ▼ security
- Stability: 0.57 → fail ▼ security
- Malware scan: unverified → pass ▲ security
- Schema quality: 120 → 195 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Tool coverage: 67% → 100% ▲ functional
- First check of Schema quality: unverified functional
- Schema quality: good → excellent functional
- Package version: 0.2.12 → 0.2.13 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 24 Sept 2026 · Analysed npm/@brightbeamai/chap-coordinator-mcp@0.2.13
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 131 packages
| Packages resolved | 131 |
|---|---|
| Deprecated | 1 |
| Stale | 51 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
chap.abstain.declare ~131
Stand aside from a review, giving a reason and a category. The task moves to abstained.
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | – | The kind of abstention. Recorded in the audit entry. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| reason | string | yes | Why this reviewer is standing aside. Recorded in the audit entry. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.audit.read ~99
Read entries from a workspace's audit log, optionally within a sequence range and filtered by method, sender or task.
| Name | Type | Req | Description |
|---|---|---|---|
| filter | object | – | Narrows the entries returned. Conditions combine with AND, and are applied within the sequence window rather than before it. |
| range | object | – | Sequence window to return. Omit for the whole log. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.audit.submit_to_scitt ~170
Build COSE_Sign1-shaped statements for a range of audit entries and submit them to the configured SCITT transparency service. Where none is configured the statements are returned for submission out of band.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| issuer | string | – | Issuer identifier placed on each SCITT signed statement, naming who vouches for the chain. Defaults to 'service:coordinator'. Where no submitter is configured the statements are returned unsigned for… |
| range | object | – | Sequence window to anchor. Omit to submit the whole chain. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.audit.verify_chain ~128
Replay a workspace's prev-hash chain. Only status verified with ok true means the log was checked and is intact. Status not_evaluated with ok false means part of the log was never checked, so its integrity is unknown and must not be reported as verified; entries_unchecked says how much. An error means the chain is broken or absent.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.audit.verify_receipt ~121
Verify a SCITT receipt through the configured verifier. Verification fails closed where no verifier is configured.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | – | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| receipt | object | yes | The SCITT receipt to check, as returned by the transparency service. Verification is delegated to a hook supplied by the deployment, and fails closed with -32082 where no hook is configured. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.cancel ~125
Cancel a task. Cancelled is terminal, and a task that has already settled cannot be cancelled.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| reason | string | – | Why the task was cancelled. Recorded in the audit entry. |
| task_id | string | yes | The task to cancel. A task that is completed, declined, cancelled or superseded is refused with -32061. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.pause ~289
Pause work. Scoped to a task it moves that task to paused; to a participant it stops new tasks being assigned to them; to the workspace it refuses every method except describing, reading the audit log, joining, leaving and resuming.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| in_flight_policy | string | – | Recorded with the request, and echoed back when scope is 'participant'. The coordinator does not act on it: under either value, work already under way is left alone. |
| participant_uri | string | – | Whose work to pause, when scope is 'participant'. Must be a workspace member. |
| reason | string | – | Why the pause was applied. Recorded in the audit entry. |
| scope | string | – | What the pause applies to. 'task' moves one task to 'paused'; a task that is completed, declined, cancelled or superseded is refused with -32061. 'participant' stops new tasks being assigned to that… |
| task_id | string | – | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.resume ~183
Resume work paused at the same scope: a task returns to in_progress, a participant can be assigned tasks again, a workspace returns to active.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| participant_uri | string | – | Whose work to resume, when scope is 'participant'. Must be a workspace member. |
| scope | string | – | What the resume applies to. 'task' returns a paused task to 'in_progress'; a task that is not paused is refused with -32061. 'participant' allows that member to be assigned tasks again. 'workspace' r… |
| task_id | string | – | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.rollback ~213
Restore workspace state from a snapshot. The mode ceiling and member roles are restored; the rollback is appended to the audit log rather than rewriting it.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| reason | string | – | Why the rollback was performed. The rollback is itself an audit entry; earlier entries are not rewritten. |
| to_snapshot_artefact_id | string | yes | Artefact id returned by chap.control.snapshot. An id with no matching snapshot is refused with -32062. |
| what_to_restore | array | – | Which captured aspects to apply. Only 'mode_ceiling' and 'members' are restored; the others are held in the snapshot and not reapplied. Restoring members resets role and scopes on members still prese… |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.set_mode_ceiling ~160
Set the highest operating mode tasks in this workspace may request. A task above the ceiling is refused.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| new_ceiling | string | yes | The highest mode tasks in this workspace may request from now on. Existing tasks keep the mode they were created with. Where the coordinator is configured to enforce step-up authentication this metho… |
| reason | string | – | Why the ceiling is being changed. Recorded in the audit entry. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.snapshot ~159
Capture the workspace state as an artefact and return its id, which chap.control.rollback takes as its target.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| include | array | – | Which aspects of the workspace to capture. Recognised values are 'members', 'open_tasks', 'mode_ceiling', 'policy' and 'audit'. Defaults to members, open_tasks and mode_ceiling. |
| label | string | – | Name for this snapshot, recorded on the artefact. chap.control.rollback identifies a snapshot by its artefact id, not by label. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.control.supersede ~141
Replace a task with a successor in one call. The original moves to superseded and stays linked to its replacement.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| reason | string | – | Why the original is being replaced. Recorded in the audit entry. |
| successor_task | object | yes | The replacement task. |
| task_id | string | yes | The task being replaced. It moves to 'superseded' and is linked to the successor rather than deleted. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.decide.approve ~224
Approve the artefact under review. The task completes once the review's rule is satisfied.
| Name | Type | Req | Description |
|---|---|---|---|
| approved_artefact_digest | string | – | Optional. SHA-256 over the JCS canonicalisation of the artefact under review, in the form `sha256:<hex>`. When present it binds the decision to the exact content reviewed, and a mismatch is refused w… |
| comment | string | – | The reviewer's note on this decision. Recorded in the audit entry for the decision. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| tags | array | – | Workspace-defined labels for this decision, e.g. ['tone', 'unsupported-claim']. Recorded in the audit entry. chap.audit.read does not filter on tags, so grouping by tag is done by the reader. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.decide.override ~415
Correct the artefact under review with an RFC 6902 JSON Patch and accept the result. The patch, the rationale and any tags are recorded together, so the audit log holds what was changed and why, rather than only that the work was not accepted as written.
| Name | Type | Req | Description |
|---|---|---|---|
| approved_artefact_digest | string | – | Optional. SHA-256 over the JCS canonicalisation of the artefact under review, in the form `sha256:<hex>`. When present it binds the decision to the exact content reviewed, and a mismatch is refused w… |
| diff | array | yes | RFC 6902 JSON Patch operations applied to the artefact under review. The patched artefact becomes the task output; a patch that does not apply is refused with -32012. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| intent_preserved | boolean | – | True when the edit refines the decision the draft was making, false when it substitutes a different one. Recorded in the audit entry. |
| logical_id | string | – | Caller-chosen identifier for the item being decided, stable across revisions and overrides of the same underlying content. Recorded in the audit entry. |
| policy_refs | array | – | Identifiers of the policies or guidelines this correction applies, e.g. ['policy:no-delivery-promises']. Recorded in the audit entry. |
| rationale | string | yes | Why the correction was made. Required on every override and recorded in the audit entry, since the diff shows what changed but not why. |
| tags | array | – | Workspace-defined labels for this decision, e.g. ['tone', 'unsupported-claim']. Recorded in the audit entry. chap.audit.read does not filter on tags, so grouping by tag is done by the reader. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.decide.reject ~260
Reject the artefact under review. The task is declined, or returns to in_progress if request_revision is set.
| Name | Type | Req | Description |
|---|---|---|---|
| approved_artefact_digest | string | – | Optional. SHA-256 over the JCS canonicalisation of the artefact under review, in the form `sha256:<hex>`. When present it binds the decision to the exact content reviewed, and a mismatch is refused w… |
| comment | string | – | The reviewer's note on this decision. Recorded in the audit entry for the decision. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| request_revision | boolean | – | When true the task returns to 'in_progress' rather than 'declined', so the assignee can revise and resubmit. |
| tags | array | – | Workspace-defined labels for this decision, e.g. ['tone', 'unsupported-claim']. Recorded in the audit entry. chap.audit.read does not filter on tags, so grouping by tag is done by the reader. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.deliberate.close ~111
Close a deliberation and compute its outcome from the votes cast under its rule.
| Name | Type | Req | Description |
|---|---|---|---|
| deliberation_id | string | yes | Identifier returned by chap.deliberate.open. Closing computes the outcome from the votes cast; closing an already closed deliberation returns the outcome unchanged. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.deliberate.comment ~138
Record a comment on an open deliberation, so the reasoning is on the audit log alongside the votes.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | yes | The contribution to record. Comments are kept with the deliberation and in the audit log, so the reasoning survives the vote. |
| deliberation_id | string | yes | Identifier returned by chap.deliberate.open. A closed deliberation is refused with -32032. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.deliberate.open ~344
Open a deliberation among several participants under a stated voting rule: any_one_approves, all_approve, quorum:N, weighted_vote:T or weighted_vote_with_veto:T.
| Name | Type | Req | Description |
|---|---|---|---|
| deadline | string | – | When voting is intended to close, as an ISO 8601 timestamp. Recorded on the deliberation; closing is done by chap.deliberate.close and the coordinator does not close on the deadline. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| question | string | – | What the group is deciding. State it so that a yea or a nay is unambiguous. |
| rule | string | yes | How the outcome is decided when the deliberation closes: any_one_approves, all_approve, quorum:N, weighted_vote:T or weighted_vote_with_veto:T. An unrecognised rule is refused at open with -32033. |
| task_id | string | – | Task identifier returned by chap.task.create. |
| to | array | yes | The participants entitled to vote. A vote from anyone else is refused with -32030. |
| veto | object | – | Voter to can-veto map. A veto is honoured only under weighted_vote_with_veto, and only from a voter listed true here. |
| weights | object | – | Voter to weight map, read by the weighted rules. A voter with no entry counts as 1. Weights must be integers: a JSON number with a fractional part is refused with -32602. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.deliberate.vote ~249
Cast a yea, nay or abstain in an open deliberation. Each participant votes once.
| Name | Type | Req | Description |
|---|---|---|---|
| comment | string | – | Why the vote went this way. Recorded with it. |
| deliberation_id | string | yes | Identifier returned by chap.deliberate.open. A closed deliberation is refused with -32032, and a second vote from the same voter with -32031. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| veto_invoked | boolean | – | Blocks the outcome regardless of the tally. Honoured only under weighted_vote_with_veto, and only when the voter is listed true in the veto map given at open. |
| vote | string | yes | This voter's position. An abstention is recorded but counts as neither a yea nor a nay, so under all_approve or quorum:N it withholds the approval those rules need. |
| weight | integer | – | Recorded with the vote. The tally uses the weights map given at chap.deliberate.open, not this value. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.escalate.auto ~161
Evaluate a task's routing hints against the escalation policy and report whether it should be escalated, and to whom. Records a route_decision artefact.
| Name | Type | Req | Description |
|---|---|---|---|
| default_escalation_target | string | – | Who to escalate to when the policy decides to escalate and names no target of its own. It must be a workspace member or a group URI; if the policy escalates with no usable target the call is refused… |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.escalate.raise ~154
Hand a task upwards. The original moves to escalated and is linked to a new task opened for whoever takes it on. The successor starts with an empty input unless one is supplied.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| new_task | object | yes | The successor task to open for the escalation target. |
| original_task_id | string | yes | The task being escalated. It moves to 'escalated' and is linked to the successor. A completed, cancelled or superseded task cannot be escalated. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.handoff.accept ~147
Accept a proposed handoff. The accepted tasks are reassigned to the accepting participant.
| Name | Type | Req | Description |
|---|---|---|---|
| accepted_task_ids | array | – | Which of the proposed tasks are being accepted. If omitted, all of them are. |
| comment | string | – | Anything the recipient wants recorded when taking the work on. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| handoff_id | string | yes | Identifier returned by chap.handoff.propose. A handoff already accepted or declined is refused with -32051. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.handoff.decline ~151
Decline a proposed handoff, with a reason and optionally a suggestion of who should take it instead.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| handoff_id | string | yes | Identifier returned by chap.handoff.propose. A handoff already accepted or declined is refused with -32051. |
| reason | string | – | Why the handover is refused. Recorded so the proposer can route it elsewhere. |
| suggested_target | string | – | Who should take it instead, if the decliner knows. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.handoff.propose ~209
Propose handing one or more tasks to another participant or a group, with the context needed to pick them up. Every task must currently be assigned to the proposer.
| Name | Type | Req | Description |
|---|---|---|---|
| context_links | array | – | URLs to threads, tickets or documents the recipient will need. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| summary | string | – | Covering note for the handover as a whole, above the per-task detail. |
| tasks | array | yes | The work being handed over, one entry per task. Every task must currently be assigned to the proposer; otherwise the proposal is refused with -32050. |
| to | string | yes | Recipient, as a participant URI or a group URI such as 'group:support-team'. A recipient who is not a workspace member is refused with -32052. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.participant.join ~199
Add a participant to a workspace. The type given, human, agent, service, group or workspace, decides whether they are eligible to review work that requires it.
| Name | Type | Req | Description |
|---|---|---|---|
| display_name | string | – | Human-readable name for interfaces. Not used in authorisation. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| role | string | – | Operator-defined role, e.g. 'reviewer' or 'drafter'. One value is read by the coordinator: 'admin' permits revoking another member's key. |
| type | string | yes | The kind of participant. Only members of type 'human' are eligible for the review that chap.task.complete opens on a task marked review_required, and a completion with no eligible human is refused wi… |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.participant.leave ~75
Remove a participant from a workspace. Entries they have already written stay in the audit log.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.participant.revoke_key ~211
Revoke a signing key, for example after a device is lost. Signatures presented with it are refused from then on. Revoking another participant's key requires the admin role.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| kid | string | yes | Key id to revoke. It is marked revoked with a timestamp and a reason, and signatures presented with it are refused from then on. A key id that is unknown is refused with -32071. |
| reason | string | – | Why the key was revoked, e.g. 'laptop lost'. Recorded on the key and in the audit entry. |
| target_uri | string | yes | Whose key is being revoked. Revoking another member's key requires the caller to hold the role 'admin'; otherwise the call is refused with -32011. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.participant.rotate_key ~203
Retire a participant's signing key and register its replacement. The old key stays in the key history with a valid_until timestamp, so envelopes it signed still verify.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| new_jwk | object | yes | The replacement public key as a JWK. It must carry a 'kid'. Whether the request itself has to be signed with the old key is decided at dispatch, and only where the coordinator is configured to requir… |
| old_kid | string | yes | Key id being retired. It is given a valid_until timestamp and stays in the member's key history, so signatures made before the rotation still verify. A key id that is unknown is refused with -32071,… |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.review.depth ~191
Decide how much review a task warrants, skip, spot_check or full, from its routing hints. Records a route_decision artefact giving the rule that produced the answer.
| Name | Type | Req | Description |
|---|---|---|---|
| artefact_routing_hints | object | – | Per-artefact signals such as confidence, model_id and cost_consumed_usd, merged over the task's routing_hints for this call. The default policy reads criticality and confidence. If the merged set is… |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.review.request ~360
Open a review on a task and address it to one or more reviewers. They then call chap.decide.approve, chap.decide.reject, chap.decide.override or chap.abstain.declare. Repeating the request with the same artefact adds reviewers to the open review.
| Name | Type | Req | Description |
|---|---|---|---|
| artefact | – | yes | The draft being submitted for review. Pass a JSON object or array. A JSON-encoded string is parsed back to the structured value before dispatch, so patches in chap.decide.override apply against a rea… |
| deadline | string | – | When the review is needed by, as an ISO 8601 timestamp. Recorded on the review; the coordinator does not act on it. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| rule | string | – | How many of the addressed reviewers must approve before the task completes. quorum:N is accepted for any N of 1 or more. The rule is fixed once the review is open: a later request naming a different… |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| to | – | yes | One or more reviewers, as a single URI string or an array of URI strings. Only a workspace member can go on to decide, so a review addressed elsewhere cannot be closed by its recipient. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.task.complete ~276
Submit a task's output. A task that requires review does not complete: the output is held as the artefact under review, the task moves to review_requested, and a reviewer decision completes it. Any other task completes immediately.
| Name | Type | Req | Description |
|---|---|---|---|
| confidence | string | – | Self-reported confidence in the output, between 0 and 1. Written as a decimal string, e.g. "0.86". CHAP canonicalisation accepts integers only, so a JSON number with a fractional part is refused with… |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| output | – | – | The task's output artefact. Pass a JSON object or array. A JSON-encoded string is parsed back to the structured value before dispatch, so patches in chap.decide.override apply against a real object. |
| routing_hints | object | – | Signals recorded on the task and read by the routing/1.0 methods: task.route, review.depth and escalate.auto. Recording a hint has no effect on its own; it is consulted only when one of those methods… |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.task.create ~398
Create a task: a unit of work assigned to one participant. Set review_required to make the task's completion depend on a reviewer decision rather than on the assignee.
| Name | Type | Req | Description |
|---|---|---|---|
| assignee | string | yes | Who the task is assigned to. Must be a workspace member, and must not be paused: assigning to a paused member is refused with -32063. |
| deadline | string | – | When the task is due, as an ISO 8601 timestamp. Recorded on the task; the coordinator does not act on it. |
| from | string | yes | The delegator. Must be a workspace member. |
| idempotency_key | string | – | Caller-chosen key for safe retries. A second create carrying a key already seen in this workspace returns the original task and records nothing further. The workspace retains the 10,000 most recent k… |
| input | object | yes | Task-specific input payload. |
| kind | string | yes | Task kind, e.g. 'draft_response' or 'review'. Free text; the coordinator records it without interpreting it. |
| mode | string | – | Mode for this task, defaulting to the workspace mode. A mode above the workspace ceiling is refused with -32040. |
| review_required | boolean | – | When true, chap.task.complete opens a review instead of completing: the output becomes the artefact under review, and the task reaches 'completed' only on a reviewer decision. chap.task.update cannot… |
| routing_hints | object | – | Signals recorded on the task and read by the routing/1.0 methods: task.route, review.depth and escalate.auto. Recording a hint has no effect on its own; it is consulted only when one of those methods… |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.task.route ~171
Choose an assignee for a task from a list of candidates and record a route_decision artefact naming the policy, the candidate chosen, and the alternatives it passed over.
| Name | Type | Req | Description |
|---|---|---|---|
| candidates | array | yes | Candidate assignees. An empty list is refused with -32513. Candidates that are not workspace members are dropped, and if none remain the call is refused with -32510. The default policy selects the fi… |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.task.update ~191
Move a task to a new state. Only the transitions in the specification's lifecycle table are accepted, and a task that requires review cannot be completed here.
| Name | Type | Req | Description |
|---|---|---|---|
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| progress_note | string | – | Short note on what changed, kept in the task's history. |
| state | string | yes | The state to move the task to. Only the transitions in SPECIFICATION.md 8.1 are legal from the task's current state; others are refused with -32602. A task marked review_required cannot be moved to '… |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.whisper.answer ~170
Answer an open whisper. Where the question carried options, the answer must name one of them.
| Name | Type | Req | Description |
|---|---|---|---|
| answer | string | – | Free-text answer, for a whisper with no options. |
| answer_option | string | – | The id of the chosen option. Required when the whisper carried options. |
| comment | string | – | Anything else the answerer wants recorded alongside the answer. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| whisper_id | string | yes | Identifier returned by chap.whisper.ask. A whisper that has already been answered is refused with -32020, and one past its deadline with -32021. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.whisper.ask ~278
Put one question to one or more participants, with a deadline and a default. If the deadline passes unanswered the default applies, so a task is never blocked waiting on a reply.
| Name | Type | Req | Description |
|---|---|---|---|
| deadline_ms | integer | yes | How long the whisper stays open, in milliseconds from now. Once it passes, the whisper lapses and default_if_lapsed is applied. |
| default_if_lapsed | – | yes | The value applied if the deadline passes with no answer. Required, so that a lapsed whisper still has a defined outcome. |
| from | string | yes | Participant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'. |
| options | array | – | Multiple-choice options. When present, an answer must name one of these ids in answer_option; any other id is refused with -32022. |
| question | string | yes | The question being put. A whisper is answered on its own, without the recipient opening the task. |
| task_id | string | yes | Task identifier returned by chap.task.create. |
| to | array | yes | Who is being asked. |
| urgency | string | – | How urgent the question is. Recorded and passed on to the client; it does not change the deadline or the lapse behaviour. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.workspace.create ~232
Create a workspace: the container for the participants, tasks and audit log of one piece of collaborative work. Returns the workspace id, which every later call carries.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | Default mode for tasks created here. Under modes/1.0 a trial-mode task has review_required set to true whatever the caller passes. 'shadow' and 'production' are recorded on the task and carry no furt… |
| mode_ceiling | string | – | Highest mode a task in this workspace may request. A task.create above the ceiling is refused with -32040. The ceiling can be changed afterwards with chap.control.set_mode_ceiling. |
| profiles | array | – | Profile identifiers to enable, e.g. ['core/1.0', 'review/1.0']. Recorded on the workspace. Two profiles change behaviour by being present: modes/1.0, under which a trial-mode task requires review, an… |
| workspace | string | – | Workspace id to create. If omitted, one is generated. |
No output schema declared.
No examples provided.
chap.workspace.describe ~52
Report the current state of a workspace: its members, enabled profiles, audit length, and task and override counts.
| Name | Type | Req | Description |
|---|---|---|---|
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
chap.workspace.set_profiles ~108
Replace the set of profiles enabled on a workspace. Enabling audit-scitt/1.0 on a workspace that already has entries leaves those entries outside the hash chain.
| Name | Type | Req | Description |
|---|---|---|---|
| profiles | array | yes | The complete profile set to enable, replacing the current one. Adding audit-scitt/1.0 to a workspace that already has entries leaves those entries unchained and outside chain verification. |
| workspace | string | yes | Workspace identifier, e.g. 'wsp_techcorp_support'. |
No output schema declared.
No examples provided.
What is the CHAP Coordinator MCP server?
CHAP Coordinator is an MCP server listed in the public MCP registry as io.github.BrightbeamAI/chap. Auditable records of human decisions over AI agent work. Approvals, edits, overrides, escalations. This page covers its npm package (@brightbeamai/chap-coordinator-mcp).
Is the CHAP Coordinator MCP server safe to use?
CHAP Coordinator scores 80 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 24 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the CHAP Coordinator MCP server expose?
CHAP Coordinator exposes 39 tools: chap.workspace.create, chap.workspace.describe, chap.workspace.set_profiles, chap.participant.join, chap.participant.leave, and 34 more. Their descriptions and schemas cost roughly 7,597 tokens of context every time the server is loaded.
Is the CHAP Coordinator MCP server still maintained?
CHAP Coordinator is still listed as active in the MCP registry. We last reached this channel on 24 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the CHAP Coordinator MCP server under?
CHAP Coordinator declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.