createmcps.com

MCP compliance rules

79 rules against the 2026-07-28 specification. Each links to the exact spec sentence it comes from — see the migration guide for the full picture of what changed.

DSCDiscovery and capabilities

Discovery and capabilities5 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-DSC-001server/discover is implementedMUSTfailyes
MCP-DSC-002DiscoverResult advertises supported protocol versionsMUSTfailyes
MCP-DSC-003Advertised versions include a currently-supported revisionMAYinfono — best practice
MCP-DSC-004Extension identifiers use a valid non-reserved reverse-DNS prefixMUSTfailyes
MCP-DSC-005Results carry io.modelcontextprotocol/serverInfo in _metaSHOULDwarnyes

HDRRequest metadata headers

Request metadata headers10 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-HDR-001Missing Mcp-Method rejected with 400 + HeaderMismatchMUSTfailyes
MCP-HDR-002Missing Mcp-Name on tools/call rejected with 400 + HeaderMismatchMUSTfailyes
MCP-HDR-003Mcp-Name header must match the request bodyMUSTfailyes
MCP-HDR-004Missing MCP-Protocol-Version rejected (modern-only servers)MUSTfailyes
MCP-HDR-005MCP-Protocol-Version header must match _meta.protocolVersionMUSTfailyes
MCP-HDR-006Header names compared case-insensitivelyMUSTfailyes
MCP-HDR-007Base64 sentinel-encoded header values decoded before comparisonMUSTfailyes
MCP-HDR-008Mcp-Param-{Name} validated against body when x-mcp-header is declaredMUSTfailyes
MCP-HDR-009Mcp-Param-{Name} containing invalid characters is rejectedMUSTfailyes
MCP-HDR-010Header validation runs before method dispatchMAYwarnno — best practice

STLStatelessness and session removal

Statelessness and session removal8 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-STL-001Server never mints or echoes Mcp-Session-IdMUST_NOTfailyes
MCP-STL-002A client-supplied Mcp-Session-Id is ignored, not requiredMUST_NOTfailyes
MCP-STL-003A cold modern request succeeds with no prior handshakeMUSTfailyes
MCP-STL-004Server does not rely on prior requests over the same connectionMUST_NOTfailyes
MCP-STL-005GET on the MCP endpoint returns 405SHOULDwarnyes
MCP-STL-006DELETE on the MCP endpoint returns 405SHOULDwarnyes
MCP-STL-007Last-Event-ID is ignored — streams are not resumableSHOULDwarnyes
MCP-STL-008tools/list does not vary per connectionMUSTfailyes

RESResult and message shape

Result and message shape7 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-RES-001Every result includes resultTypeMUSTfailyes
MCP-RES-002resultType is a value defined by core or an advertised extensionMUSTfailyes
MCP-RES-003Server sends no independent JSON-RPC requests on a response streamMUST_NOTfailyes
MCP-RES-004Accepted notification POST returns 202 with no bodyMUSTfailyes
MCP-RES-005Response is application/json or text/event-stream; SSE terminates with the final responseMUSTfailyes
MCP-RES-006SSE responses set X-Accel-Buffering: noSHOULDwarnyes
MCP-RES-007tools/list returns a deterministic orderSHOULDwarnyes

ERRError codes

Error codes8 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-ERR-001Unsupported version returns -32022 with data.supported[]MUSTfailyes
MCP-ERR-002Unknown method returns HTTP 404 and JSON-RPC -32601MUSTfailyes
MCP-ERR-003Resource-not-found uses -32602, not the retired -32002MUST_NOTfailyes
MCP-ERR-004The retired -32042 code is never emittedMUST_NOTfailyes
MCP-ERR-005No undefined code is emitted in the reserved -32020…-32099 rangeMUST_NOTfailyes
MCP-ERR-006Missing required _meta field returns HTTP 400 + JSON-RPC -32602MUSTfailyes
MCP-ERR-007Missing client capability returns -32021 with data.requiredCapabilitiesMUSTfailyes
MCP-ERR-008New implementation-defined codes avoid the legacy -32000…-32019 rangeSHOULD_NOTwarnyes

CACCaching metadata

