Skip to content

Standards Compliance

AuthPlane’s authserver implements the subset of each standard needed for MCP authorization — not less, not more. Where a spec offers multiple approaches (token formats, client auth methods), it picks the secure-by-default option and documents deviations explicitly. Every deviation is tied to an ADR (Architecture Decision Record) so you can trace the reasoning.

StandardStatusAuthPlane implementation
MCP Authorization (2025-11-25)ImplementedFull discovery flow (PRM → AS metadata → DCR → authorize → token), CIMD support, resource indicators. Tested against Claude Code, Claude Desktop, and MCP Inspector.
RFC 9728 — Protected Resource MetadataImplemented (SDK-side)PRM is the resource server’s contract, so it is served by the MCP server’s process via the AuthPlane Go, Python, and TypeScript SDKs at the path-scoped /.well-known/oauth-protected-resource/<mcp-path>. The AS itself is not a protected resource; its discovery surface is RFC 8414.
StandardStatusAuthPlane implementation
RFC 6749 — OAuth 2.0Implemented (§4.1, §3.3, §4.4)Authorization code grant with PKCE enforcement; scope validation against registered scopes; client auth none, client_secret_basic, client_secret_post; error responses per §5.2. Client credentials grant for machine-to-machine tokens (confidential clients only, client_credentials.enabled, off by default).
OAuth 2.1 (draft)FollowedPKCE mandatory, no implicit or ROPC grants, refresh-token rotation with family revocation on reuse.
RFC 7636 — PKCEImplementedS256 only. The plain method is rejected; a missing code_challenge is rejected.
RFC 8707 — Resource IndicatorsImplementedThe resource parameter binds tokens to a specific resource server; access tokens carry it as the aud claim. Exact string matching — trailing slashes matter. No prefix or wildcard matching.
RFC 9700 — OAuth 2.0 Security BCPFollowedPKCE required, exact redirect URI matching, refresh token rotation, no implicit grant.

Documented deviation (ADR-012): when oauth.require_scope: false, a missing scope in authorize requests defaults to all registered scopes for the resource instead of rejecting — a deviation from RFC 6749 §3.3 (“MUST NOT assume a default scope”). It is opt-in and disabled by default.

StandardStatusAuthPlane implementation
RFC 9068 — JWT Profile for Access TokensImplementedAccess tokens are JWTs with typ: at+jwt and standard claims: iss, sub, aud, exp, iat, jti, client_id, scope. Machine tokens set sub to the client_id.
RFC 7517 — JSON Web KeyImplementedJWKS endpoint at /.well-known/jwks.json. ES256 (EC P-256) and RS256 key types.
StandardStatusAuthPlane implementation
RFC 8414 — AS MetadataImplementedFull metadata at /.well-known/oauth-authorization-server: issuer, all endpoint URLs, response_types_supported, grant_types_supported, token_endpoint_auth_methods_supported, code_challenge_methods_supported, scopes_supported, resource_indicators_supported, plus dpop_signing_alg_values_supported when DPoP is on.
OpenID Connect DiscoveryAlias + upstream/.well-known/openid-configuration returns the same document as the RFC 8414 endpoint. AuthPlane also acts as an OIDC relying party for upstream enterprise login via /oidc/start and /oidc/callback.
StandardStatusAuthPlane implementation
RFC 7591 — Dynamic Client RegistrationImplementedThree modes: open, approved_redirects, admin_only. Supports redirect_uris, client_name, token_endpoint_auth_method.
CIMD (draft-ietf-oauth-client-id-metadata-document)Implemented (draft)When client_id is a URL, AuthPlane fetches the metadata document, validates its fields, and caches it. cimd.require_https: true by default in production.
StandardStatusAuthPlane implementation
RFC 7009 — Token RevocationImplemented/oauth/revoke accepts both access and refresh tokens; always returns 200 per spec.
RFC 7662 — Token IntrospectionImplemented/oauth/introspect accepts access tokens and machine tokens; client authentication required for confidential clients. Returns cnf.jkt for DPoP-bound tokens.
Refresh rotation (OAuth 2.1)ImplementedRefresh tokens rotate on every use. Presenting a consumed refresh token revokes the entire token family.
StandardStatusAuthPlane implementation
RFC 9449 — DPoPImplemented (dpop.enabled, off by default)Full proof validation (typ, alg, jwk, htm, htu, iat, jti, nonce). Algorithms: ES256, RS256, PS256alg: none and all symmetric algorithms rejected; a private key in the jwk header is rejected. JKT computed per RFC 7638; token binding via cnf.jkt; token_type: DPoP. Server-issued nonces (DPoP-Nonce header, configurable TTL) and database-backed JTI replay prevention with background purge. ath validation on resource requests. Without a proof, requests fall back to standard Bearer tokens.
StandardStatusAuthPlane implementation
RFC 8693 — Token ExchangeImplemented (token_exchange.enabled, off by default)Impersonation (no actor token, sub preserved) and delegation (nested act claim per §4.1) with correct multi-hop chain nesting. Subject tokens validated for signature, issuer, expiry, and revocation. Scope narrowing only (requested ⊆ subject scope). Configurable chain depth limit (1–10, default 5). Policy enforcement via self-exchange rules, the may_act claim, and a config allowlist. DPoP binding propagates to exchanged tokens.
RFC 7523 — JWT Bearer (XAA / ID-JAG)Implemented (xaa.enabled, off by default)Enterprise-managed authorization: grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer with ID-JAG assertions (typ: oauth-id-jag+jwt) validated for signature, issuer, audience, and expiry. Trusted IdP registry with SSRF-protected JWKS discovery and caching. Policy engine evaluates IdP + client_id + scope + resource constraints; subject mapping in auto_map or strict mode; assertion JTI is single-use (replay prevention); policy scopes narrow the issued token. No deviations from RFC 7523 §2.1.
Agent identity claimsAuthPlane extensionagent_id claim (set to client_id when the issuing client has is_agent=true) and agent_chain (ordered list from the delegation act chain, capped at 8). Agents register via DCR with agent: true. Advertised as authplane_agent_identity_supported in AS metadata.
StandardStatusAuthPlane implementation
RFC 9457 — Problem DetailsImplementedError responses combine OAuth fields (error, error_description) with Problem Details fields (type, title, detail, status). Content-Type: application/problem+json. See the API reference for an example.

A compliance matrix you can trust says what’s missing, too:

  • Implicit grant (RFC 6749 §4.2) — removed per OAuth 2.1 security requirements.
  • Resource Owner Password Credentials (RFC 6749 §4.3) — removed per OAuth 2.1.
  • PKCE plain method — rejected; S256 only.
  • CIBA, Pushed Authorization Requests (RFC 9126), Rich Authorization Requests (RFC 9396), and the Device Authorization grant (RFC 8628) — not currently implemented.

The supported grant types are exactly: authorization_code, refresh_token, client_credentials, urn:ietf:params:oauth:grant-type:token-exchange, and urn:ietf:params:oauth:grant-type:jwt-bearer. Anything else returns unsupported_grant_type.