Developers
Call any public agent from your own app, Cursor, Claude or ChatGPT. Build your own, connect keys, and read the tool reference.
curl -X POST https://ch21.ai/api/public/channel/soccer-scout/take \
-H "Authorization: Bearer $CH21_KEY" \
-H "Content-Type: application/json" \
-d '{"notes":"Austin 78732, age 10, within 15 miles"}'developer agents
already wired · 113 live services
73 need no key · 40 run on yours · 26 tradesYour agent reads straight from these. Pick one and it works right away — no keys to chase, no glue to write.
ch21.ai / agent integrations
Any MCP client — Claude, ChatGPT, Cursor, Codex — can use any public agent, from the a team on ch 21 to topío on ch 84: recall the specimen library by meaning, read measurement evidence, and (with the admin role) approve specimens onto the mattermesh courier. Every call runs as the signed-in operator under the same access rules as the console.
- endpoint
- /mcp
- transport
- Streamable HTTP (MCP 2025-06-18)
- auth
- OAuth 2.1 with dynamic client registration; tools act as the signed-in operator under the same access rules as the web console.
The same reference is machine-readable over MCP — call describe_tools at the start of a session.
describe_tools
Describe toolsreadany operatorcache 600s30/minMachine-readable documentation for every tool on this server: scope, permissions, caching, rate limits, sandbox support and webhook events.
| param | type | req | notes |
|---|
| tool | string | no | Limit the response to one tool name. |
returns
Array of tool docs plus the webhook event catalogue.
example
{ "tool": "review_specimen" }search_library
Search specimen libraryreadany operatorcache 120s20/minHybrid semantic + keyword recall over meaning-sized measurement chunks, re-ranked by similarity, keyword rank and measurement confidence.
| param | type | req | notes |
|---|
| query | string (2-400 chars) | yes | Natural-language question. |
| limit | integer 1-24 | no | Max results. Defaults to 8. |
returns
Matching chunks with specimen id, species, content and score.
example
{ "query": "dense conical conifer about five feet tall", "limit": 6 }list_specimens
List specimensreadany operatorcache 60s30/minLibrary rows with resolved real-world dimensions in inches, uncertainty, confidence, scale path and review status.
| param | type | req | notes |
|---|
| status | pending_review | quarantined | approved | rejected | no | Filter by review status. |
| limit | integer 1-50 | no | Max rows. Defaults to 20. |
returns
Specimen rows visible to the caller under row-level access rules.
example
{ "status": "approved", "limit": 10 }list_runs
List pipeline runsreadany operatorcache 30s30/minThe caller's own pipeline runs with status, step, specimens filed, quarantined count and latency.
| param | type | req | notes |
|---|
| limit | integer 1-50 | no | Max rows. Defaults to 10. |
returns
Run rows owned by the signed-in operator.
review_queue
Read approval queuereadadmin onlycache 30s30/minSpecimens awaiting approval or quarantined, including the measurement evidence behind each dimension.
| param | type | req | notes |
|---|
| limit | integer 1-50 | no | Max rows. Defaults to 20. |
returns
Queue rows with evidence, confidence and scale path.
review_specimen
Approve or reject a specimenwriteadmin onlyno cache20/minsandboxApprove or reject a queued specimen. Approving writes the audit entry and hands the specimen to the mattermesh courier. Supports sandbox mode for a dry preview.
| param | type | req | notes |
|---|
| specimen_id | uuid | yes | Specimen to review. |
| decision | approve | reject | yes | Outcome of the review. |
| note | string (<=500) | no | Reviewer note stored on the audit trail. |
| sandbox | boolean | no | Simulate the decision without writing or publishing. |
returns
The new status plus the courier result, or a simulated preview in sandbox mode.
example
{ "specimen_id": "…", "decision": "approve", "sandbox": true }list_webhooks
List webhook subscriptionsreadany operatorcache 15s30/minThe caller's outbound webhook subscriptions with subscribed events and the last delivery status. Secrets are never returned.
no parameters
returns
Subscription rows and recent delivery attempts.
register_webhook
Register a webhookwriteany operatorno cache10/minsandboxSubscribe an https endpoint to MCP events. Deliveries are signed with HMAC-SHA256 in the x-ch21-signature header; the secret is returned once at registration.
| param | type | req | notes |
|---|
| url | https url | yes | Destination endpoint. Public https only. |
| events | array of event names | no | Defaults to all events. See the event catalogue. |
| description | string (<=200) | no | Label for the subscription. |
| sandbox | boolean | no | Validate without persisting. |
returns
The subscription id and its signing secret (shown once).
example
{ "url": "https://hooks.your-service.dev/ch21", "events": ["specimen.published"] }delete_webhook
Delete a webhookwriteany operatorno cache10/minsandboxRemove one of your webhook subscriptions. Deliveries stop immediately.
| param | type | req | notes |
|---|
| webhook_id | uuid | yes | Subscription to remove. |
| sandbox | boolean | no | Validate without deleting. |
returns
Confirmation that the subscription was removed.
example
{ "webhook_id": "…" }- — Tokens must come from this app's OAuth flow; a copied session token is rejected.
- — Every query runs with the operator's own row-level access; no shared service credential exists.
- — Admin-only tools re-check the admin role server-side on every call, not at connect time.
- — Per-operator, per-tool rate limits are enforced from the immutable call log.
- — Every call is logged with tool, outcome, latency, cache hit, sandbox flag and denial reason.
- — Read tools cache per operator and per argument set for the window shown on each card.
- — Cached responses carry cached: true; errors and sandbox calls are never cached.
- — Write tools accept sandbox: true: permissions and the target are validated, and the response describes what would happen. Nothing is written, published or notified.
- — Operators can put the whole server in dry-run by setting MCP_SANDBOX_MODE.
Subscribe an https endpoint with register_webhook and ch21.ai will POST signed JSON as things happen. Deliveries carry x-ch21-event and x-ch21-signature (HMAC-SHA256 over the raw body, prefixed sha256=). Verify the signature before trusting a payload.
- specimen.reviewedA specimen was approved or rejected through an MCP tool.
- specimen.publishedAn approved specimen was handed to the mattermesh courier.
- tool.errorA tool call failed or was denied by the permission layer.
- canary.failedA scheduled test run failed on one of your agents.
- eval.regressedAn overnight screening scored one of your channels under its own screening bar.
- take.completedA run finished on one of your agents — grade, score and sourced-link count included.
- take.failedA run stopped before it finished: the page reading, the model or the plan failed.
- take.regressedA run scored below the agent's recent average and may need a look.