Caching metadata5 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-CAC-001ttlMs present on all five cacheable resultsMUSTfailyes
MCP-CAC-002cacheScope present on all five cacheable resultsMUSTfailyes
MCP-CAC-003cacheScope is exactly "public" or "private"MUSTfailyes
MCP-CAC-004ttlMs is a non-negative numberMUSTfailyes
MCP-CAC-005Authenticated or personalised results are not marked cacheScope: publicMAYwarnyes

SCHTool/prompt schema and x-mcp-header

Tool/prompt schema and x-mcp-header7 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-SCH-001x-mcp-header is non-empty and matches RFC 9110 token syntaxMUSTfailyes
MCP-SCH-002x-mcp-header contains no control characters, CR, or LFMUST_NOTfailyes
MCP-SCH-003x-mcp-header values are case-insensitively unique per inputSchemaMUSTfailyes
MCP-SCH-004x-mcp-header only on string/integer/boolean — never numberMUSTfailyes
MCP-SCH-005x-mcp-header property is statically reachable via properties onlyMUST_NOTfailyes
MCP-SCH-006inputSchema/outputSchema validate against the declared or default 2020-12 dialectMUSTfailyes
MCP-SCH-007Tool, prompt, and resource names are header-safe ASCIISHOULDwarnyes

AUTAuthorization

Authorization11 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-AUT-001Unauthenticated request returns 401 with WWW-Authenticate resource_metadataMUSTfailyes
MCP-AUT-002RFC 9728 Protected Resource Metadata is served and validMUSTfailyes
MCP-AUT-003PRM resource equals the canonical server URIMUSTfailyes
MCP-AUT-004Each listed authorization server exposes RFC 8414 or OIDC discovery metadataMUSTfailyes
MCP-AUT-005AS advertises authorization_response_iss_parameter_supported: trueSHOULDwarnyes
MCP-AUT-006WWW-Authenticate includes a scope parameterSHOULDwarnyes
MCP-AUT-007Insufficient scope returns 403 with error="insufficient_scope"SHOULDwarnyes
MCP-AUT-008Tokens with a foreign audience are rejectedMUSTfailyes
MCP-AUT-009offline_access absent from scopes_supported / challenge scopeSHOULD_NOTinfoyes
MCP-AUT-010AS advertises S256 in code_challenge_methods_supportedMUSTfailyes
MCP-AUT-011AS supports Client ID Metadata Documents, not DCR aloneSHOULDwarnyes

SECSecurity posture

Security posture7 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-SEC-001Invalid Origin header returns HTTP 403MUSTfailyes
MCP-SEC-002Endpoint is HTTPS with a valid, unexpired certificate chainMAYfailyes
MCP-SEC-003Error messages do not echo request headers or credentialsMAYwarnno — best practice
MCP-SEC-004icons[].src is https: or data:, same-origin, no unsafe schemeMUSTfailyes
MCP-SEC-005No $ref in tool schemas resolves to a network URIMUST_NOTfailyes
MCP-SEC-006Schema depth and subschema count stay within safe boundsSHOULDwarnyes
MCP-SEC-007Server does not reflect the Authorization header into responsesMAYfailno — best practice

DEPDeprecated and removed features

Deprecated and removed features7 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-DEP-001ping is no longer implementedMAYwarnyes
MCP-DEP-002logging/setLevel is no longer implementedMAYwarnyes
MCP-DEP-003resources/subscribe and resources/unsubscribe replaced by subscriptions/listenMAYwarnyes
MCP-DEP-004No legacy HTTP+SSE endpoint is servedSHOULD_NOTwarnyes
MCP-DEP-005Roots / Sampling / Logging capabilities are not advertisedMAYinfoyes
MCP-DEP-006Server accepts initialize (dual-era support)MAYinfoyes
MCP-DEP-007A modern-only server names its supported versions in the initialize errorSHOULDwarnyes

REGRegistry readiness

Registry readiness4 rules, with requirement level, severity and whether each is traced to a spec sentence
RuleWhat we checkLevelIf it failsSpec-traced
MCP-REG-001server.json present and valid against the registry schemaMAYwarnyes
MCP-REG-002Namespace ownership is verifiable (GitHub or DNS TXT)MAYwarnyes
MCP-REG-003version is present and valid semverMAYwarnyes
MCP-REG-004Declared remote endpoint matches the probed URLMAYwarnyes