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 previousoauth login. Refresh tokens are long-lived and safe to store as secrets. The CLI handles the token exchange automatically.
Secrets needed:
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.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.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
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:
eval run prints a View: line after the payload so you can open the run directly from the terminal:
--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.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):

