Support PKCE with S256
This check verifies that your authorization server advertises PKCE with the
S256 method in code_challenge_methods_supported.
Check id pkce. Results:
Why it matters
Section titled “Why it matters”PKCE protects the authorization code. When the user signs in, the agent sends a hash of a random
secret, the code challenge. When it exchanges the code, it sends the secret itself, the code
verifier. Someone who intercepts the code cannot use it without the verifier. With the S256
method the challenge is a SHA-256 hash; with plain it is the secret itself, which protects
nothing if the authorization request is seen.
The MCP authorization specification makes PKCE mandatory for clients, requires S256, and tells
clients to refuse to proceed when code_challenge_methods_supported is absent from the metadata
(Authorization code protection).
Agents check the metadata before they start, so an authorization server that supports PKCE but
does not say so in its metadata is treated as one that does not support it.
- ChatGPT says
code_challenge_methods_supportedmust includeS256, and that servers whose metadata omits the field or does not advertiseS256are unsupported (OpenAI: Authentication). - Claude sends a code challenge with
code_challenge_method=S256on every authorization request, and requires the authorization server to support it and advertise"code_challenge_methods_supported": ["S256"](Claude: Authentication for connectors). - Other agents follow the MCP specification. MCP Tower has not verified them.
What MCP Tower checks
Section titled “What MCP Tower checks”- MCP Tower reads the authorization server metadata that the authorization server metadata check found and validated.
- It looks for the string
S256in thecode_challenge_methods_supportedarray. The comparison is exact, sos256does not count. - If
S256is listed, the check passes. If the field is missing, empty, or lists only other methods such asplain, the check fails. - If discovery stopped earlier, the check is
skippedwith the reason of the step that stopped it.
A failed pkce check means MCP Tower does not offer Sign in to scan, because every agent would
refuse to continue. When you do sign in, MCP Tower always uses S256, as agents do.
Results
Section titled “Results”| Status | Message | Meaning | Fix |
|---|---|---|---|
| pass | PKCE with S256 is supported. | The metadata lists S256. | |
| fail | code_challenge_methods_supported does not include S256. The MCP authorization spec requires it. | The field is missing from the metadata. | Advertise S256 |
| fail | code_challenge_methods_supported does not include S256. The MCP authorization spec requires it. | The field lists only plain or another method. | Enable S256 |
| skipped | Needs the protected resource metadata. | Discovery stopped at protected resource metadata. | Fix that check first |
| skipped | Needs an authorization server. | Discovery stopped at authorization servers. | Fix that check first |
| skipped | Needs the authorization server metadata. | Discovery stopped at server metadata. | Fix that check first |
| skipped | Needs valid authorization server metadata. | The metadata’s issuer did not match; see server metadata. | Fix that check first |
The next step for the failure is: “Enable PKCE with S256 on your authorization server.”
How to fix
Section titled “How to fix”The metadata does not advertise PKCE
Section titled “The metadata does not advertise PKCE”An authorization server can support PKCE and still leave the field out of its metadata. OpenID Connect Discovery does not define the field, but MCP requires authorization servers that publish OpenID Connect discovery to include it.
- Check whether your authorization server accepts a
code_challengewithcode_challenge_method=S256on its authorization endpoint. If it does, only the metadata is wrong. - Find the setting that controls the published metadata, or the code that builds it, and add
code_challenge_methods_supportedwithS256. - Fetch the metadata again and confirm the field is there.
Only plain is enabled
Section titled “Only plain is enabled”- Enable PKCE with the
S256method for the authorization code grant in your authorization server. - Allow it for public clients too. Claude’s Client ID Metadata Document client is a public client with no secret, so PKCE is its only protection for the code.
- You can keep
plainlisted for old clients, but listS256as well. The MCP specification requires clients to useS256when they can.
Metadata that passes:
{ "issuer": "https://auth.example.com", "authorization_endpoint": "https://auth.example.com/authorize", "token_endpoint": "https://auth.example.com/token", "response_types_supported": ["code"], "code_challenge_methods_supported": ["S256"]}Check it yourself
Section titled “Check it yourself”Print the methods your authorization server advertises:
curl -s https://auth.example.com/.well-known/oauth-authorization-server \ | jq '.code_challenge_methods_supported'The problem is fixed when the list includes S256:
["S256"]null means the field is missing, and ["plain"] means S256 is not enabled. If your issuer has a
path, or you publish OpenID Connect discovery instead, use the metadata URL that the
server metadata check reported as found. Then select Scan again
on the server’s page.
References
Section titled “References”- RFC 7636 §4.2: the code challenge
and the
S256andplainmethods - RFC 8414 §2: the
code_challenge_methods_supportedmetadata field - MCP authorization
2026-07-28: Authorization code protection - OpenAI: Authentication, “Publish OAuth metadata from your authorization server”
- Claude: Authentication for connectors, “PKCE and requested scopes”