Expose HTTPS authorization and token endpoints
This check verifies that your authorization server metadata
names an authorization_endpoint and a token_endpoint, and that both are absolute https URLs.
Check id endpoints. Results:
Why it matters
Section titled “Why it matters”Sign-in needs two URLs, and agents take both from the authorization server metadata. The authorization endpoint is the page the user’s browser opens to sign in and approve access. The token endpoint is where the agent exchanges the authorization code for an access token, and later refreshes it. Nothing about your server is hard-coded in an agent, so if either field is missing the agent has nowhere to go and the sign-in never starts.
- ChatGPT names
authorization_endpointandtoken_endpointamong the fields that must be correct: they are the URLs it needs to run the authorization code flow with PKCE end to end (OpenAI: Authentication). - Claude fetches the authorization server’s metadata to find its
/authorizeand/tokenendpoints (Claude: Lazy authentication). - The MCP authorization specification requires every authorization server endpoint to be served
over HTTPS
(Communication security).
Codes and tokens pass through these endpoints, so a plain
httpURL would expose 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 at two fields,
authorization_endpointandtoken_endpoint. A field fails when it is missing, empty, not an absolute URL with a host, or nothttps. - If both fields are good, the check passes. If either fails, the check fails and the message lists every field that failed, in alphabetical order.
- If discovery stopped earlier, the check is
skippedwith the reason of the step that stopped it.
A failed endpoints check means MCP Tower does not offer Sign in to scan, because sign-in
cannot start without both URLs.
Results
Section titled “Results”| Status | Message | Meaning | Fix |
|---|---|---|---|
| pass | Authorization and token endpoints are present. | Both fields are absolute https URLs. | |
| fail | Missing or not https: <fields>. | <fields> is authorization_endpoint, token_endpoint, or both, comma-separated. | Publish both endpoints |
| fail | Missing or not https: <fields>. | The field is present but uses http, or is a relative path. | Use absolute https URLs |
| 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: “Publish <fields> as https URLs in the authorization server
metadata.”, with the fields joined by “and”. For example: “Publish authorization_endpoint and
token_endpoint as https URLs in the authorization server metadata.”
How to fix
Section titled “How to fix”An endpoint is missing
Section titled “An endpoint is missing”- Fetch your authorization server metadata (see Check it yourself) and note which of the two fields is absent.
- In your authorization server’s settings or code, add the missing field to the metadata
document. Most authorization servers generate the document from their own configuration. RFC
8414 lets a server leave
authorization_endpointout when it supports no grant that uses it, so look for the setting that enables the authorization code grant. - Make sure the URL in the document is the one that actually serves the endpoint, then scan again.
A metadata document 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"], "grant_types_supported": ["authorization_code", "refresh_token"], "code_challenge_methods_supported": ["S256"]}An endpoint is not an https URL
Section titled “An endpoint is not an https URL”- Replace any
http://URL with itshttps://form, and serve the endpoint over HTTPS with a certificate that public clients trust. - Replace a relative path, such as
"/token", with the absolute URL,"https://auth.example.com/token". RFC 8414 defines these fields as URLs, and MCP Tower treats a value without a scheme and host as missing. - If your authorization server runs behind a load balancer or reverse proxy that terminates TLS,
configure it to build URLs from the public scheme and host, for example by trusting the
X-Forwarded-ProtoandX-Forwarded-Hostheaders the proxy sends.
Check it yourself
Section titled “Check it yourself”Fetch the metadata and print the two fields:
curl -s https://auth.example.com/.well-known/oauth-authorization-server \ | jq '{authorization_endpoint, token_endpoint}'The problem is fixed when both are absolute https URLs:
{ "authorization_endpoint": "https://auth.example.com/authorize", "token_endpoint": "https://auth.example.com/token"}A null means the field is missing. If your issuer has a path, 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 8414 §2: the
authorization_endpointandtoken_endpointmetadata fields - RFC 6749 §3.1 and §3.2: the authorization and token endpoints, and their TLS requirement
- MCP authorization
2026-07-28: Communication security - OpenAI: Authentication, “Publish OAuth metadata from your authorization server”
- Claude: Lazy authentication, “Serve the discovery documents”