Skip to main content
The MCPJam API is in preview. It works today and we use it ourselves, but it has not been generally announced and the surface may change — including in breaking ways — while we finish the design. Pin your integration to the behaviors documented on this page, build a tolerant reader, and expect to revisit it. Feedback is very welcome on Discord or GitHub.

Create an API key

Go straight to key management in the hosted app. If you’re signed out, you’ll be asked to sign in and then land right back on the API keys page.
The MCPJam API lets you operate the MCP servers saved in your hosted projects — from CI, scripts, or your own agents — without opening the UI. What you can do with it today:
  • Discover your resources — list your projects, their servers, eval suites, and chat sessions, so every ID the other routes need is self-serve
  • Validate a server — connect, initialize, and capture a capability snapshot
  • Run the doctor — the probe → connect → initialize → capabilities workflow
  • Check OAuth requirements — does this server need an OAuth grant?
  • List tools, prompts, and resources — the server’s MCP primitives
  • Call a tool / render a prompt — execute primitives and get the MCP result back verbatim
  • Read a resource by URI
  • Export a full snapshot — tools, resources, and prompts as one JSON document
  • Manage a project’s hosts — list, read, create (from a built-in template like claude/chatgpt/cursor, or from a full host config), rename, and delete the named model + capability profiles you run chats and eval suites against
  • List a project’s chatboxes — name, access mode, attached servers, and share link — and read one chatbox’s settings: model, system prompt, tool-approval policy, and resolved servers
  • Author eval suites — create a runnable suite (name, default model, servers, test cases) synchronously and get a suiteId back; no run is started and no credits are spent
  • Run eval suites asynchronously — create a run from a saved suite, get a 202 + runId immediately, then poll status, per-iteration results (tool calls, token usage, latency), and full traces. Runs appear live in the hosted UI, tagged source: "api"
  • Import OAuth tokens — complete OAuth yourself (e.g. the SDK’s runOAuthLogin) and push the tokens; subsequent calls inject and refresh them server-side
All endpoints operate on servers you have already added to a project in the hosted inspector. Managing API keys remains UI-only — see Not in the API yet.

Base URL

The API is path-versioned. All routes on this page are relative to the base URL above.

Authentication

Every request needs an MCPJam API key in the Authorization header:

Creating a key

  1. Open Settings → API keys in the hosted app (the card at the top of this page takes you there directly).
  2. Click Create API key, name it, and pick the organization it will act in.
  3. Copy the key (sk_…) immediately — it is shown exactly once and never stored by MCPJam in retrievable form.
Keys can be revoked from the same page at any time. Revocation takes effect immediately.

Scope

A key is bound to one MCPJam organization at creation and acts as you, inside that organization. Per-request authorization still applies: a call only succeeds if the key’s owner can access that project and server. A key can never reach projects outside its organization.
Two deliberate restrictions while in preview:
  • API keys cannot manage API keys. Requests to the key-management surface with an sk_… bearer fail with 403 FORBIDDEN. Create and revoke keys in the UI.
  • Guest sessions cannot use the API. Sign in to create keys.

Keep keys secret

Treat an API key like a password:
  • Load it from an environment variable or secret manager — never commit it to source control or ship it in client-side code.
  • Scope keys narrowly: one key per integration, named so you can tell them apart.
  • Rotate by creating a replacement key, switching traffic, then revoking the old one.
  • If a key leaks, revoke it immediately in Settings → API keys.
If you see 401 UNAUTHORIZED with details.reason: "ORPHANED_KEY", the key is no longer bound to an organization and cannot be used — create a new key from Settings.

Conventions

