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 trades

Your agent reads straight from these. Pick one and it works right away — no keys to chase, no glue to write.

ch21.ai / agent integrations

Tools for AI assistants (MCP)

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.

tools

The same reference is machine-readable over MCP — call describe_tools at the start of a session.

describe_tools

Describe toolsreadany operatorcache 600s30/min

Machine-readable documentation for every tool on this server: scope, permissions, caching, rate limits, sandbox support and webhook events.

paramtypereqnotes
toolstringnoLimit 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/min

Hybrid semantic + keyword recall over meaning-sized measurement chunks, re-ranked by similarity, keyword rank and measurement confidence.

paramtypereqnotes
querystring (2-400 chars)yesNatural-language question.
limitinteger 1-24noMax 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/min

Library rows with resolved real-world dimensions in inches, uncertainty, confidence, scale path and review status.

paramtypereqnotes
statuspending_review | quarantined | approved | rejectednoFilter by review status.
limitinteger 1-50noMax 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/min

The caller's own pipeline runs with status, step, specimens filed, quarantined count and latency.

paramtypereqnotes
limitinteger 1-50noMax rows. Defaults to 10.

returns

Run rows owned by the signed-in operator.

example

{ "limit": 5 }

review_queue

Read approval queuereadadmin onlycache 30s30/min

Specimens awaiting approval or quarantined, including the measurement evidence behind each dimension.

paramtypereqnotes
limitinteger 1-50noMax rows. Defaults to 20.

returns

Queue rows with evidence, confidence and scale path.

example

{}

review_specimen

Approve or reject a specimenwriteadmin onlyno cache20/minsandbox

Approve 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.

paramtypereqnotes
specimen_iduuidyesSpecimen to review.
decisionapprove | rejectyesOutcome of the review.
notestring (<=500)noReviewer note stored on the audit trail.
sandboxbooleannoSimulate 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/min

The 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.

example

{}

register_webhook

Register a webhookwriteany operatorno cache10/minsandbox

Subscribe 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.

paramtypereqnotes
urlhttps urlyesDestination endpoint. Public https only.
eventsarray of event namesnoDefaults to all events. See the event catalogue.
descriptionstring (<=200)noLabel for the subscription.
sandboxbooleannoValidate 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/minsandbox

Remove one of your webhook subscriptions. Deliveries stop immediately.

paramtypereqnotes
webhook_iduuidyesSubscription to remove.
sandboxbooleannoValidate without deleting.

returns

Confirmation that the subscription was removed.

example

{ "webhook_id": "…" }

permissions

  • — 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.

caching & sandbox

  • — 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.

outbound webhooks

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.