protocol conformance commands, but inside your own Jest or Vitest suites.
Use it when you want MCP protocol regressions to fail CI directly, or when you need JUnit XML and JSON artifacts from code rather than shell scripts.
Protocol conformance is currently HTTP-only. For local stdio-only servers, use
MCP Apps Conformance,
unit tests, or run your server through an
HTTP bridge in CI.
Import
Single run
Suite
MCPConformanceSuiteConfig keeps the existing serverUrl + defaults + runs shape:
| Property | Type | Required | Description |
|---|---|---|---|
name | string | No | Suite label shown in summaries and JUnit XML |
serverUrl | string | Yes | Shared MCP HTTP server URL |
defaults | Partial<Omit<MCPConformanceConfig, "serverUrl">> | No | Shared defaults applied to every run |
runs | Array<Partial<Omit<MCPConformanceConfig, "serverUrl">> & { label?: string }> | Yes | Individual run labels and check selections |
MCPConformanceConfig
| Property | Type | Required | Default | Description |
|---|---|---|---|---|
serverUrl | string | Yes | MCP server URL | |
accessToken | string | No | Bearer access token | |
customHeaders | Record<string, string> | No | Extra HTTP headers | |
checkTimeout | number | No | 15000 | Per-check timeout in ms |
categories | MCPCheckCategory[] | No | all categories | Restrict checks to categories |
checkIds | MCPCheckId[] | No | all checks | Restrict checks to specific ids |
fetchFn | typeof fetch | No | fetch | Custom fetch implementation |
clientName | string | No | SDK default | Custom MCP client name |
Available categories and check ids
Categories:coreprotocoltoolspromptsresourcessecuritytransport
server-initializepinglogging-set-levelcompletion-completecapabilities-consistenttools-listtools-input-schemas-validprompts-listresources-listprotocol-invalid-method-errorlocalhost-host-rebinding-rejectedlocalhost-host-valid-acceptedserver-sse-polling-sessionserver-accepts-multiple-post-streamsserver-sse-streams-functional
Result types
MCPConformanceTest.run() returns an MCPConformanceResult:
| Property | Type | Description |
|---|---|---|
passed | boolean | Whether all selected checks passed |
serverUrl | string | Server under test |
checks | MCPCheckResult[] | Individual check results |
summary | string | Human-readable summary |
durationMs | number | Total duration |
categorySummary | Record<MCPCheckCategory, ...> | Pass/fail/skipped counts by category |
MCPConformanceSuite.run() returns an MCPConformanceSuiteResult:
| Property | Type | Description |
|---|---|---|
name | string | Suite name |
serverUrl | string | Shared server URL |
passed | boolean | true iff every run passed |
results | Array<MCPConformanceResult & { label: string }> | Per-run results |
summary | string | Human-readable suite summary |
durationMs | number | Total suite duration |
CI reporting
All three conformance domains share the same report helpers:toConformanceReport(result)renderConformanceReportJUnitXml(report)renderConformanceReportJson(report)
protocol conformance --format junit-xml and protocol conformance-suite --format junit-xml emit the same XML that the SDK helpers produce for the same result.

