Checks a live MCP server's handshake and OAuth compliance
3 of 3 free audits left today
See what MCP Server finds on your site. No sign-up needed.
Users most often give a project's main domain rather than the exact MCP endpoint path, so the auditor builds a list of candidate endpoints before probing:
Discover endpoints โ uses /.well-known/ai-catalog.json as a link source for Server Card remotes, then /.well-known/mcp/server-card.json and /mcp/server-card. Reads the official remotes[].url array when present, and falls back to a top-level url field for real-world cards that predate or diverge from that schema (e.g. Resend's). Always adds the given URL itself and {origin}/mcp as fallbacks, so an exact endpoint URL (e.g. .../v2/mcp) still works even when no card is published. When the endpointUrl preference is set (see Preferences), it is probed first, ahead of every discovered candidate, which stay as a fallback.
Negotiate โ for each candidate in turn, POST server/discover at the newest known protocol date (2026-07-28), with the MCP-Protocol-Version/Mcp-Method headers and _meta fields the live spec requires. On a 400 UnsupportedProtocolVersionError, retries once with the newest mutually-known date from the server's advertised supported list โ this is the actual protocol-version negotiation the server runs, not an assumption.
Legacy fallback โ if server/discover is not implemented (HTTP 404/405, an unrecognized 400 body, or a -32601 Method not found error), falls back to a legacy initialize handshake at protocolVersion 2025-11-25. Accepts application/json or a single text/event-stream event.
OAuth challenge โ a 401 response from any candidate stops the search and short-circuits into OAuth compliance evaluation instead of the handshake path: does WWW-Authenticate carry a compliant Bearer resource_metadata challenge (RFC 9728 ยง5.1), does that Protected Resource Metadata document validate, does its authorization server publish valid metadata (RFC 8414, falling back to OIDC discovery) over HTTPS, and does that metadata advertise Dynamic Client Registration (registration_endpoint, RFC 7591) and PKCE S256 so clients can actually connect. A candidate that fails outright (no response, non-2xx/non-401 status) is skipped in favor of the next candidate; when none produced a handshake or a 401, a candidate that answered 403/407 is reported as a blocked gateway (403), and the two /.well-known/oauth-* documents are probed directly at the origin so one blocked independently of the endpoint is still caught (330).
Dispatch โ a successful discover result is audited by the 2026-07-28 class. An initialize result is audited by the class for the negotiated protocolVersion. Unknown dates fail 402 and skip definition rules.
Aggregate โ ERROR (500) wins, then auditor FAILs (400/401/402/403 on the handshake path, 427โ430 on the OAuth path), then that version's FAILs, then WARNINGs (including the OAuth 330/331/332). If every rule passes, the audit is SUCCESS (200) โ either a working handshake or a spec-compliant OAuth challenge.
Specification pins โ every run emits 37A-McpServerAuditor-100 through 104 (one per MCP protocol date) and 105 (MCP Authorization). Those checks do not change overall status.
All preferences are optional; the auditor resolves the endpoint automatically when none is set.
| Preference | Type | Default | Meaning |
|---|---|---|---|
endpointUrl | string | โ | The exact MCP endpoint URL to probe, for when the monitored URL is not itself the endpoint and automatic discovery (Server Card, AI catalog, {origin}/mcp) does not find it. An absolute http(s) URL (https://example.com/api/mcp) is used as-is; a path (/api/mcp, mcp) is resolved against the monitored URL. Probed first, ahead of the discovered candidates, which stay as a fallback. A blank or non-http(s) value is ignored and discovery runs unchanged. |
Every row maps to one checkRule* method and one CheckCode. Definition rules (410โ426, 310โ321) run only for the negotiated protocol date, on the handshake path. OAuth rules (427โ430, plus the 331/332 warnings) run on the 401 challenge path. 403 (blocked gateway) and 330 (blocked origin discovery document) run on the no-handshake/no-401 path. Pins 100โ105 are emitted on every run, including fetch errors. Skip 301 when no Server Card was found. CheckCode suffixes use status ranges: 100โ199 information, 200 success, 300โ399 warning, 400โ499 fail, 500โ599 error.
| CheckCode | Status | When it fires | Recommendation | Why it matters |
|---|---|---|---|---|
37A-McpServerAuditor-100 | INFORMATION | Every run. Records that this auditor implements MCP Protocol 2024-11-05. | โ | โ |
37A-McpServerAuditor-101 | INFORMATION | Every run. Records that this auditor implements MCP Protocol 2025-03-26. | โ | โ |
37A-McpServerAuditor-102 | INFORMATION | Every run. Records that this auditor implements MCP Protocol 2025-06-18. | โ | โ |
37A-McpServerAuditor-103 | INFORMATION | Every run. Records that this auditor implements MCP Protocol 2025-11-25. | โ | โ |
37A-McpServerAuditor-104 | INFORMATION | Every run. Records that this auditor implements MCP Protocol 2026-07-28. | โ | โ |
37A-McpServerAuditor-105 | INFORMATION | Every run. Records that this auditor implements MCP Authorization (RFC 9728, RFC 8414). | โ | โ |
37A-McpServerAuditor-400 | FAIL | No candidate endpoint (Server Card/catalog remotes, the given URL, {origin}/mcp) ever returned a usable JSON-RPC 2.0 result or even an HTTP 2xx status. | Expose an MCP endpoint at one of {attemptedEndpoints}, or list remotes[].url on a Server Card at {origin}/.well-known/mcp/server-card.json; last response was {observed}. | If no endpoint answers the MCP handshake, AI assistants have nothing to connect to, so the server is invisible to every tool that would use it. |
37A-McpServerAuditor-401 | FAIL | A candidate answered HTTP 2xx but the body is not a JSON-RPC 2.0 response with a result. | Return a JSON-RPC 2.0 object with jsonrpc="2.0" and a result from {endpoint}; last response was {observedSnippet}. | MCP runs over JSON-RPC 2.0; a response that is not a valid JSON-RPC result cannot be parsed by any client, so the connection fails at the first message. |
37A-McpServerAuditor-402 | FAIL | The negotiated protocolVersion (or every supportedVersions entry) is not one of the five known dates. | Advertise a known MCP protocol version from {endpoint}; replace {version} with 2026-07-28 or another supported date. | Clients connect only over MCP protocol versions they recognise; an unknown version date leaves them unable to agree how to talk to the server, so the handshake fails. |
37A-McpServerAuditor-403 | FAIL | A candidate answered an unauthenticated request with HTTP 403/407 instead of a 401 OAuth challenge โ usually a proxy, API gateway, or WAF in front blocking the request before it reaches the server. | Return HTTP 401 with WWW-Authenticate: Bearer resource_metadata="..." from {endpoint}, or reconfigure the proxy/gateway/WAF so it forwards unauthenticated MCP requests instead of blocking them with {observed}. | A proxy, gateway or WAF answering before the server turns clients away without ever showing them the OAuth challenge, so even authorised AI clients cannot reach the server. |
37A-McpServerAuditor-410 | FAIL | InitializeResult for MCP 2024-11-05 is missing protocolVersion, capabilities, or serverInfo. | Add {missingFields} to the initialize result at {endpoint} (MCP 2024-11-05 requires protocolVersion, capabilities, serverInfo). | Clients read these fields during the handshake to learn what the server is and what it can do, so when they are missing the client cannot finish initialization and the connection fails. |
37A-McpServerAuditor-411 | FAIL | serverInfo is present but name or version is missing (MCP 2024-11-05). | Set serverInfo.name and serverInfo.version on {endpoint} (MCP 2024-11-05 Implementation requires both). Observed serverInfo is {serverInfo}. | The server's name and version identify it to the client and the people using it, so without them a client cannot record or display what it connected to, and strict clients reject the handshake. |
37A-McpServerAuditor-412 | FAIL | protocolVersion is present and is not 2024-11-05. | Set protocolVersion to "2024-11-05" on {endpoint}; observed value is {observedVersion}. | When the server reports a different protocol version than the one negotiated, the client cannot be sure which rules apply and aborts the connection rather than risk talking past the server. |
37A-McpServerAuditor-413 | FAIL | InitializeResult for MCP 2025-03-26 is missing required fields. | Add {missingFields} to the initialize result at {endpoint} (MCP 2025-03-26 requires protocolVersion, capabilities, serverInfo). | Clients read these fields during the handshake to learn what the server is and what it can do, so when they are missing the client cannot finish initialization and the connection fails. |
37A-McpServerAuditor-414 | FAIL | serverInfo is present but name or version is missing (MCP 2025-03-26). | Set serverInfo.name and serverInfo.version on {endpoint} (MCP 2025-03-26 Implementation requires both). Observed serverInfo is {serverInfo}. | The server's name and version identify it to the client and the people using it, so without them a client cannot record or display what it connected to, and strict clients reject the handshake. |
37A-McpServerAuditor-415 | FAIL | protocolVersion is present and is not 2025-03-26. | Set protocolVersion to "2025-03-26" on {endpoint}; observed value is {observedVersion}. | When the server reports a different protocol version than the one negotiated, the client cannot be sure which rules apply and aborts the connection rather than risk talking past the server. |
37A-McpServerAuditor-416 | FAIL | InitializeResult for MCP 2025-06-18 is missing required fields. | Add {missingFields} to the initialize result at {endpoint} (MCP 2025-06-18 requires protocolVersion, capabilities, serverInfo). | Clients read these fields during the handshake to learn what the server is and what it can do, so when they are missing the client cannot finish initialization and the connection fails. |
37A-McpServerAuditor-417 | FAIL | serverInfo is present but name or version is missing (MCP 2025-06-18). | Set serverInfo.name and serverInfo.version on {endpoint} (MCP 2025-06-18 Implementation requires both). Observed serverInfo is {serverInfo}. | The server's name and version identify it to the client and the people using it, so without them a client cannot record or display what it connected to, and strict clients reject the handshake. |
37A-McpServerAuditor-418 | FAIL | protocolVersion is present and is not 2025-06-18. | Set protocolVersion to "2025-06-18" on {endpoint}; observed value is {observedVersion}. | When the server reports a different protocol version than the one negotiated, the client cannot be sure which rules apply and aborts the connection rather than risk talking past the server. |
37A-McpServerAuditor-419 | FAIL | InitializeResult for MCP 2025-11-25 is missing required fields. | Add {missingFields} to the initialize result at {endpoint} (MCP 2025-11-25 requires protocolVersion, capabilities, serverInfo). | Clients read these fields during the handshake to learn what the server is and what it can do, so when they are missing the client cannot finish initialization and the connection fails. |
37A-McpServerAuditor-420 | FAIL | serverInfo is present but name or version is missing (MCP 2025-11-25). | Set serverInfo.name and serverInfo.version on {endpoint} (MCP 2025-11-25 Implementation requires both). Observed serverInfo is {serverInfo}. | The server's name and version identify it to the client and the people using it, so without them a client cannot record or display what it connected to, and strict clients reject the handshake. |
37A-McpServerAuditor-421 | FAIL | protocolVersion is present and is not 2025-11-25. | Set protocolVersion to "2025-11-25" on {endpoint}; observed value is {observedVersion}. | When the server reports a different protocol version than the one negotiated, the client cannot be sure which rules apply and aborts the connection rather than risk talking past the server. |
37A-McpServerAuditor-426 | FAIL | serverInfo.icons is present and at least one icon is missing src. | Set src on every icon in serverInfo.icons at {endpoint} (MCP 2025-11-25 Icon requires src). Observed icons are {icons}. | An icon entry with no source cannot be rendered, so clients that present the server to users show a broken or missing icon. |
37A-McpServerAuditor-422 | FAIL | DiscoverResult is missing cacheScope, capabilities, resultType, supportedVersions, or ttlMs. | Add {missingFields} to the server/discover result at {endpoint} (MCP 2026-07-28 requires cacheScope, capabilities, resultType, supportedVersions, ttlMs). | Clients read these fields from the discover result to learn what the server is and what it can do, so when they are missing the client cannot finish discovery and the connection fails. |
37A-McpServerAuditor-423 | FAIL | supportedVersions is present and is an empty array. | Put at least one MCP protocol date in supportedVersions on {endpoint}; observed value is []. | An empty supported-versions list tells clients the server speaks no protocol version at all, so none of them can negotiate a connection. |
37A-McpServerAuditor-424 | FAIL | cacheScope is present and is not public or private. | Set cacheScope to "public" or "private" on {endpoint}; observed value is {observedScope}. | The cache scope tells clients whether a discovery result may be shared or must stay private; an invalid value leaves caching undefined, risking either stale tool definitions or leaked per-user data. |
37A-McpServerAuditor-425 | FAIL | ttlMs is present and is not a non-negative integer. | Set ttlMs to a non-negative integer (milliseconds) on {endpoint}; observed value is {observedTtl}. | The TTL tells clients how long they may cache the discovery result; an invalid value makes caching unpredictable, so clients either re-fetch constantly or serve outdated tool definitions. |
37A-McpServerAuditor-427 | FAIL | The endpoint returned HTTP 401 without a compliant WWW-Authenticate challenge (missing header, missing Bearer scheme, or missing resource_metadata). | Return WWW-Authenticate: Bearer resource_metadata="https://.../.well-known/oauth-protected-resource" on 401 responses from {endpoint}; observed header was {observed}. | The WWW-Authenticate challenge is how a client discovers where to authenticate; without a compliant one, clients cannot start the OAuth flow and give up on the connection. |
37A-McpServerAuditor-428 | FAIL | The resource_metadata URL is unreachable, not valid JSON, or missing resource/a non-empty authorization_servers array. | Publish RFC 9728 Protected Resource Metadata at {metadataUrl} with "resource" and a non-empty "authorization_servers" array; observed body is {observedSnippet}. | This metadata tells clients which authorization server to use; if it is missing or invalid, clients cannot find where to obtain a token and the connection never authenticates. |
37A-McpServerAuditor-429 | FAIL | Neither RFC 8414 Authorization Server Metadata nor OIDC Discovery for the first authorization_servers entry returns authorization_endpoint and token_endpoint. | Publish OAuth 2.0 Authorization Server Metadata (RFC 8414) or OIDC Discovery for {authServerUrl} with authorization_endpoint and token_endpoint; tried {triedUrls}. | Without the authorization server's published endpoints, clients have nowhere to send the user to log in or to exchange a token, so the OAuth flow cannot complete. |
37A-McpServerAuditor-430 | FAIL | Any discovered OAuth URL (resource_metadata, authorization server, its authorization_endpoint or token_endpoint) is http:// instead of https://. | Serve {insecureUrls} over HTTPS; MCP Authorization (OAuth 2.1 ยง1.5) requires HTTPS for all authorization endpoints. | OAuth tokens and authorization codes sent over plain HTTP can be read or stolen in transit; compliant clients refuse such endpoints, and those that proceed expose their users' credentials. |
37A-McpServerAuditor-300 | WARNING | Newest version the server speaks is not 2026-07-28. | Upgrade {endpoint} from {newestVersion} to 2026-07-28 (server/discover). | Clients that only speak the newest MCP protocol may refuse to connect or fall back to fewer features, so the server reaches fewer AI tools than it could. |
37A-McpServerAuditor-301 | WARNING | A Server Card was found and remotes[].supportedProtocolVersions disagree with the live handshake. | Update remotes[].supportedProtocolVersions on the Server Card to {liveVersions} (card currently lists {cardVersions}). | Clients trust the Server Card to choose a protocol version before connecting, so a card that disagrees with the live server steers them into a handshake that negotiates down or fails outright. |
37A-McpServerAuditor-310 | WARNING | InitializeResult for MCP 2024-11-05 has no instructions text. | Add an instructions string to the initialize result at {endpoint} (MCP 2024-11-05). | The instructions text tells an AI client how to use the server's tools well; without it the model has to guess, so tool calls are more often wrong or wasted. |
37A-McpServerAuditor-311 | WARNING | capabilities has keys outside the 2024-11-05 known set. | Remove or rename {unknownKeys} on {endpoint}, or negotiate a later protocol version. MCP 2024-11-05 known keys: {knownKeys}. | Capability keys the negotiated protocol version does not define are ignored by compliant clients, so any feature behind them silently does not work and may signal a version mismatch. |
37A-McpServerAuditor-312 | WARNING | InitializeResult for MCP 2025-03-26 has no instructions text. | Add an instructions string to the initialize result at {endpoint} (MCP 2025-03-26). | The instructions text tells an AI client how to use the server's tools well; without it the model has to guess, so tool calls are more often wrong or wasted. |
37A-McpServerAuditor-313 | WARNING | capabilities has keys outside the 2025-03-26 known set. | Remove or rename {unknownKeys} on {endpoint}, or negotiate a later protocol version. MCP 2025-03-26 known keys: {knownKeys}. | Capability keys the negotiated protocol version does not define are ignored by compliant clients, so any feature behind them silently does not work and may signal a version mismatch. |
37A-McpServerAuditor-314 | WARNING | InitializeResult for MCP 2025-06-18 has no instructions text. | Add an instructions string to the initialize result at {endpoint} (MCP 2025-06-18). | The instructions text tells an AI client how to use the server's tools well; without it the model has to guess, so tool calls are more often wrong or wasted. |
37A-McpServerAuditor-315 | WARNING | capabilities has keys outside the 2025-06-18 known set. | Remove or rename {unknownKeys} on {endpoint}, or negotiate a later protocol version. MCP 2025-06-18 known keys: {knownKeys}. | Capability keys the negotiated protocol version does not define are ignored by compliant clients, so any feature behind them silently does not work and may signal a version mismatch. |
37A-McpServerAuditor-316 | WARNING | serverInfo is present and title is absent or blank (MCP 2025-06-18). | Add serverInfo.title on {endpoint} (MCP 2025-06-18). Observed serverInfo is {serverInfo}. | The title is the human-friendly name clients show to users; without it they fall back to the raw server name, which is harder for people to recognise and trust. |
37A-McpServerAuditor-317 | WARNING | InitializeResult for MCP 2025-11-25 has no instructions text. | Add an instructions string to the initialize result at {endpoint} (MCP 2025-11-25). | The instructions text tells an AI client how to use the server's tools well; without it the model has to guess, so tool calls are more often wrong or wasted. |
37A-McpServerAuditor-318 | WARNING | capabilities has keys outside the 2025-11-25 known set. | Remove or rename {unknownKeys} on {endpoint}, or negotiate a later protocol version. MCP 2025-11-25 known keys: {knownKeys}. | Capability keys the negotiated protocol version does not define are ignored by compliant clients, so any feature behind them silently does not work and may signal a version mismatch. |
37A-McpServerAuditor-319 | WARNING | serverInfo is missing recommended title, description, icons, or websiteUrl (MCP 2025-11-25). | Add {missingFields} to serverInfo on {endpoint} (MCP 2025-11-25). Observed serverInfo is {serverInfo}. | These recommended fields are what client UIs use to present the server to users, so leaving them out makes it look unfinished and harder to choose or trust. |
37A-McpServerAuditor-320 | WARNING | DiscoverResult for MCP 2026-07-28 has no instructions text. | Add an instructions string to the server/discover result at {endpoint} (MCP 2026-07-28). | The instructions text tells an AI client how to use the server's tools well; without it the model has to guess, so tool calls are more often wrong or wasted. |
37A-McpServerAuditor-321 | WARNING | capabilities has keys outside the 2026-07-28 known set. | Remove or rename {unknownKeys} on {endpoint}. MCP 2026-07-28 known keys: {knownKeys}. | Capability keys the negotiated protocol version does not define are ignored by compliant clients, so any feature behind them silently does not work and may signal a version mismatch. |
37A-McpServerAuditor-330 | WARNING | An OAuth discovery document at the origin (/.well-known/oauth-protected-resource or /.well-known/oauth-authorization-server), probed directly as a client would, is present but blocked (HTTP 403/407 or 5xx) rather than reachable or a clean 404. | Serve {blockedUrls}, or reconfigure the proxy/gateway so it forwards requests to the /.well-known/oauth-* paths instead of blocking them. | AI clients fetch these discovery documents directly to begin the OAuth flow, so when a proxy or gateway blocks them, clients cannot authenticate even though the server itself is reachable. |
37A-McpServerAuditor-331 | WARNING | The challenge and discovery chain are compliant, but the authorization server advertises no registration_endpoint, so clients that rely on OAuth 2.0 Dynamic Client Registration (RFC 7591) โ such as Claude.ai โ cannot obtain a client_id and fail to connect. | Publish a registration_endpoint and enable Dynamic Client Registration (RFC 7591) on the authorization server, or pre-register every client that connects to {endpoint}. | Clients such as Claude.ai register themselves on the fly through Dynamic Client Registration; without it, every client must be set up by hand first, so most simply fail to connect. |
37A-McpServerAuditor-332 | WARNING | The authorization server does not advertise S256 in code_challenge_methods_supported; MCP Authorization mandates PKCE with S256 for public clients. | Advertise "code_challenge_methods_supported": ["S256"] in the authorization server metadata and enforce PKCE on {endpoint}. | PKCE with S256 is what stops an intercepted authorization code from being replayed; without it the OAuth flow is open to code-interception attacks, and strict clients refuse to use the server. |
37A-McpServerAuditor-500 | ERROR | The URL is empty or invalid, or the probe threw before a verdict. | Retry the audit of {url}; verify the URL is reachable. Last error was {error}. | โ |
37A-McpServerAuditor-200 | SUCCESS | No ERROR, FAIL, or WARNING findings, on either path. | Handshake path: MCP endpoint "{endpoint}" speaks {versions} (newest {newestVersion}); handshake {handshakeMethod} succeeded. OAuth path: MCP endpoint "{url}" requires OAuth 2.0 authorization (RFC 9728); challenge and discovery metadata are spec-compliant. | โ |
| Status | Description | Test logic |
|---|---|---|
| INFORMATION | Specification pins only; do not change overall status | Every run includes 100โ104 naming MCP Protocol 2024-11-05 through 2026-07-28 and 105 naming MCP Authorization (RFC 9728, RFC 8414), with their schema/spec URLs. |
| SUCCESS | A known handshake succeeded, or the OAuth challenge and discovery metadata are compliant | Handshake: server/discover or initialize returned a JSON-RPC 2.0 result; the negotiated date is known; required handshake fields are present; no outdated-version warning (300). OAuth: the endpoint returned 401 with a compliant challenge, valid Protected Resource Metadata, valid Authorization Server Metadata served over HTTPS, advertising Dynamic Client Registration and PKCE S256. |
| WARNING | The server works but is outdated, incomplete, or disagrees with its card | Newest date is not 2026-07-28 (300); card supportedProtocolVersions โ live versions (301); missing instructions (310, 312, 314, 317, 320); unknown capability keys (311, 313, 315, 318, 321); missing serverInfo.title (316); incomplete recommended serverInfo (319); an origin OAuth discovery document is present but blocked (330); the compliant authorization server advertises no registration_endpoint for Dynamic Client Registration (331) or no PKCE S256 (332). |
| FAIL | No usable MCP handshake and no compliant OAuth challenge, or the result violates that date's schema | No endpoint answered from any candidate (400); not JSON-RPC 2.0 with result (401); unknown protocol date (402); an unauthenticated request was blocked with 403/407 instead of a 401 challenge, typically by a proxy/gateway/WAF (403); missing initialize fields / identity / protocolVersion (410โ421); invalid icons (426); missing or invalid discover fields (422โ425); non-compliant 401 challenge (427); invalid Protected Resource Metadata (428); invalid Authorization Server Metadata (429); non-HTTPS OAuth URL (430). |
| ERROR | The request cannot be audited | Empty, blank, or invalid URL, or an unexpected exception before a verdict (500). |
Without a reachable MCP endpoint, agents cannot list tools or complete a session against the site.
A server that only speaks an unknown protocol date will be skipped by clients that implement the five dates this auditor pins.
A Server Card that advertises different supportedProtocolVersions than the live handshake steers clients toward a connection that will fail or negotiate down.
Keep remotes[].url and protocol dates in the card aligned with the running server.
MCP Authorization is optional per spec, but nearly every production remote MCP server (this auditor's own, Resend's, Atlassian's) enforces it via a 401 challenge.
A 401 without a compliant WWW-Authenticate: Bearer resource_metadata="..." header leaves clients with no standard way to find where to authenticate.
Protected Resource Metadata and Authorization Server Metadata that are unreachable, malformed, or served over plain HTTP block or downgrade every client's authorization flow, not just this auditor's.
When the MCP endpoint sits behind a reverse proxy, API gateway, or WAF, that layer can reject unauthenticated requests with 403/407 instead of letting the server answer with a 401 challenge (403) โ the endpoint looks dead to every client even though the server is healthy. This is exactly how a missing gateway-injected header took 37 Audits' own MCP offline: clients saw 403 and reported registration failures.
The MCP endpoint and each /.well-known/oauth-* document are often separate gateway routes that can fail independently, so a discovery document can stay blocked (330) after the endpoint is fixed. This auditor probes those documents directly at the origin, the way a client does, rather than only following the 401 challenge header.
A compliant challenge still is not enough to connect: clients such as Claude.ai rely on Dynamic Client Registration (registration_endpoint, 331) and PKCE S256 (332); a server that omits either leaves those clients unable to register or to complete the authorization code flow.
server/discoverProtocol 2026-07-28 replaces initialize with server/discover and requires cacheScope, ttlMs, resultType, and supportedVersions.
Staying on an initialize-only date (300) works for older clients but misses discover-based metadata and caching hints.
This documentation is built and hosted on Mintlify, a developer documentation platform.
Add this auditor to your monitoring setup and start identifying issues on your websites today.