OAuth checks
When MCP Tower scans a server that uses OAuth, it runs the checks below in this order. A warning or failure in a scan links to the page for that check, which will explain what was checked, what agents do when it fails, and how to fix it.
- Sign-in challenge: Checks that an unauthenticated request gets a
401response whoseWWW-Authenticate: Bearerheader carriesresource_metadata, so agents can find where to sign in. - Protected resource metadata: Checks that the protected resource metadata document is found, first at the path-suffixed well-known URL and then at the root one, and that it is valid JSON.
- Resource identifier: Checks that the metadata’s
resourceequals the MCP endpoint URL, or the public hostname URL MCP Tower serves it on. - Authorization servers: Checks that the metadata lists at least one authorization server in
authorization_servers. - Authorization server metadata: Checks that the authorization server publishes its metadata and that its
issuermatches the URL the metadata was fetched for. - Authorization and token endpoints: Checks that
authorization_endpointandtoken_endpointare present and usehttps. - PKCE: Checks that
code_challenge_methods_supportedincludesS256, as the MCP authorization specification requires. - Client identity: Checks how agents identify themselves: Client ID Metadata Documents with
noneintoken_endpoint_auth_methods_supported, or Dynamic Client Registration. It warns when only Dynamic Client Registration or only manual credentials work. - Client registration: Checks that Dynamic Client Registration, when it is used, succeeds and accepts MCP Tower’s redirect URI.
- Authorization: Checks that the authorization callback has no
error, and that itsiss, when present, equals the recorded issuer. - Token exchange: Checks that the token endpoint returns a Bearer access token for the authorization code.
- Token accepted: Checks that the MCP server accepts the new token: discovery or
initialize, thentools/list, succeed when authenticated. - Token refresh: Checks that an expired access token can be refreshed.
- Tool scopes: Checks that every tool whose
authisrequiredoroptionalhas its declared scopes granted. - Declared security schemes: Checks that every tool whose
authisrequiredoroptionaldeclaressecuritySchemes, and that no tool’s top-level and_metadeclarations conflict. - Hidden tools: Checks that no tool appears only after signing in. Agents list tools before the user signs in.
- Call-time guidance: Reports what a protected tool must return when it is called without a token or without enough scope. This cannot be verified without calling the tools, so it is shown as information.
- Public audience: Warns when
resourcenames the origin host instead of the public hostname. Tokens must be accepted for the hostname agents use. This warning does not fail the scan.