Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

CHAP Coordinator

NPM · @BRIGHTBEAMAI/CHAP-COORDINATOR-MCP · SCANNED SEP 24

Auditable records of human decisions over AI agent work. Approvals, edits, overrides, escalations.

0 this week 80 Trust /100
Trust breakdown (7 categories)

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
Install

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

# add to Claude Code
claude mcp add brightbeamai-chap -- npx -y @brightbeamai/chap-coordinator-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "brightbeamai-chap": {
      "command": "npx",
      "args": [
        "-y",
        "@brightbeamai/chap-coordinator-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "brightbeamai-chap": {
      "command": "npx",
      "args": [
        "-y",
        "@brightbeamai/chap-coordinator-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add brightbeamai-chap -- npx -y @brightbeamai/chap-coordinator-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "brightbeamai-chap": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@brightbeamai/chap-coordinator-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add brightbeamai-chap --command npx --arg -y --arg @brightbeamai/chap-coordinator-mcp
# ~/.hermes/config.yaml
mcp_servers:
  brightbeamai-chap:
    command: "npx"
    args: ["-y", "@brightbeamai/chap-coordinator-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "brightbeamai-chap": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@brightbeamai/chap-coordinator-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add brightbeamai-chap -t stdio -c npx -a -y @brightbeamai/chap-coordinator-mcp
// mcp.json
{
  "mcpServers": {
    "brightbeamai-chap": {
      "command": "npx",
      "args": [
        "-y",
        "@brightbeamai/chap-coordinator-mcp"
      ]
    }
  }
}
Changelog

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
Diagnostics

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 →

MCP tools · 39 exposed · ~7,597 tokens

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 →

Tool Tokens
chap.abstain.declare ~131

Stand aside from a review, giving a reason and a category. The task moves to abstained.

NameTypeReqDescription
categorystringThe kind of abstention. Recorded in the audit entry.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
reasonstringyesWhy this reviewer is standing aside. Recorded in the audit entry.
task_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
filterobjectNarrows the entries returned. Conditions combine with AND, and are applied within the sequence window rather than before it.
rangeobjectSequence window to return. Omit for the whole log.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
issuerstringIssuer 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…
rangeobjectSequence window to anchor. Omit to submit the whole chain.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
receiptobjectyesThe 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.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
reasonstringWhy the task was cancelled. Recorded in the audit entry.
task_idstringyesThe task to cancel. A task that is completed, declined, cancelled or superseded is refused with -32061.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
in_flight_policystringRecorded 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_uristringWhose work to pause, when scope is 'participant'. Must be a workspace member.
reasonstringWhy the pause was applied. Recorded in the audit entry.
scopestringWhat 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_idstringTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
participant_uristringWhose work to resume, when scope is 'participant'. Must be a workspace member.
scopestringWhat 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_idstringTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
reasonstringWhy the rollback was performed. The rollback is itself an audit entry; earlier entries are not rewritten.
to_snapshot_artefact_idstringyesArtefact id returned by chap.control.snapshot. An id with no matching snapshot is refused with -32062.
what_to_restorearrayWhich 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…
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
new_ceilingstringyesThe 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…
reasonstringWhy the ceiling is being changed. Recorded in the audit entry.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
includearrayWhich 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.
labelstringName for this snapshot, recorded on the artefact. chap.control.rollback identifies a snapshot by its artefact id, not by label.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
reasonstringWhy the original is being replaced. Recorded in the audit entry.
successor_taskobjectyesThe replacement task.
task_idstringyesThe task being replaced. It moves to 'superseded' and is linked to the successor rather than deleted.
workspacestringyesWorkspace 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.

NameTypeReqDescription
approved_artefact_digeststringOptional. 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…
commentstringThe reviewer's note on this decision. Recorded in the audit entry for the decision.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
tagsarrayWorkspace-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_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
approved_artefact_digeststringOptional. 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…
diffarrayyesRFC 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.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
intent_preservedbooleanTrue when the edit refines the decision the draft was making, false when it substitutes a different one. Recorded in the audit entry.
logical_idstringCaller-chosen identifier for the item being decided, stable across revisions and overrides of the same underlying content. Recorded in the audit entry.
policy_refsarrayIdentifiers of the policies or guidelines this correction applies, e.g. ['policy:no-delivery-promises']. Recorded in the audit entry.
rationalestringyesWhy the correction was made. Required on every override and recorded in the audit entry, since the diff shows what changed but not why.
tagsarrayWorkspace-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_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
approved_artefact_digeststringOptional. 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…
commentstringThe reviewer's note on this decision. Recorded in the audit entry for the decision.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
request_revisionbooleanWhen true the task returns to 'in_progress' rather than 'declined', so the assignee can revise and resubmit.
tagsarrayWorkspace-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_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
deliberation_idstringyesIdentifier returned by chap.deliberate.open. Closing computes the outcome from the votes cast; closing an already closed deliberation returns the outcome unchanged.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
workspacestringyesWorkspace 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.

NameTypeReqDescription
commentstringyesThe contribution to record. Comments are kept with the deliberation and in the audit log, so the reasoning survives the vote.
deliberation_idstringyesIdentifier returned by chap.deliberate.open. A closed deliberation is refused with -32032.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
workspacestringyesWorkspace 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.

NameTypeReqDescription
deadlinestringWhen 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.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
questionstringWhat the group is deciding. State it so that a yea or a nay is unambiguous.
rulestringyesHow 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_idstringTask identifier returned by chap.task.create.
toarrayyesThe participants entitled to vote. A vote from anyone else is refused with -32030.
vetoobjectVoter to can-veto map. A veto is honoured only under weighted_vote_with_veto, and only from a voter listed true here.
weightsobjectVoter 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.
workspacestringyesWorkspace 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.

NameTypeReqDescription
commentstringWhy the vote went this way. Recorded with it.
deliberation_idstringyesIdentifier returned by chap.deliberate.open. A closed deliberation is refused with -32032, and a second vote from the same voter with -32031.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
veto_invokedbooleanBlocks 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.
votestringyesThis 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.
weightintegerRecorded with the vote. The tally uses the weights map given at chap.deliberate.open, not this value.
workspacestringyesWorkspace 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.

NameTypeReqDescription
default_escalation_targetstringWho 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…
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
task_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
new_taskobjectyesThe successor task to open for the escalation target.
original_task_idstringyesThe task being escalated. It moves to 'escalated' and is linked to the successor. A completed, cancelled or superseded task cannot be escalated.
workspacestringyesWorkspace 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.

NameTypeReqDescription
accepted_task_idsarrayWhich of the proposed tasks are being accepted. If omitted, all of them are.
commentstringAnything the recipient wants recorded when taking the work on.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
handoff_idstringyesIdentifier returned by chap.handoff.propose. A handoff already accepted or declined is refused with -32051.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
handoff_idstringyesIdentifier returned by chap.handoff.propose. A handoff already accepted or declined is refused with -32051.
reasonstringWhy the handover is refused. Recorded so the proposer can route it elsewhere.
suggested_targetstringWho should take it instead, if the decliner knows.
workspacestringyesWorkspace 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.

NameTypeReqDescription
context_linksarrayURLs to threads, tickets or documents the recipient will need.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
summarystringCovering note for the handover as a whole, above the per-task detail.
tasksarrayyesThe work being handed over, one entry per task. Every task must currently be assigned to the proposer; otherwise the proposal is refused with -32050.
tostringyesRecipient, 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.
workspacestringyesWorkspace 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.

NameTypeReqDescription
display_namestringHuman-readable name for interfaces. Not used in authorisation.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
rolestringOperator-defined role, e.g. 'reviewer' or 'drafter'. One value is read by the coordinator: 'admin' permits revoking another member's key.
typestringyesThe 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…
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
kidstringyesKey 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.
reasonstringWhy the key was revoked, e.g. 'laptop lost'. Recorded on the key and in the audit entry.
target_uristringyesWhose key is being revoked. Revoking another member's key requires the caller to hold the role 'admin'; otherwise the call is refused with -32011.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
new_jwkobjectyesThe 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_kidstringyesKey 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,…
workspacestringyesWorkspace 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.

NameTypeReqDescription
artefact_routing_hintsobjectPer-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…
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
task_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
artefactyesThe 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…
deadlinestringWhen the review is needed by, as an ISO 8601 timestamp. Recorded on the review; the coordinator does not act on it.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
rulestringHow 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_idstringyesTask identifier returned by chap.task.create.
toyesOne 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.
workspacestringyesWorkspace 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.

NameTypeReqDescription
confidencestringSelf-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…
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
outputThe 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_hintsobjectSignals 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_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
assigneestringyesWho the task is assigned to. Must be a workspace member, and must not be paused: assigning to a paused member is refused with -32063.
deadlinestringWhen the task is due, as an ISO 8601 timestamp. Recorded on the task; the coordinator does not act on it.
fromstringyesThe delegator. Must be a workspace member.
idempotency_keystringCaller-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…
inputobjectyesTask-specific input payload.
kindstringyesTask kind, e.g. 'draft_response' or 'review'. Free text; the coordinator records it without interpreting it.
modestringMode for this task, defaulting to the workspace mode. A mode above the workspace ceiling is refused with -32040.
review_requiredbooleanWhen 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_hintsobjectSignals 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…
workspacestringyesWorkspace 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.

NameTypeReqDescription
candidatesarrayyesCandidate 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…
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
task_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
progress_notestringShort note on what changed, kept in the task's history.
statestringyesThe 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_idstringyesTask identifier returned by chap.task.create.
workspacestringyesWorkspace 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.

NameTypeReqDescription
answerstringFree-text answer, for a whisper with no options.
answer_optionstringThe id of the chosen option. Required when the whisper carried options.
commentstringAnything else the answerer wants recorded alongside the answer.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
whisper_idstringyesIdentifier returned by chap.whisper.ask. A whisper that has already been answered is refused with -32020, and one past its deadline with -32021.
workspacestringyesWorkspace 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.

NameTypeReqDescription
deadline_msintegeryesHow long the whisper stays open, in milliseconds from now. Once it passes, the whisper lapses and default_if_lapsed is applied.
default_if_lapsedyesThe value applied if the deadline passes with no answer. Required, so that a lapsed whisper still has a defined outcome.
fromstringyesParticipant URI, e.g. 'human:alice@example.org' or 'agent:bot@local'.
optionsarrayMultiple-choice options. When present, an answer must name one of these ids in answer_option; any other id is refused with -32022.
questionstringyesThe question being put. A whisper is answered on its own, without the recipient opening the task.
task_idstringyesTask identifier returned by chap.task.create.
toarrayyesWho is being asked.
urgencystringHow urgent the question is. Recorded and passed on to the client; it does not change the deadline or the lapse behaviour.
workspacestringyesWorkspace 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.

NameTypeReqDescription
modestringDefault 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_ceilingstringHighest 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.
profilesarrayProfile 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…
workspacestringWorkspace 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.

NameTypeReqDescription
workspacestringyesWorkspace 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.

NameTypeReqDescription
profilesarrayyesThe 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.
workspacestringyesWorkspace identifier, e.g. 'wsp_techcorp_support'.

No output schema declared.

No examples provided.

Common questions

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.