mcp-server-auth-template
Enables the MCP server to validate OAuth 2.1 access tokens issued by Auth0, allowing authenticated access to its tools via Auth0's OIDC and JWKS endpoints.
Enables the MCP server to validate OAuth 2.1 access tokens issued by Keycloak, allowing authenticated access to its tools via Keycloak's OIDC discovery and JWKS endpoints.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-auth-templatewhoami"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-server-auth-template
A production-oriented OAuth 2.1 resource-server reference for remote MCP: Microsoft Entra ID and generic OIDC, exact token/resource validation, fail-closed authorization, progressive scope challenges, stateless MCP
2026-07-28, and metadata-only OpenTelemetry evidence.
Use this repository when the hard part is not "how do I expose an MCP tool?" but how do I expose
it without weakening identity, authorization, transport, and observability boundaries. The server
pairs with mcp-client-auth-template for
an executable end-to-end reference using synthetic identities and no production credentials.
What this repository proves
The paired executable path validates real resource-server behavior rather than configuration claims:
✅ RFC 9728 Protected Resource Metadata is published by the resource server
✅ RFC 8707 resource binding becomes an exact JWT audience boundary
✅ issuer, signature, expiry, algorithm/key compatibility and caller type fail closed
✅ delegated scopes and Entra application roles remain distinct authorization concepts
✅
403 insufficient_scopeis returned before dispatch for progressive authorization✅ wrong-audience tokens are rejected with
401✅ protected tools stay hidden from anonymous catalog discovery
✅ MCP
2026-07-28stays stateless and does not mintMcp-Session-Id✅ generic OIDC and Microsoft Entra ID share one application boundary without provider leakage
✅ W3C trace context reaches the server while OAuth/MCP sensitive values stay out of telemetry
✅ release artifacts, container evidence, SBOMs and provenance are validated by executable gates
Related MCP server: Model Context Protocol Template
Architecture
flowchart LR
Client["MCP client"] -->|"OAuth 2.1 / OIDC"| AS["Authorization server<br/>Entra ID or generic OIDC"]
Client -->|"MCP 2026-07-28<br/>resource-bound bearer"| Admission["Transport admission"]
Admission --> AuthN["Token verification"]
AuthN --> AuthZ["Tool authorization"]
AuthZ --> Tools["MCP tools"]
Server["This resource server"] --- Admission
Server -->|"OIDC discovery + cached JWKS"| AS
Server -.->|"W3C trace context + OTLP"| Collector["OpenTelemetry Collector"]
Collector --> Tempo["Tempo"]
Tempo --> Grafana["Grafana"]The authorization server owns login, consent, client registration and token issuance. This repository owns the protected resource: transport admission, metadata publication, access-token verification, request-scoped principal construction, tool authorization and dispatch.
For layer boundaries and the detailed authorization sequence, see Architecture.
5-minute verification
The companion client owns the executable cross-repository reference flow. With both repositories cloned as siblings, verify this server directly from source:
cd ../mcp-client-auth-template
./scripts/run_reference_demo.sh \
--server-root ../mcp-server-auth-templateThe flow starts the real server from this checkout plus a deterministic local OIDC provider and
proves CIMD-first Authorization Code + PKCE, authenticated whoami, bounded scope step-up,
wrong-audience rejection and stateless MCP behavior.
For the observable published-image proof:
cd ../mcp-client-auth-template
./scripts/run_observability_demo.sh --keepThe observable flow verifies one distributed trace across client and server, positive Collector receipt, Tempo retrieval, Grafana provisioning and telemetry privacy assertions.
See Verification guide for the exact evidence boundary.
Visual proof
The terminal proof below is captured from the source-level paired reference flow:

The trace screenshots are captured from a successful observable run and focus on
mcp-server-auth-template spans:


