Skip to main content
Run mcpjam in CI to catch MCP server regressions on every push. The examples below cover GitHub Actions and GitLab CI, but the same commands work in any CI environment.

GitHub Actions

Authentication

There are three ways to authenticate in CI, depending on your server setup.

Option 1: Headless OAuth login

Best when your server supports OAuth with auto-consent (no interactive login page). The workflow obtains a fresh access token on every run. Secrets needed:

Option 2: Refresh token

Best when you already have a refresh token from a previous oauth login. Refresh tokens are long-lived and safe to store as secrets. The CLI handles the token exchange automatically. Secrets needed:
To get a refresh token, run mcpjam oauth login locally with --format json and grab .credentials.refreshToken from the output.

Option 3: Static API key

Best when your server uses a non-expiring API key instead of OAuth. Secrets needed:

Option 4: No auth

Some servers don’t require authentication at all. Secrets needed:

Tool surface diffing

Snapshot your tool surface before and after a deploy to catch breaking changes (renamed parameters, changed descriptions, removed tools).

OAuth conformance suite

Run the full registration x protocol version x auth mode matrix from a config file and output JUnit XML for test reporters.
See OAuth Conformance for details on the config file format.

Protocol conformance suite

Run a repeatable matrix of protocol check selections from a config file and publish JUnit XML.

MCP Apps conformance suite

Run the server-side MCP Apps surface checks from a config file and publish JUnit XML for CI dashboards.
Single-run protocol conformance, oauth conformance, and apps conformance also accept --reporter junit-xml when you only need one target/check selection instead of a suite config file.

GitLab CI

The same CLI commands work in GitLab CI. The examples below use GitLab CI/CD variables for secrets and .gitlab-ci.yml syntax.

Authentication

Headless OAuth login

Refresh token

Static API key

Tool surface diffing

Snapshot your tool surface before and after a deploy to catch breaking changes.

OAuth conformance suite

See OAuth Conformance for details on the config file format.

Evals in CI

There are two ways to wire MCPJam evals into a pipeline: trigger a hosted eval run with the CLI, or run evals locally with the SDK and upload the results. Both authenticate with an MCPJam API key (sk_…) from Settings → API keys.

Trigger a hosted eval suite

mcpjam eval run starts an asynchronous run of a suite that lives in your MCPJam project. It prints a runId and returns immediately — the iterations execute on the MCPJam platform, not in your CI job. Check on the run with mcpjam eval status. Secrets needed:
In human format, eval run prints a View: line after the payload so you can open the run directly from the terminal:
This line is only emitted in human format — --format json output is unchanged, so scripts that parse the JSON stream are unaffected. Poll eval status until run.status is terminal (completed, failed, or cancelled), then gate the job on run.result:
The eval verdict does not control the exit code — eval run and eval status exit non-zero on API, transport, and usage errors instead. The pass/fail verdict lives in the JSON payload (run.result), so the final assertion above is what fails the job. eval status also prints a View: line in human format, identical to the one eval run prints.
Hosted runs execute LLM iterations on the platform and consume your organization’s credits or configured provider keys. See the eval command reference for the rest of the surface (eval cancel, eval iterations, eval trace, eval cases, and more).

Upload SDK eval results

If you instead run evals inside your own CI job with @mcpjam/sdk (EvalTest / EvalSuite), set MCPJAM_API_KEY and results upload automatically to the CI Evals dashboard (pass-rate trends, per-model breakdowns, and a full trace per iteration):
See Save Results to MCPJam for auto-save, the manual reporting APIs, CI metadata (branch, commit SHA, run URL), and artifact upload (JUnit XML, Jest/Vitest JSON).