RFC 8414 authorization-server metadata, aliased at
/.well-known/openid-configuration.
forward "/.well-known/oauth-authorization-server",
Noizu.MCP.Auth.Server.MetadataPlug, MCPConfig.as_opts()
forward "/.well-known/openid-configuration",
Noizu.MCP.Auth.Server.MetadataPlug, MCPConfig.as_opts()The fields clients actually gate on
This document is not decoration — Claude reads it and decides what it is willing to do:
code_challenge_methods_supported: ["S256"]— only S256, neverplaintoken_endpoint_auth_methods_supportedcontaining"none"— together with the next flag, this is what makes Claude offer CIMD. Drop"none"and it silently falls back to dynamic registrationclient_id_metadata_document_supported: true— the other half of that pairregistration_endpoint— present only withdcr: [enabled: true]; its absence is how a client learns not to tryauthorization_response_iss_parameter_supported: true— and the authorization endpoint really does emitiss(RFC 9207)resource_indicators_supported: true— RFC 8707, which is how a client knows to ask for a token bound to one mountjwks_uri— only in RS256 mode. Advertising it with an HMAC key would point clients at an empty key set.
The document is public, unauthenticated and cacheable, and is served with
Access-Control-Allow-Origin: * because claude.ai reads it from a browser
context.
Summary
Functions
The metadata document as a map — exposed so a host can assert on it in its own tests, and so a frontend "connect an agent" page can render from it.
Functions
@spec document(Noizu.MCP.Auth.Server.Config.t()) :: map()
The metadata document as a map — exposed so a host can assert on it in its own tests, and so a frontend "connect an agent" page can render from it.