Guide
How to test if your MCP server is spec compliant
Last verified: 10 August 2026 · spec 2026-07-28 · ruleset 1.4.2
What it actually does
It is not a linter reading your source. It connects to the URL you give it and speaks the protocol, so what gets graded is the behaviour a real client would meet — including anything your framework, proxy or gateway changes on the way out.
Three things are worth knowing before pointing it at production:
- Every probe is read-only. No tool is called and no resource is read. Requests needing a
tools/callshape use a reserved sentinel name that cannot collide with one of yours. - The URL is admitted before anything is fetched. Private ranges, cloud metadata endpoints and localhost are refused, and the connection is pinned to the address that was validated.
- robots.txt is respected. If your host disallows us, the run stops and says so rather than probing anyway.
1. Paste the URL
Give it the MCP endpoint itself, not the marketing page — the path a client would POST to. If you are not sure which that is, it is the URL in your server.json under remotes[].url.
https://mcp.example.com/mcp
https://example.com/api/mcpA server behind authorization is fine. The validator has no credentials, so it grades the authorization rules — whether you return a 401 with a discoverable metadata document — and skips the ones that need a token.
2. Choose whether the report is public
Reports get a permanent URL. The default is public and indexable, which is what makes the public compliance corpus useful — but it is a real choice, so make it deliberately:
- Public — permalinked and indexable. The default.
- Keep out of search engines — still a shareable URL, carries
noindex, never enters the sitemap. - Only I can see this — the report 404s for everyone else. Needs you to be signed in so the report has an owner; otherwise it falls back to the option above, and the result tells you it did.
3. Read the result
Each finding is one rule, and there are four outcomes:
- pass — the rule is satisfied.
- warn — a SHOULD-level requirement is violated. Worth fixing; it will not break a client.
- fail — a MUST-level requirement is violated. A conformant client can legitimately refuse to work with your server.
- skip — the rule could not be evaluated, usually because the server did not answer the request it depends on.
Every rule links to the exact sentence of the specification it comes from, so a finding you disagree with can be checked against the source rather than against our opinion.
How the grade is calculated
The rubric is published and versioned rather than a judgement call. In order — the first matching line wins:
coverage < 70% -> unrated
3 or more fails -> F
1 or more fails -> D
more than 3 warns -> C
1 or more warns -> B
coverage >= 80% -> A
otherwise -> BTwo adjustments sit on top, and both exist to avoid misleading you:
- Any security-relevant failure caps the grade at D. A server that is otherwise clean but accepts an unrecognised Origin is not a B.
- A failure detected only by inference improves the grade one step. Where the evidence is heuristic rather than certain, we do not hand out a failing grade on it.
Why unrated is the most common result
It means too little could be checked to judge — coverage under 70%. Most rules depend on the server answering a modern request, so a server still expecting a 2025-era handshake leaves the majority of rules skipped rather than failed.
Unrated does not mean nothing was graded. Where a whole rule category was covered past the same 70% floor, that category gets its own letter — a server behind authorization returns 401, which stops the protocol groups but leaves the authorization group fully assessable, so it is graded and labelled as what it is. Those scoped grades are not a grade for the server, and the report says so on every one of them.
The floor is not lowered to produce a server grade, and the reason is an incentive one: a server that answers nothing would collect an easy B for having no failures, while an open server exposing all 79 rules and tripping three of them gets an F. That would grade opacity above compliance.
When we probed 16 real public MCP servers, every one came back unrated, at a median coverage of 2.5%. That is not a quirk of the tool; it is the state of the ecosystem two weeks after a breaking revision. If your server returns unrated, the cause is almost always the same one — a session header the revision removed.
Running the same checks in CI
The command line runs the identical ruleset, so a green build and a green report cannot disagree.
npx createmcps validate https://mcp.example.com/mcp
# exit 0 no failures
# exit 1 failures found — stop the build
# exit 2 unreachable, or too little covered to judge
# exit 3 the validator itself could not runCodes 2 and 3 are deliberately not 1. “Your server is broken”, “we could not reach it” and “our checker fell over” are three different messages, and collapsing them is how a check loses trust the first time a staging box is down. Add --format sarif to get findings as annotations on the pull request that introduced them.
FAQ
Frequently asked
How do I test if my MCP server is spec compliant?
Paste your server's URL into the validator at createmcps.com/validate. It makes real protocol requests against the 2026-07-28 specification and reports each of the 79 rules as pass, warn or fail, with the exact specification sentence behind each one. No account is needed, and the same checks run from the command line with npx createmcps validate for use in CI.
What does an unrated grade mean?
It means too few rules could be checked to award a grade, not that the server failed. A grade requires at least 70% rule coverage. Most rules depend on the server answering a request, so a server that refuses the modern request shape leaves most rules skipped rather than passed or failed — and an honest tool says so instead of grading on a fraction of the evidence. Any individual rule category that was covered past the same 70% floor still gets its own scoped grade, so a server behind authorization sees a real grade for its authorization surface even when the server as a whole is unrated.
Is it safe to point the validator at a production MCP server?
Every probe is read-only. No tool is called, no resource is read, and requests that need a tools/call shape use a reserved sentinel name that cannot collide with a real tool. The URL passes SSRF admission control before anything is fetched, and the connection is pinned to the validated IP address.
Will my validation report be public?
By default yes — reports get a permanent URL and are indexable, which is what builds the public compliance corpus. You can tick a box to keep a report out of search engines while still having a shareable link, or make it visible only to you if you are signed in.
Can I run the MCP compliance check in CI?
Yes. npx createmcps validate <url> runs the same rules and exits 0 when clean, 1 on failures, 2 when the target could not be reached, and 3 when the validator itself could not run. It also emits SARIF with --format sarif, so findings appear as annotations on a GitHub pull request.
Try it on your own server
It takes about ten seconds and needs no account. You get a permalinked report with every rule, its outcome, and the specification sentence behind it.
Validate a server →