Open-source OAuth 2.1 + MCP authorization, self-hosted.
Building an MCP server is now a one-afternoon job. Securing it isn't. You need to issue tokens, validate them, federate to your existing IdP, and let agents act on each other's behalf without losing the user behind the chain. Authplane is the one piece of infrastructure that answers all of that — a single Go binary on the server side, and idiomatic SDKs on the client side.
flowchart TD
authserver["<b>authserver</b><br/>OAuth 2.1 + MCP Authorization AS<br/><i>AGPL-3.0 · one Go binary, self-hosted</i>"]
subgraph sdks ["Resource-server SDKs · Apache-2.0 · embed and ship in your app"]
direction LR
go["<b>go-sdk</b>"]
ts["<b>ts-sdk</b>"]
py["<b>python-sdk</b>"]
end
conformance["<b>conformance</b> (catalog)<br/><i>Apache-2.0 · language-neutral source of truth</i>"]
authserver -- "issues JWTs<br/>DPoP · audience-bound" --> sdks
sdks -. "tested against" .-> conformance
classDef agpl fill:#fee2e2,stroke:#991b1b,color:#111
classDef apache fill:#dcfce7,stroke:#166534,color:#111
class authserver agpl
class go,ts,py,conformance apache
| Repo | What it is | Language | Status | License |
|---|---|---|---|---|
| authserver | Self-hosted OAuth 2.1 + MCP Authorization server. One Go binary, embedded Admin UI, PostgreSQL + Vault-backed signing for production. | Go | v0.1.x — production-shaped |
AGPL-3.0 |
| go-sdk | Resource-server SDK and OAuth client for Go. Adapters for the official MCP Go SDK and net/http — mark3labs/mcp-go adapter coming soon. |
Go | Released | Apache-2.0 |
| ts-sdk | Resource-server SDK and OAuth client for TypeScript. Adapters for the official MCP TS SDK and FastMCP — Hono and NestJS adapters coming soon. | TypeScript | Released | Apache-2.0 |
| python-sdk | Resource-server SDK and OAuth client for Python. Adapters for the official MCP Python SDK and FastMCP. | Python | Released | Apache-2.0 |
| conformance | Language-neutral YAML catalog of OAuth 2.1 conformance cases. Every SDK runs it; every assertion traces back to a catalog case. | YAML / Python tooling | Active | Apache-2.0 |
On the roadmap: Rust, C#, and Java SDKs. Talk to us if you need one sooner.
A consistent baseline across Go, TypeScript, and Python — so your MCP server validates tokens, exposes discovery, and enforces consent the same way regardless of stack:
- JWT validation against the authserver JWKS, with caching
- Per-route / per-tool scope enforcement
- The
/.well-known/oauth-protected-resourceendpoint (PRM, RFC 9728) - DPoP proof verification (RFC 9449)
- A full OAuth client — Client Credentials, Token Exchange (RFC 8693), Introspection, Revocation
- Structured
ConsentRequiredErrordecoding for the upstream-provider broker flow
Authplane implements the MCP Authorization specification (2025-11-25) and the OAuth 2.1 ecosystem behind it. Full inventory:
OAuth 2.1 · PKCE (RFC 7636) · DPoP (RFC 9449) · Resource Indicators (RFC 8707) · Protected Resource Metadata (RFC 9728) · Dynamic Client Registration (RFC 7591) · CIMD · AS Metadata (RFC 8414) + OIDC Discovery · Token Exchange (RFC 8693) · JWT Bearer (RFC 7523) · JWT Access Tokens (RFC 9068) · Introspection (RFC 7662) · Revocation (RFC 7009)
The conformance catalog is the source of truth.
export AUTHPLANE_ADMIN_API_KEY="$(openssl rand -hex 32)"
export AUTHPLANE_SESSION_SECRET="$(openssl rand -hex 32)"
docker run -p 9000:9000 -p 9001:9001 \
-e AUTHPLANE_ADMIN_API_KEY \
-e AUTHPLANE_SESSION_SECRET \
-v authserver-data:/data \
authplane/authserver:latest serveOpen http://localhost:9001/admin/ui/ and paste the printed API key. Then secure your MCP server with the Python MCP adapter — Go and TypeScript adapters follow the same pattern.
- Issues & feature requests — file them on the repo that's closest to the problem; we triage across repos.
- Security disclosures — please follow each repo's
SECURITY.md. - Commercial / non-AGPL licensing — write to hello@authplane.ai.
authserver— AGPL-3.0-or-latergo-sdk,ts-sdk,python-sdk,conformance— Apache-2.0
Need different terms for the server? Write to hello@authplane.ai.