An OAuth 2.1 authorization server for MCP resource servers, as a Django app: RFC 9728/8414/7591/7517/6750 profile, PKCE, refresh rotation, client-credentials service accounts.
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"django-mcp-oauth","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
# django-mcp-oauth An OAuth 2.1 authorization server for MCP resource servers, as a Django app. Built on Authlib's Django integration plus PyJWT/cryptography, with the MCP profile wired on top: - RFC 9728 protected-resource metadata, RFC 8414 authorization-server metadata, RFC 7517 JWKS — all under `/.well-known/` - RFC 7591 dynamic client registration, with the public-client rule (a `token_endpoint_auth_method: none` client is never issued a secret, and the response omits the field as the RFC requires) - Authorization-code grant with PKCE (S256) required, RS256 JWT access tokens bound to the resource audience - Refresh-token rotation with a configurable grace window, so concurrent agents sharing a connection do not strand each other with a dead credential - Client-credentials grant for service accounts, each bound to a Django user - RFC 6750 / 9728 `WWW-Authenticate` challenges for the resource server - Client secrets stored hashed The one product decision — *may this signed-in user authorize an MCP client?* — is a dotted-path setting. Everything else is configuration. ## Install ```bash pip install django-mcp-oauth # + [drf] for the REST Framework class python manage.py generate_oauth_keys # prints a private key PEM to set as MCP_OAUTH_PRIVATE_KEY ``` ```python INSTALLED_APPS += ["django_mcp_oauth"] MCP_OAUTH_ISSUER = "https://example.com" # the AS origin (iss) MCP_RESOURCE_URL = "https://example.com/mcp" # the MCP server (aud) MCP_OAUTH_PRIVATE_KEY = os.environ["MCP_OAUTH_PRIVATE_KEY"] MCP_OAUTH_AUTHORIZE_USER = "myapp.access.may_use_mcp" # callable(user) -> bool MCP_OAUTH_CONSENT_TEMPLATE = "myapp/consent.html" # optional; receives grant, client, scope ``` ```python # urls.py — both lists at the site root from django_mcp_oauth.urls import oauth_urlpatterns, wellknown_urlpatterns urlpatterns += wellknown_urlpatterns + oauth_urlpatterns ``` Optional settings and their defaults are listed in `django_mcp_oauth/co…
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.