git clone https://github.com/studiomeyer-io/mcp-protocol-conformance.git
cd mcp-protocol-conformance
npm install
npm run typecheck
npm test- Add a test for every new behaviour. Tests live in
tests/*.test.ts(specs.test.tsfor the spec tables,integration.test.tsfor suites driven against thetests/fixtures/*.mjsstdio servers,server.test.tsfor the MCP-tool dispatch path). - A new suite must declare its name in the allowlist (
SUITE_NAMESinsrc/types.ts), be dispatched insrc/suites/full.ts, and be documented in the README compatibility matrix. - Spec-version handling: a check that applies only to a newer spec is gated on a
declarative
SpecTablefield (e.g.if (spec.tasks?.supported)orif (spec.structuredToolOutput)), never onif (spec === "..."). Older specs leave the field unset, so they stay byte-for-byte unaffected. - No
any, no shelling out from suite code, no mutation of input arguments. - Run
npm run typecheckandnpm testbefore opening a PR.
Semantic versioning. Adding a new optional check is a minor bump. Renaming an existing failure code or removing a suite is a major bump.
- Add the version string to the
SpecVersionSchemaenum andSUPPORTED_SPEC_VERSIONSinsrc/types.ts. - Create
src/specs/<version>.tsexporting aSpecTable(start from the previous version, add only the deltas as optional fields), and register it insrc/specs/index.ts. - Gate any new check in the relevant suite on the new
SpecTablefield, and threadspecVersionif the suite opens its owninitialize(seesrc/suites/full.ts+helpers.ts). - Add a
tests/fixtures/<name>-server.mjsstdio fixture that advertises the new surface, plus tests intests/specs.test.ts(table) andtests/integration.test.ts(suite behaviour). - Update the
--spechelp text insrc/cli.ts, the README compatibility matrix + spec references, themcp.supportedSpecVersionsarray inpackage.json, and this CHANGELOG.