Skip to main content
PATCH
Update an eval suite's settings

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.

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.

Query Parameters

declaredSuiteId
string

The suite file's own suite.id, when this request is that file syncing itself. A CI-owned suite (see EvalSuiteDetail.managedBy) refuses configuration writes with 409 and details.reason: "CI_OWNED_SUITE_READ_ONLY"; naming the suite's own declared id is how the file writing itself is allowed through. Naming any other id refuses exactly as loudly as naming none, so it is not a capability — omit it for an ordinary edit.

A QUERY PARAMETER on every route that takes it, never a body field. These request bodies are strict, here and on every Inspector that predates the CI-owned lock, so a body field is a 400 against an older deployment — which would break mcpjam cloud eval run --file for anyone whose CLI is newer than their Inspector. A query parameter is read by the deployments that know it and ignored by those that do not, which is the right degradation: an Inspector with no lock has no exception to make.

Maximum string length: 128

Body

application/json

Partial update of a suite's settings. Omitted fields are left as they are.

declaredSuiteId
string

The suite file's own suite.id, when THIS request is a suite-file sync.

A CI-owned suite (see EvalSuiteDetail.managedBy) refuses configuration writes with 409 and details.reason: "CI_OWNED_SUITE_READ_ONLY". Naming the suite's own declared id is how the file writing itself is allowed through — the platform permits the write only when the id matches, so naming any other id refuses exactly as loudly as naming none. Omit it for ordinary edits.

PREFER THE declaredSuiteId QUERY PARAMETER on this route. This body field still works here, but these request bodies are strict on every Inspector that predates the CI-owned lock, so a body field is a 400 against an older deployment while an unknown query parameter is simply ignored. The MCPJam SDK and CLI send the query parameter.

Maximum string length: 128
name
string
Minimum string length: 1
description
string
environment
object

LEGACY server bag. Unrelated to environmentIds.

environmentIds
string[] | null

Tri-state: a non-empty array sets/replaces the attachments, null CLEARS them (reverting the suite to legacy config), and [] is REJECTED rather than silently read as a clear.

Minimum array length: 1
Minimum string length: 1
executionConfig
object
hosts
object[]
settings
object
expectedRevisionNumber
integer

The suite's revisionNumber as you last read it. Supplying it makes this edit a compare-and-set: a suite changed since then is refused with 409 having written nothing. Omit for last-write-wins.

Required range: x >= 0

Response

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