A framework for testing MCP (Model Context Protocol) client implementations against the specification.
[!WARNING] This repository is a work in progress and is unstable. Join the conversation in the #conformance-testing-wg in the MCP Contributors discord.
npm install
npm run start -- --command "tsx examples/clients/typescript/test1.ts" --scenario initialize
npm run test:server -- --server-url http://localhost:3000/mcp --all
The conformance test framework validates MCP client implementations by:
- Starting a test server for the specified scenario
- Running the client implementation with the test server URL
- Capturing MCP protocol interactions
- Running conformance checks against the specification
- Generating detailed test results
npm run start -- --command "<client-command>" --scenario <scenario-name>
- --command - The command to run your MCP client (can include flags)
- --scenario - The test scenario to run (e.g., "initialize")
The framework appends the server URL as the final argument to your command.
Results are saved to results/<scenario>-<timestamp>/:
- checks.json - Array of conformance check results with pass/fail status
- stdout.txt - Client stdout output
- stderr.txt - Client stderr output
- examples/clients/typescript/test1.ts - Valid MCP client (passes all checks)
- examples/clients/typescript/test-broken.ts - Invalid client missing required fields (fails checks)
- initialize - Tests MCP client initialization handshake
- Validates protocol version
- Validates clientInfo (name and version)
- Validates server response handling
See src/runner/DESIGN.md for detailed architecture documentation.
- Runner (src/runner/) - Orchestrates test execution and result generation
- Scenarios (src/scenarios/) - Test scenarios with custom server implementations
- Checks (src/checks.ts) - Conformance validation functions
- Types (src/types.ts) - Shared type definitions
- Create a new directory in src/scenarios/<scenario-name>/
- Implement the Scenario interface with start(), stop(), and getChecks()
- Register the scenario in src/scenarios/index.ts
See src/scenarios/initialize/ for a reference implementation.
.png)

