Skip to content

50% off your first year. Join before 2027. Claim →

OAuth checks

When your MCP server needs sign-in, MCP Tower signs in to it the way an agent does. It reads the same discovery documents, registers the same way, asks for the same scopes and sends the token back to your server. Each step is a check, and the scan reports the first place where the flow breaks, what to change and a link to the page that explains it. Every page shows the exact message the check produced, the fix, and a curl command you can run to confirm the fix before you scan again.

Diagnostics appear only when OAuth is involved: your server answered with a 401 or 403, a signed-in scan used a token, or a tool needs or may need sign-in. A server that is open to everyone shows no OAuth checks at all.

The checks follow the order in which an agent signs in. A failure early in the flow means the later steps never run.

  1. Discovery. The agent finds out where to sign in: 401 challenge, protected resource metadata, resource identifier, authorization servers and authorization server metadata.
  2. Authorization server capabilities. The agent checks that it can use the authorization server: endpoints, PKCE and client identity.
  3. Sign-in. The agent registers, sends the user to sign in and gets a token: client registration, authorization, token exchange, token accepted and token refresh.
  4. Tool readiness. The agent learns which tools need sign-in and what they need: tool scopes, declared schemes, hidden tools and call-time responses.
  5. Behind MCP Tower. Tokens work for the hostname agents use: public audience.

The name in the second column is the one the app shows in its checklist.

#CheckIn the appWhat it verifiesResults
1challenge401 challengeAn unauthenticated request gets 401 with WWW-Authenticate: Bearer and resource_metadatapass, warn, fail, skip
2resource_metadataProtected resource metadataThe protected resource metadata document is found and is valid JSONpass, fail
3resource_matchesResource matches the endpointThe metadata’s resource is the URL agents connect topass, fail, skip
4authorization_serversAuthorization server listedThe metadata lists an authorization server in authorization_serverspass, fail, skip
5server_metadataAuthorization server metadataThe authorization server publishes metadata whose issuer is the listed URLpass, fail, skip
6endpointsAuthorization and token endpointsauthorization_endpoint and token_endpoint are present and use httpspass, fail, skip
7pkcePKCE with S256code_challenge_methods_supported includes S256pass, fail, skip
8client_identityClient registration offeredAgents can identify themselves with a Client ID Metadata Document or register with Dynamic Client Registrationpass, warn, skip
9registrationClient registrationDynamic Client Registration, when used, succeedspass, fail, skip
10authorizationAuthorization responseThe sign-in callback carries a code, no error, and the right isspass, fail, skip
11token_exchangeToken exchangeThe token endpoint returns a Bearer access token for the codepass, fail, skip
12token_acceptedToken accepted by the serverYour MCP server accepts the new token for discovery and tools/listpass, fail, skip
13token_refreshToken refreshAn expired access token can be refreshedpass, fail, skip
14tool_scopesTool scopes grantedThe token holds every scope the protected tools declarepass, warn, skip
15declared_schemesTools declare their sign-inEvery tool that needs sign-in declares securitySchemes, with no conflicting declarationspass, warn, skip
16hidden_toolsTools listed before sign-inNo tool appears only after sign-inpass, warn, skip
17call_time_guidanceWhat happens when a tool is calledWhat a protected tool must return when it is called without a token or without enough scopeinfo, skip
18public_audienceTokens for the public hostnameThe resource names the public hostname agents use, not your origin hostpass, warn, skip

“skip” stands for skipped.

StatusMeaning
passThis step works the way agents expect.
infoSomething MCP Tower cannot verify from a scan, with what your server must do. Only the call-time check gives this result.
warnSign-in still works for some agents, but users of others will be blocked or see a worse experience. Fix it before you rely on the server.
failAgents cannot complete sign-in at this step. The checks that depend on it are skipped.
skippedThe check did not run. The app says why: an earlier check failed, the check needs a signed-in scan, or it runs only while someone signs in.

Every warning and failure comes with a next step and a link to its page. A check is skipped for one of these reasons:

  • An earlier check failed. Discovery stops at the first missing piece, and every later discovery check says what it needed: “Needs the protected resource metadata.”, “Needs an authorization server.”, “Needs the authorization server metadata.” or “Needs valid authorization server metadata.”
  • It runs only during sign-in. Client registration, authorization and token exchange happen while someone signs in. In a scan they show “Checked when someone signs in.” The result of the latest sign-in attempt appears on the server’s page.
  • It needs a token. The token and tool checks need a scan that runs as a signed-in user. Select Sign in to scan to get one.
  • Nothing to check. For example, no tool needs sign-in. A check that has no other result shows “Not applicable.”

After you change your server or your authorization server, select Scan again on the server’s page. The scan runs every check again and replaces the checklist. Most pages end with a “Check it yourself” command, so you can confirm a fix first.

Copy report puts the scan on your clipboard as plain text, for the person who runs the authorization server. It holds the origin URL, the result, each check with its status, message, next step and docs link, and the HTTP steps of the scan: method, URL, status code and time. It never contains tokens, authorization codes, secrets or response bodies, so you can paste it into a ticket or a chat.

Your MCP server, as OAuth sees it: a server that accepts access tokens. It describes itself in a protected resource metadata document (RFC 9728) at /.well-known/oauth-protected-resource.

The resource value in that document: the exact URL agents connect to, such as https://mcp.example.com/mcp. Agents send it to the authorization server (RFC 8707), so tokens are issued for that URL.

The server that signs users in and issues tokens, such as https://auth.example.com. It can be your own service or an identity provider. It describes itself in authorization server metadata (RFC 8414 or OpenID Connect Discovery).

The authorization server’s identifier, an https URL. It appears in authorization_servers, in the issuer field of its metadata and in the iss parameter of sign-in responses, and all three must be the same string.

A named permission, such as files:read, that a token grants. Your server can ask for scopes in its 401 challenge, and each tool can declare the scopes it needs.

Proof Key for Code Exchange (RFC 7636). The agent sends a hashed secret when the user signs in and the secret itself when it exchanges the code, so a stolen code is useless. MCP requires the S256 method.

Client ID Metadata Document. The agent’s client id is an https URL that serves a JSON document describing the agent, so the authorization server needs no registration step. MCP recommends it.

Dynamic Client Registration (RFC 7591). The agent registers itself at the authorization server’s registration_endpoint and gets a client id. MCP 2026-07-28 deprecates it in favor of CIMD.

Asking for more scope later. When a signed-in user calls a tool that needs a scope the token lacks, the server answers 403 with error="insufficient_scope" and the scopes it needs, and the agent signs the user in again with them.