Skip to main content
GET
Get one eval suite's configuration

Authorizations

Authorization
string
header
required

MCPJam API key (sk_…). Create one at Settings → API keys. Guest sessions cannot use the API, and API keys cannot manage other API keys.

Headers

x-mcpjam-eval-vocabulary
enum<string>

Which vocabulary this request and its response speak. Absent means 1, which is byte-for-byte today's contract: the same request fields, the same refusals, the same response projection. 2 is the canonical vocabulary. Any other value is a 400 with code: "VALIDATION_ERROR".

Today it decides one thing: the spelling of an evaluator's policy role. Vocabulary 1 accepts and returns gating; vocabulary 2 accepts both spellings and returns the canonical required. Sending required without the header is a 400, deliberately — vocabulary 1 is not widened to meet vocabulary 2 half way, because a boundary that accepts a spelling it does not announce is one two implementations can disagree about.

A response that varies by vocabulary sends Vary: x-mcpjam-eval-vocabulary.

Available options:
1,
2

Path Parameters

projectId
string
required

ID of the hosted project that contains the server.

suiteId
string
required

Eval suite ID, as returned by POST /eval-runs.

Response

The suite.

One eval suite's full configuration. Distinct from the EvalSuite summary returned by the list route, which carries run rollups instead of settings.

id
string
required
environment
object
required

LEGACY server bag, kept as rollback data, plus the suite's sandbox-image pin. Unrelated to environmentIds.

hosts
object[]
required
settings
object
required

A suite's grading configuration, as vocabulary 1 spells it. FOUR SEPARATE SETTINGS, and the first two are the ones most often confused: the PASS CRITERION (minimumAccuracy, one percentage over the whole run, OR verdictPolicyDefaults.passThreshold, a fraction each case must meet over its own iterations — policy says which decides this suite), the ITERATION RULE (minimumIterations, a floor that RAISES a case's own count, OR verdictPolicyDefaults.repetitions, a default that REPLACES it), the evaluators (matchOptions, checks, judge), and the QUALITY GATE, which asks whether a run regressed against a baseline rather than whether it met a bar. The four REQUIRED fields are the ones the DTO always emits: minimumAccuracy and matchOptions are nullable rather than absent — null is the suite's real state (no suite-wide threshold in effect, no match options set), not a stand-in for a default — and judge is fully resolved, so it is present even on a suite that configured nothing.

schedule
object
required

Recurring-run schedule. A schedule fires exactly ONE run, so an environment-based suite pins the environment it runs against.

declaredId
string

The suite's declared file identity (suite.id in a suite file). Present on file-owned suites; absent on UI-authored suites, which have no declared id and cannot be claimed by eval run --file.

managedBy
enum<string>

Where this suite's configuration lives. ci means it is owned by a committed suite file or by MCPJam SDK ingest, and the platform REFUSES configuration writes to it — name, settings, environments, schedule, models, skills, execution config and cases — from this API and from the app alike, with 409 CONFLICT and details.reason: "CI_OWNED_SUITE_READ_ONLY".

Running, replaying and comparing are unaffected. To change a CI-owned suite, either edit its file and send that file's suite.id as declaredSuiteId on the write, or duplicate the suite for an editable copy.

declaredId alone is not this answer: a suite created by SDK ingest is CI-owned and has no declared id.

Available options:
ci,
app
name
string | null
description
string | null
projectId
string | null
executionConfig
object | null
environmentIds
string[]

Attached project environments, in attach order.

revisionNumber
integer | null

How many committed edits this suite has had, or null on a deployment that does not record revisions. Send it back as expectedRevisionNumber on a PATCH to make that edit a compare-and-set.

createdAt
number | null

Epoch milliseconds.

updatedAt
number | null