createmcps.com

MCP-AUT-009

offline_access absent from scopes_supported / challenge scope

“MCP Servers (Protected Resources) SHOULD NOT include offline_access in WWW-Authenticate scope or Protected Resource Metadata scopes_supported.” — spec anchor

How to fix this

Remove `offline_access` from `scopes_supported` and from the challenge scope. Requesting it grants refresh tokens the resource server does not need.

Example: failing and passing

The challenge asks for offline_access, which is a refresh-token request, not something the resource needs.
Violates MCP-AUT-009 · HTTP
POST /mcp HTTP/1.1
Host: mcp.example.com
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/list
...

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource",
                         scope="files:read offline_access"
The challenge lists only the scope the resource needs and leaves refresh-token decisions to the client and authorization server.
Complies with MCP-AUT-009 · HTTP
POST /mcp HTTP/1.1
Host: mcp.example.com
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/list
...

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource",
                         scope="files:read"

How the validator checks this

Probe P8.2, against a streamable-http server on the modern protocol. What it reports:

pass
offline_access is not advertised in the challenge
info
Challenge advertises offline_access. Refresh-token lifetime is the authorization server's concern; a resource server SHOULD NOT ask for it.

Quoted from the probe that runs this check, so it cannot drift from what the validator actually reports.

This rule is checked deterministically: a fail here is a certain violation, not an inference.

Checked in the same request as MCP-AUT-002, MCP-AUT-003.

Check your own server against MCP-AUT-009

Probe P8.2 checks MCP-AUT-009 in the same request as 2 other rules, so one run shows your server's result for this rule next to the rest. Validate a server or read how the validator works.

Background on this topic: how to add OAuth to an MCP server.

Other Authorization rules

  • MCP-AUT-001Unauthenticated request returns 401 with WWW-Authenticate resource_metadata
  • MCP-AUT-002RFC 9728 Protected Resource Metadata is served and valid
  • MCP-AUT-003PRM resource equals the canonical server URI
  • MCP-AUT-004Each listed authorization server exposes RFC 8414 or OIDC discovery metadata
  • MCP-AUT-005AS advertises authorization_response_iss_parameter_supported: true
  • MCP-AUT-006WWW-Authenticate includes a scope parameter
  • MCP-AUT-007Insufficient scope returns 403 with error="insufficient_scope"
  • MCP-AUT-008Tokens with a foreign audience are rejected
  • MCP-AUT-010AS advertises S256 in code_challenge_methods_supported
  • MCP-AUT-011AS supports Client ID Metadata Documents, not DCR alone