Authentication profiles
Profile | Intended use | Key behavior |
Entra delegated | Interactive enterprise users | Validates |
Entra application | Provider-specific app-only deployments | Requires explicit |
Generic OIDC delegated | Standards-based interactive clients | Validates issuer/audience/signature/expiry and OAuth scopes |
Generic OIDC client credentials | Unattended services in the deterministic pair profile | Accepts pre-registered machine tokens and progressive OAuth scopes |
Set MCP_SERVER_AUTH_PROVIDER=entra or generic to switch adapters. The example whoami tool
returns the verified caller identity; health requires the additional mcp:tools:health scope and
demonstrates a pre-dispatch 403 insufficient_scope challenge.
Quick start
Prerequisites: Python 3.13 or 3.14 and
uv.
git clone https://github.com/brunovicco/mcp-server-auth-template.git
cd mcp-server-auth-template
cp .env.example .env
uv sync --frozen --all-groups
uv run uvicorn mcp_server_auth_template.entrypoints.mcp_server:create_app --factory --reloadConfigure either the Entra or generic-OIDC block in .env, then point an MCP client at
http://localhost:8000/mcp.
Endpoint | Purpose | Authentication |
| MCP Streamable HTTP | Bearer token |
| Authorization-server discovery metadata | Public |
| Process liveness | Public, minimal response |
| MCP lifespan readiness | Public, minimal response |
For production-style execution:
uv run python -m mcp_server_auth_template.entrypoints.serveSee Production operations before exposing the service outside loopback.
Security properties
The implementation is deliberately fail closed:
exact issuer and audience validation, bounded clock checks, algorithm/key compatibility and cached JWKS refresh;
hardened discovery/JWKS egress against unsafe schemes, redirects, compression, oversized bodies, private/reserved destinations, mixed DNS answers and DNS rebinding;
Host, Origin, header, envelope, body-size and concurrency admission before authentication and tool dispatch;
delegated and application identities remain distinct; extension negotiation never grants authorization by itself;
bearer tokens and decoded claims remain request-local and are never logged or persisted;
tracing excludes credentials, arbitrary headers and URLs, MCP arguments/results, bodies, baggage and exception text.
This is a transparent reference implementation, not a security certification. Read
Privacy and data handling and the architecture decisions under
docs/adr/ before adapting the boundary.
MCP 2026-07-28
The paired templates exercise the modern stateless profile as executable behavior:
server/discoverand per-request_metacarry protocol version, client identity and capabilities without the legacyinitialize/initializedhandshake;modern requests use
MCP-Protocol-Version,Mcp-MethodandMcp-Name;responses do not mint
Mcp-Session-Id;Protected Resource Metadata drives authorization-server discovery;
RFC 8707
resourcebinds the access token audience exactly;runtime
403 insufficient_scopepreserves prior grants and permits only one bounded replay of the undispatched operation;machine-to-machine access is opt-in through
io.modelcontextprotocol/oauth-client-credentials.
See Compatibility and the companion client's cross-repository E2E evidence.
Observability
a2a-otel-kit continues W3C trace context at the MCP ASGI boundary. Export remains network-silent
unless A2A_OTEL_ENABLED=true and a complete OTLP traces endpoint are configured. Spans are
metadata-only and sit inside hardened HTTP admission but outside authentication and tool dispatch.
See LLM and application observability.
Engineering evidence
deterministic quality gate covering lint, format, strict Mypy, architecture, tests/coverage, Bandit, dependency audit, supply-chain controls, governance and vendored contract validation;
SHA-pinned GitHub Actions with read-only permissions by default and isolated release authorities;
CycloneDX source/runtime inventories, complete vulnerability evidence and fail-closed exception policy;
allowlisted byte-reproducible Python release artifacts with SHA-256 manifests and GitHub build provenance;
policy-approved GHCR publication with immutable digest, provenance and SBOM attestations;
Python 3.13/3.14 against MCP SDK 2.0.0 and latest compatible 2.x;
offline JWT fixtures using local keys and synthetic identities;
ADRs documenting security, protocol, operations, compatibility, observability and supply-chain decisions.
Demo vs production
Reference evidence | Production adoption |
Synthetic local OIDC in companion demo | Enterprise authorization server with reviewed registration and consent |
Loopback/local reference networking | TLS-protected service networking and explicit proxy ownership |
Local Collector/Tempo/Grafana | Organization-managed telemetry pipeline and retention policy |
Synthetic signing keys and identities | Managed keys, secrets and provider-specific controls |
Reference | Domain tools with explicit authorization policies and side-effect controls |
The reference settings prove boundaries; they are not production defaults.
Repository structure
src/ resource-server implementation
tests/ unit, contract and security evidence
scripts/ quality, governance and release automation
docs/ architecture, operations, privacy and security
examples/ deployment/reference configuration
.github/workflows/ CI, compatibility and release workflowsLocal editor and coding-agent state is intentionally excluded from the public repository.
Documentation
Document | Use it for |
Source-level and observable paired proof | |
Context, layers, dependency rules and request sequence | |
Supported versions and executable client/server contract | |
Preflight, probes, shutdown, containers and Kubernetes | |
Data inventory, retention, logging, tracing and external processors | |
Dependency policy, CI trust boundary, threats and exceptions | |
OpenTelemetry and optional Langfuse configuration | |
Local environment, checks and container workflow | |
Rationale and trade-offs behind material decisions |
Testing and quality
uv lock --check
uv sync --frozen --all-groups
uv run pytest
uv run python scripts/quality_gate.pyThe quality gate is the definition of done. It covers lint, format, architecture, strict typing, tests/coverage, Bandit, dependency audit, supply-chain controls, governance and vendored contract validation.
Scope and production adoption
This repository is a reference template, not a hosted identity service. A concrete deployment must
still provide TLS termination, immutable image publishing, secret delivery, provider-specific
registration, network policy, capacity planning, monitoring ownership and live IdP validation.
Checked-in .invalid and all-zero values are placeholders and fail production preflight.
License
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityCmaintenanceA comprehensive Model Context Protocol server template that implements HTTP-based transport with OAuth proxy for third-party authorization servers like Auth0, enabling AI tools to securely connect while supporting Dynamic Application Registration.257MIT
- Alicense-qualityDmaintenanceA production-ready MCP server template that connects LLMs and AI agents to external data, tools, and services with built-in OAuth 2.1 authentication, Redis-backed session management, and a modular tools engine.1MIT
- Flicense-qualityCmaintenanceA minimal, well-commented MCP server that authenticates its callers with Microsoft Entra ID (Azure AD).
- Alicense-qualityBmaintenanceA production-ready MCP server template with OAuth 2.1, RBAC, and audit logging for building secure, observable tool servers.MIT
Related MCP Connectors
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
MCP server for verifying EUDI/Talao wallet data via OIDC4VP (pull) for AI agents.
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/brunovicco/mcp-server-auth-template'
If you have feedback or need assistance with the MCP directory API, please join our Discord server