Snapshot, not live: the served harness as read 2026-09-25T03:26:05.861Z, when this page’s data was last written. The registry entry below is as of that read; the deploy check carries its own date.
The engine, reachable by your agent.
The harness makes the same gate callable over HTTP and MCP; the tools below are the ones it serves. The contracts are frozen. The endpoint is public and unauthenticated, with no availability commitment. What you send and what you get back will not change without a versioned contract revision.
attest— real, notary Shōgen, demonstrative, not probative · one committed witness over tlsn-mpc/1, observed 2026-08-13T04:10:28.000Z, verifier revision 0fe3c32d3538; named residual hypotheses: A(notary-neutrality), A(self-attestation), A(transport-check-delegated)calibrate— split-conformal quantile at miscoverage α over caller-supplied nonconformity scorescascade— This cascade tool is v0gate— The gate only emits a decision; it never calls the named tool.
Add MONARK to your agent
Compatible with any MCP-capable agent. The endpoint is a standard MCP server over streamable HTTP, so any agent or client that speaks MCP can call the gate as a tool by pointing at the URL. A plain-HTTP mirror serves agents that do not speak MCP.
hermes mcp add monark --url https://mcp.monarkgate.tech/mcp openclaw mcp add monark --url https://mcp.monarkgate.tech/mcp --transport streamable-http
Point it at https://mcp.monarkgate.tech/mcp (streamable-http). The Accept header, as recorded against an in-process server on 127.0.0.1: application/json, text/event-stream (a request missing text/event-stream is answered 406). It is listed in the MCP registry as tech.monarkgate/monark, version 0.4.0, status active, published 2026-09-18. Source is open on GitHub.
See the BYO loop
Two stateless calls, recorded over the MCP transport of an in-process server on 127.0.0.1. You calibrate on your own nonconformity scores, then gate your own prediction under them. The audit closes when the gate’s calib_digest equals the calibrate set_digest — the decision was gated against exactly the scores you calibrated.
{
"scores": [
0.1,
0.2,
0.3,
0.4,
0.5,
0.6,
0.7,
0.8,
0.9,
1
],
"alpha": 0.1,
"nMin": 5
}{
"qhat": 1,
"n": 10,
"alpha": 0.1,
"method": "split",
"set_digest": "4081f7184e42b34e594015191f04720343b8b37691c7e4412c2469efdc43dd3a",
"reason": null
}{
"prediction": {
"schema_version": "1.0.0",
"task_class": "caller-demo-reg",
"yhat": 0,
"predictor_id": "caller:own-model",
"produced_at": "2026-09-04T00:00:00Z"
},
"params": {
"remainingBudget": 0.1,
"bFloor": 0,
"tau": 1,
"tauInterval": 3,
"alpha": 0.1,
"nMin": 5,
"intent": 0,
"tool": "caller_downstream_tool",
"clockOpen": true,
"calibration": {
"scores": [
0.1,
0.2,
0.3,
0.4,
0.5,
0.6,
0.7,
0.8,
0.9,
1
],
"mode": "interval"
}
}
}{
"schema_version": "1.0.0",
"action": "commit",
"allow": true,
"tool": "caller_downstream_tool",
"intent": 0,
"verdict": {
"schema_version": "1.0.0",
"task_class": "caller-demo-reg",
"method": "split",
"alpha": 0.1,
"n_calib": 10,
"region": {
"kind": "interval",
"lo": -1,
"hi": 1
},
"qhat": 1,
"abstain": false,
"reason": "covered",
"residual": [],
"calib_digest": "4081f7184e42b34e594015191f04720343b8b37691c7e4412c2469efdc43dd3a",
"produced_at": "2026-09-04T00:00:00Z"
},
"remaining_budget": 0.1,
"reason": "covered"
}The gate returns commit · covered, and calib_digest 4081f7184e42… equals set_digest 4081f7184e42… — the loop closes. What the calibration means, as served: split-conformal quantile at miscoverage α over caller-supplied nonconformity scores. MONARK does not see, store, or verify the caller's data or model, and does not validate that the supplied numbers are nonconformity scores of any model. Marginal 1−α coverage holds ONLY for future points exchangeable with the supplied scores; non-exchangeable data (e.g. distribution-shifted or time-ordered) voids it. Never a probability of being right. Full walkthrough: DEMO.md on GitHub.
prediction is a frozen Prediction: schema_version · task_class · yhat · predictor_id · produced_at. attested: the attestation is carried by the caller; the verifier is not executed here; BYO classes do not accept `attested`.
params.remainingBudgetnumber · required — B_t — remaining authorization capacity (caller-owned).params.bFloornumber · required — B_floor threshold (>= 0).params.taunumber · required — Set-size threshold for the `set` path (>= 0).params.tauIntervalnumber · required — Width threshold for the `interval` path (>= 0).params.alphanumber · required — Target miscoverage in (0,1).params.nMininteger · required — Minimum calibration count (>= 1).params.intentstring | number | null · required — The intent tested against the region.params.toolstring · required — The NAMED gated tool (echoed, never invoked).params.clockOpenboolean · required — Whether the coverage window is still open (caller-owned).params.calibrationobject · optional — OPTIONAL BYO calibration: caller-supplied nonconformity scores + region mode. Present ⇒ the gate conformalizes on the caller's model, not a committed class.
{
"prediction": {
"schema_version": "1.0.0",
"task_class": "btc-dir-15m",
"yhat": "up",
"predictor_id": "internal:momentum-4c",
"produced_at": "2026-09-04T00:00:00Z"
},
"params": {
"bFloor": 0,
"tau": 1,
"tauInterval": 1,
"alpha": 0.1,
"nMin": 50,
"tool": "perps_order_preview",
"clockOpen": true,
"remainingBudget": 0.1,
"intent": "up"
}
}structuredContent is the frozen GateDecision (schema_version · action · allow · tool · intent · verdict · remaining_budget · reason), its verdict a CoverageVerdict (schema_version · task_class · method · alpha · n_calib · region · qhat · abstain · reason · residual · calib_digest · produced_at); content carries the served honesty text. The reason is one of 13 in the frozen enum. remaining_budget: B_t is caller-carried — the value you send comes back unchanged.
{
"schema_version": "1.0.0",
"action": "commit",
"allow": true,
"tool": "perps_order_preview",
"intent": "up",
"verdict": {
"schema_version": "1.0.0",
"task_class": "btc-dir-15m",
"method": "split",
"alpha": 0.1,
"n_calib": 150,
"region": {
"kind": "set",
"labels": [
"up"
],
"label_schema": "up|down"
},
"qhat": 0,
"abstain": false,
"reason": "covered",
"residual": [],
"calib_digest": "fcebed27fd3f9607bba94898f5ae4ebba548ced519d1d800b49890235358eda6",
"produced_at": "2026-09-04T00:00:00Z"
},
"remaining_budget": 0.1,
"reason": "covered"
}Recorded with the committed fixture class btc-dir-15m: declared synthetic — a plumbing fixture, not a measured predictor. Supply your own calibration (nonconformity scores) to gate your own predictor under your own task class.
The task classes it serves
btc-dir-15msynthetic fixturedeclared synthetic — a plumbing fixture, not a measured predictor.cascade-liquidable-24hno calibration committedno cascade calibration is committed; the gate abstains (under_calib) on this class.stable-run-velocity-24hcommitteda committed stable-run velocity calibration for the USDe synthetic-dollar-whitelisted-redeem population; over calm-window redemption flow; the calibration is measured non-stationary across half-years; no coverage is measured; for any other population, no stable-run velocity calibration is committed for this population; the gate abstains (under_calib).liquidation-eligible-coveragecommitteda conformal upper bound on the liquidable amount for the calibrated class; the lower edge is 0 by construction, not a calibrated bound; abstains (under_calib) outside it; this class requires alpha = 0.01, nMin = 100; calibrated on one recorded episode; no coverage is claimed on any other event; the H-3 exchangeability check is a report, a YES licenses nothing more; the bound holds only if yhat was produced by the frozen close-factor rule on a mono-collateral WETH account at the first crossing, which the gate does not check.https://mcp.monarkgate.tech/mcp. The plain-HTTP mirror: https://api.monarkgate.tech, described by /openapi.json (MONARK harness — HTTP/JSON mirror, OpenAPI 3.1.0) and probed at /health (http-json-mirror). Last deploy check 2026-09-25T03:24:23.912Z: 13/13 controls passed; TLS certificate of api.monarkgate.tech valid to Dec 10 04:57:46 2026 GMT.- A payload carrying an unknown key is refused, not ignored — 400: Input failed the frozen schema, or the tool refused the input (never a silent result).
- A payload carrying a forbidden key throws instead of serializing — there is no confidence field to send, and no score beside the reading.
- A foreign browser origin is refused — 403: Origin present and not a monarkgate.tech origin.
- Served bounds: at most 10000 scores per calibration, 10000 per gate calibration, 10000 candidates in set mode, 64 nodes per cascade.