Get a run's decision summary
The canonical, versioned run decision contract: the verdict and where it came from, the counts with the population they count, the run’s own verdict decision when it has one, and one page of per-trial diagnostics carrying the user-value chain, the first failed stage, the failure category, evidence scoped to that stage, and one next action.
ADDITIVE and composed: it is the same two reads a caller could make by hand (GET …/eval-runs/{runId} and GET …/iterations), assembled once here so every client shares one reading of a run instead of inventing its own. cursor and limit page the DIAGNOSTICS using the same cursors the iterations endpoint issues, and diagnostics.complete says honestly whether the page you got is the run’s whole non-passing set.
Authorizations
MCPJam API key (sk_…). Create one at Settings → API keys. Guest sessions cannot use the API, and API keys cannot manage other API keys.
Path Parameters
ID of the hosted project that contains the server.
Eval run ID, as returned by POST /eval-runs.
Query Parameters
Iterations examined per page, 1–200. Defaults to 50.
1 <= x <= 200Opaque cursor from a previous response's diagnostics.nextCursor. A page fetched with one is never reported as complete.
Response
The run's decision summary.
The canonical run decision contract (schema version 1): what the run decided, in what unit it counted, and what evidence sits under the non-passing trials. START HERE when a run did not pass.
It EXPLAINS the verdict and never DECIDES it. Under verdict policy v2 the authority is the run's own decision — its verdict, rates, validity phase, reasons, per-case stability and mixed-verdict flags are copied after validation and never recomputed from the trials; counts is a tally of decision.cases[].verdict and nothing more.
verdict has a fourth value the run verdict vocabulary does not: notEstablished means no verdict exists at all (the run is unfinished, stopped early, or its decision could not be read). It is not a failure and not inconclusive — inconclusive is a decision the validity phase reached, and this is the absence of any decision.
1 The run's lifecycle status, verbatim. Not a verdict.
passed, failed, inconclusive, notEstablished policyV2 — the run's own decision, carried on decision; verdict is its verdict. legacy — a percent-threshold run predating policy v2; there is no decision object and any counts are trials. none — no verdict; verdict is notEstablished and undecided says why.
policyV2, legacy, none One page of diagnostics, with its completeness stated rather than implied. complete is true ONLY when items is the whole non-passing set for the run: a page reached through a cursor is never complete however few rows follow it. scannedIterations is how many trials this page examined, which is what separates "we looked at 50 and none failed" from "we did not look" — both otherwise render as an empty items.
A tally WITH the population it counted. measurementUnit is never omitted and never inferred: under verdict policy v2 the counts are case-execution VARIANTS (repetitions are trials inside one, not members of it), and on a legacy run they are trials. A 3-case suite with 5 repetitions is legitimately 3 under one unit and 15 under the other, so a count reported without its unit is not a fact. On a caseVariant count every field is present and the three buckets sum to total; on a trial count each field is present only if the legacy run recorded it — absence stays absence rather than defaulting to zero.
- Option 1
- Option 2
The run's authoritative v2 verdict decision, copied verbatim after validation — the same shape as EvalRun.verdictSummary, published at https://mcpjam.com/schemas/eval-verdict-policy/v2.json. Present exactly when verdictSource is policyV2.
Why no verdict was established. Present exactly when verdictSource is none.

