MONARKFleetNarabiUkemiBellit abstains so DeFi can act.
For integrators
builtserved version 0.4.0

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 scores
  • cascade — This cascade tool is v0
  • gate — 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.

MCP — add the endpoint
hermes mcp add monark --url https://mcp.monarkgate.tech/mcp
openclaw mcp add monark --url https://mcp.monarkgate.tech/mcp --transport streamable-http
Any other MCP client

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.

First · calibrate your scores
you send
{
  "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
}
you get (structuredContent; its label field is quoted below)
{
  "qhat": 1,
  "n": 10,
  "alpha": 0.1,
  "method": "split",
  "set_digest": "4081f7184e42b34e594015191f04720343b8b37691c7e4412c2469efdc43dd3a",
  "reason": null
}
Then · gate your prediction
you send
{
  "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"
    }
  }
}
you get (structuredContent)
{
  "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.

You send
POST /gate · prediction + params · optional attested · closed keys

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.remainingBudget number · required — B_t — remaining authorization capacity (caller-owned).
  • params.bFloor number · required — B_floor threshold (>= 0).
  • params.tau number · required — Set-size threshold for the `set` path (>= 0).
  • params.tauInterval number · required — Width threshold for the `interval` path (>= 0).
  • params.alpha number · required — Target miscoverage in (0,1).
  • params.nMin integer · required — Minimum calibration count (>= 1).
  • params.intent string | number | null · required — The intent tested against the region.
  • params.tool string · required — The NAMED gated tool (echoed, never invoked).
  • params.clockOpen boolean · required — Whether the coverage window is still open (caller-owned).
  • params.calibration object · optional — OPTIONAL BYO calibration: caller-supplied nonconformity scores + region mode. Present ⇒ the gate conformalizes on the caller's model, not a committed class.
a request recorded over the MCP transport of an in-process server on 127.0.0.1
{
  "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"
  }
}
You get back
structuredContent + content

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.

its result, recorded on the same in-process server (structuredContent)
{
  "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.
your own classyour calibrationthe gate conformalizes against THOSE caller-supplied scores (BYO).
Transports
MCP over streamable-http: 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.
Refusals
  • 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.
Bindings
Language-neutral JSON Schema is the source of truth. TypeScript is the first binding, in the repository; no other language binding is committed yet — any language can validate against the same schema files.