Requests. Operations on servers are POST with a JSON body (most accept an empty {}). Reads — the catalog listings and eval-run polling — are GET and take their options (cursor, limit, filters) as query parameters. Responses. Three envelope shapes, used consistently: Pagination. Collections are cursor-based. Pass the previous response’s nextCursor as cursor in the next request (body field on POST lists, query parameter on GET lists). Cursors are opaque — don’t parse them. Authoring vs running suites. POST /eval-suites creates a runnable suite (the suite plus its test cases) synchronously and responds 201 with the suiteId, WITHOUT running anything — author once, run later. POST /eval-runs is the async counterpart: it validates and creates a run synchronously, then detaches execution and responds 202 with a runId. Poll GET /eval-runs/{runId} until status is completed, failed, or cancelled. IDs. Every identifier the API takes is discoverable through the API itself: GET /projects lists your projects, GET /projects/{projectId}/servers lists each project’s servers, and GET /projects/{projectId}/eval-suites lists its eval suites. Start from GET /me to confirm which account a key acts as.

Errors

Errors always use the canonical body { code, message, details? }. The code is stable and machine-readable; message is human-readable and may change; details is an optional, unstructured bag. New error codes may be added over time; treat unknown codes as non-retryable failures unless the HTTP status says otherwise.

Rate limits

Each key gets 60 requests per minute sustained, with bursts up to 10. Exceeding it returns 429 RATE_LIMITED with a Retry-After header (in seconds):
Honor Retry-After, add jittered exponential backoff, and expect these limits to be tuned during the preview.

Endpoints

Each endpoint is fully documented — request and response schemas, examples, and an interactive playground — under Endpoints in the sidebar. Catalog — discover the IDs everything else takes: Server diagnostics & primitives (/projects/{projectId}/servers/{serverId}/...): Eval runs (/projects/{projectId}/...): Eval result ingestion (/projects/{projectId}/eval-ingest/...) — how @mcpjam/sdk saves results from eval runs executed outside the platform (local dev, CI). The {projectId} segment accepts the literal default for the key org’s Default project. Most users never call these directly — set MCPJAM_API_KEY and the SDK reporter does: Chatboxes (/projects/{projectId}/chatboxes...) — read-only: The same surface is available as an OpenAPI specification for Postman, Swagger UI, or client generation.

Run evals from the API

The shortest useful loop — create a run with one inline test, then poll:
model takes an id from the hosted catalog — provider/name form, e.g. anthropic/claude-haiku-4.5 — and runs on your organization’s credits. Provider-native ids (e.g. claude-sonnet-4-5) are bring-your-own-key: pass the key in modelApiKeys. A model the API can’t execute is rejected at create time with VALIDATION_ERROR; details.hostedModels lists the valid hosted ids for that provider. Reruns are even shorter: { "suiteId": "..." } reruns the suite exactly as configured, connecting the suite’s saved server selection (the 202 response lists the resolved servers). Pass serverIds to override the selection; a suite with no saved selection requires it (VALIDATION_ERROR with details.reason: "NO_SAVED_SERVER_SELECTION" otherwise). Per-organization concurrency is capped (default 2 concurrent runs); exceeding it returns 429 with details.reason: "CONCURRENT_RUN_LIMIT" — wait for an active run to finish. If a server answers 401 OAUTH_REQUIRED, complete the OAuth flow yourself (the SDK’s runOAuthLogin handles interactive, headless, and client-credentials flows) and push the result to POST .../oauth/import-tokens once. Subsequent calls inject the stored token and refresh it server-side.

Not in the API yet

To set expectations while in preview, these are not available over the API today (most exist in the hosted inspector UI):
  • Creating or revoking API keys (UI-only by design — see Authentication)
  • Chat and conformance suites
  • Browser-based OAuth flows initiated by the API (use oauth/import-tokens after completing OAuth yourself)
If one of these blocks you, tell us on Discord — it directly shapes what we stabilize first.

Versioning & stability

  • The API is path-versioned (/api/v1). When it reaches general availability, breaking changes will require a new version path.
  • During the preview, breaking changes to v1 may still happen; we’ll note them in the changelog.
  • Additive changes — new endpoints, new optional request fields, new response fields, new error codes — are considered non-breaking and can ship at any time. Write clients that ignore unknown fields.
  • Error codes are stable identifiers; error messages are not.