You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This proposal introduces OpenID AuthZEN as an optional fine-grained authorization (FGA) mechanism for the Model Context Protocol (MCP). AuthZEN is a specification developed by the OpenID FoundationAuthZEN Working Group and has been approved as an official version 1.0 specification. It standardizes communication between Policy Enforcement Points (PEPs) and Policy Decision Points (PDPs). This integration enables MCP deployments to externalize authorization decisions to standards-compliant PDPs, supporting multiple authorization models including relationship-based access control (ReBAC), policy-based access control (PBAC), and attribute-based access control (ABAC).
The proposal is fully backward compatible with existing MCP authorization mechanisms and operates as a complementary layer to OAuth 2.1 token validation.
Motivation
Current MCP authorization relies on OAuth 2.1 with scope-based access control. While effective for coarse-grained authorization (CGA), this approach presents limitations for enterprise deployments requiring fine-grained authorization:
Limitations of Scope-Based Authorization
Coarse Granularity: OAuth scopes operate at broad permission levels (e.g., read, write) rather than resource-specific or operation-specific access decisions.
Static Authorization: Scopes are determined at token issuance time and cannot adapt to runtime context such as resource attributes, environmental factors, or dynamic policy changes.
Limited Policy Expression: Complex authorization requirements, such as "analysts may approve expenses up to $10,000 in their assigned department", cannot be expressed through OAuth scopes alone.
Centralized Policy Management: Without externalized authorization, policy logic becomes embedded in application code across multiple MCP Servers, creating maintenance complexity and inconsistent enforcement.
OpenID AuthZEN as a Solution
AuthZEN addresses these limitations by providing:
A standardized interface for authorization decisions
Support for multiple authorization models (ReBAC, PBAC, ABAC)
Runtime context evaluation for dynamic authorization decisions
Specification Overview
Integration Point
AuthZEN enables MCP deployments to externalize fine-grained authorization decisions to a Policy Decision Point (PDP). The core concept is straightforward: the MCP Server or MCP Gateway acts as a Policy Enforcement Point (PEP) that queries an external AuthZEN-compliant PDP before allowing operations to proceed.
flowchart LR
subgraph MCP["MCP Layer"]
Server["MCP Server / MCP Gateway<br/>(AuthZEN PEP)"]
end
subgraph AuthZEN["Authorization Layer"]
PDP["AuthZEN PDP"]
end
Server -->|"Evaluation Request"| PDP
PDP -->|"Decision Response"| Server
Loading
The PEP sends an Evaluation Request containing information about the subject, resource, and action. The PDP evaluates this request against its policies and returns a Decision Response indicating whether the operation should be allowed or denied.
This pattern decouples authorization logic from application code, enabling:
Centralized policy management across multiple MCP Servers
Dynamic policy updates without code changes
Consistent enforcement of complex authorization rules
Support for multiple authorization models (ReBAC, PBAC, ABAC)
Authorization Flow
This section describes the standard AuthZEN authorization architecture followed by an MCP-specific implementation example.
AuthZEN Authorization Architecture
The AuthZEN specification defines a protocol-agnostic pattern for authorization decisions. The following sequence diagram illustrates the standard flow where an MCP Server or MCP Gateway acts as the Policy Enforcement Point (PEP):
sequenceDiagram
participant App as MCP Host
participant Gateway as MCP Server / MCP Gateway<br/>(AuthZEN PEP)
participant PDP as AuthZEN PDP
participant Backend as API
App->>Gateway: Sends request
Gateway->>Gateway: Authenticate Request
Gateway->>Gateway: Extract details<br/>(subject, method, resource)
Gateway->>PDP: Sends AuthZEN request
PDP->>PDP: Evaluates policy
PDP-->>Gateway: Returns allow/deny decision
alt Allow
Gateway->>Backend: Forwards request
Backend-->>Gateway: Returns response
Gateway-->>App: Returns response
else Deny
Gateway-->>App: Returns 403 Forbidden
end
Loading
The key steps in this architecture are:
Request Reception: The gateway receives an incoming request from the application
Authentication: The gateway authenticates the request using the configured mechanism
Context Extraction: Subject, resource, and action details are extracted from the request context
AuthZEN Evaluation: The PEP sends an evaluation request to the AuthZEN PDP
Policy Evaluation: The PDP evaluates the request against configured policies
Decision Enforcement: The PEP enforces the decision-forwarding the request on allow, or returning 403 Forbidden on deny
MCP Implementation Example
Note: The flow described below is non-normative and represents a proposed integration approach for MCP deployments that use OAuth 2.1 for authentication. See MCP-Specific Mapping Example for additional considerations on subject sources and PDP capabilities.
In MCP deployments using OAuth 2.1, AuthZEN operates after OAuth token validation, functioning as a complementary authorization layer. The following sequence diagram illustrates the complete authorization flow for an MCP tools/call request:
sequenceDiagram
participant Client as MCP Client
participant Server as MCP Server / Gateway<br/>(PEP)
participant PDP as AuthZEN PDP
Client->>Server: POST /mcp (tools/call)<br/>Authorization: Bearer <token>
Server->>Server: Validate OAuth Token
alt Token Invalid
Server-->>Client: HTTP 401 Unauthorized
end
Server->>Server: Extract subject from JWT claims
Server->>Server: Extract resource/action from MCP request
Server->>Server: Build AuthZEN Evaluation Request
Server->>PDP: POST /access/v1/evaluation
PDP->>PDP: Evaluate policies
PDP-->>Server: {"decision": true|false}
alt Decision: true
Server->>Server: Execute MCP method
Server-->>Client: JSON-RPC Response
else Decision: false
Server-->>Client: HTTP 403 Forbidden
end
Loading
The key steps are:
Token Validation: The MCP Server validates the OAuth token (existing behavior)
Context Extraction: Subject information is extracted from JWT claims; resource and action from the MCP request
AuthZEN Query: The PEP sends an evaluation request to the PDP
Policy Evaluation: The PDP evaluates the request against configured policies
Decision Enforcement: The PEP enforces the decision (proceed or deny)
AuthZEN Evaluation Request
The AuthZEN specification defines an evaluation request containing four primary components:
Component
Description
subject
The entity requesting access (user, service, agent)
Important: The mapping described below is non-normative and provided as an illustrative example. The OpenID Foundation AuthZEN Working Group intends to define an AuthZEN Profile for MCP to standardize this mapping as an extension of the AuthZEN specification.
Other considerations:
Subject sources are flexible: In this example, subject information is derived from OAuth Access Token (JWT claims). This is not required-subject information can be obtained from other sources depending on the deployment architecture.
PDP data sources: The AuthZEN PDP is not limited to the data provided in the evaluation request. The PDP can retrieve and incorporate external data sources (e.g., user directories, relationship graphs, resource metadata) when making policy decisions.
For MCP tools/call requests, the evaluation request could be constructed as follows:
Subject (derived from JWT claims):
type: "user" or "identity"
id: Value from sub or preferred_username claim
properties: Additional claims such as roles, tenant, acr (authentication context class reference), amr (authentication methods references)
Resource:
type: "mcp-tool" or application-specific type
id: MCP namespace or resource scope (e.g., "mcp:expenses")
When decision is true, the MCP Server proceeds with request execution. When decision is false, the MCP Server MUST return HTTP 403 Forbidden.
Benefits
Benefit
Description
Standardization
AuthZEN provides a vendor-neutral interface, avoiding PDP lock-in
Externalized Authorization
Policy decisions decoupled from application code
Fine-Grained Access Control
Support for ReBAC, PBAC, ABAC, or hybrid models
Policy as Code
Policies managed as versioned artifacts with audit trails
Centralized Governance
Consistent policy enforcement across MCP deployments
Dynamic Authorization
Runtime evaluation of context-aware policies
Interoperability
Compatible with any AuthZEN-compliant PDP
Relationship to MCP Authorization Extensions
This proposal aligns with the MCP ext-auth extension framework principles, and I can open a ticket there to provide implementation guidance and reference configurations.
Open Questions
Community Interest: Is the MCP community open to evaluating the addition of AuthZEN as a standardized mechanism for fine-grained authorization in MCP deployments?
Formalization in ext-auth: Should this proposal be formalized as an official MCP authorization extension in the ext-auth repository?
This is the first iteration of this proposal, covering only the authorization API. If there is interest, I can clarify any questions and provide implementation examples demonstrating AuthZEN integration with MCP and MCP apps to the community.
OpenID AuthZEN Integration for Fine-Grained Authorization
Author: @embesozzi
Status: Draft
Type: Feature Proposal
Created: 2026-02-02
Abstract
This proposal introduces OpenID AuthZEN as an optional fine-grained authorization (FGA) mechanism for the Model Context Protocol (MCP). AuthZEN is a specification developed by the OpenID Foundation AuthZEN Working Group and has been approved as an official version 1.0 specification. It standardizes communication between Policy Enforcement Points (PEPs) and Policy Decision Points (PDPs). This integration enables MCP deployments to externalize authorization decisions to standards-compliant PDPs, supporting multiple authorization models including relationship-based access control (ReBAC), policy-based access control (PBAC), and attribute-based access control (ABAC).
The proposal is fully backward compatible with existing MCP authorization mechanisms and operates as a complementary layer to OAuth 2.1 token validation.
Motivation
Current MCP authorization relies on OAuth 2.1 with scope-based access control. While effective for coarse-grained authorization (CGA), this approach presents limitations for enterprise deployments requiring fine-grained authorization:
Limitations of Scope-Based Authorization
Coarse Granularity: OAuth scopes operate at broad permission levels (e.g.,
read,write) rather than resource-specific or operation-specific access decisions.Static Authorization: Scopes are determined at token issuance time and cannot adapt to runtime context such as resource attributes, environmental factors, or dynamic policy changes.
Limited Policy Expression: Complex authorization requirements, such as "analysts may approve expenses up to $10,000 in their assigned department", cannot be expressed through OAuth scopes alone.
Centralized Policy Management: Without externalized authorization, policy logic becomes embedded in application code across multiple MCP Servers, creating maintenance complexity and inconsistent enforcement.
OpenID AuthZEN as a Solution
AuthZEN addresses these limitations by providing:
Specification Overview
Integration Point
AuthZEN enables MCP deployments to externalize fine-grained authorization decisions to a Policy Decision Point (PDP). The core concept is straightforward: the MCP Server or MCP Gateway acts as a Policy Enforcement Point (PEP) that queries an external AuthZEN-compliant PDP before allowing operations to proceed.
flowchart LR subgraph MCP["MCP Layer"] Server["MCP Server / MCP Gateway<br/>(AuthZEN PEP)"] end subgraph AuthZEN["Authorization Layer"] PDP["AuthZEN PDP"] end Server -->|"Evaluation Request"| PDP PDP -->|"Decision Response"| ServerThe PEP sends an Evaluation Request containing information about the subject, resource, and action. The PDP evaluates this request against its policies and returns a Decision Response indicating whether the operation should be allowed or denied.
This pattern decouples authorization logic from application code, enabling:
Authorization Flow
This section describes the standard AuthZEN authorization architecture followed by an MCP-specific implementation example.
AuthZEN Authorization Architecture
The AuthZEN specification defines a protocol-agnostic pattern for authorization decisions. The following sequence diagram illustrates the standard flow where an MCP Server or MCP Gateway acts as the Policy Enforcement Point (PEP):
sequenceDiagram participant App as MCP Host participant Gateway as MCP Server / MCP Gateway<br/>(AuthZEN PEP) participant PDP as AuthZEN PDP participant Backend as API App->>Gateway: Sends request Gateway->>Gateway: Authenticate Request Gateway->>Gateway: Extract details<br/>(subject, method, resource) Gateway->>PDP: Sends AuthZEN request PDP->>PDP: Evaluates policy PDP-->>Gateway: Returns allow/deny decision alt Allow Gateway->>Backend: Forwards request Backend-->>Gateway: Returns response Gateway-->>App: Returns response else Deny Gateway-->>App: Returns 403 Forbidden endThe key steps in this architecture are:
MCP Implementation Example
In MCP deployments using OAuth 2.1, AuthZEN operates after OAuth token validation, functioning as a complementary authorization layer. The following sequence diagram illustrates the complete authorization flow for an MCP
tools/callrequest:sequenceDiagram participant Client as MCP Client participant Server as MCP Server / Gateway<br/>(PEP) participant PDP as AuthZEN PDP Client->>Server: POST /mcp (tools/call)<br/>Authorization: Bearer <token> Server->>Server: Validate OAuth Token alt Token Invalid Server-->>Client: HTTP 401 Unauthorized end Server->>Server: Extract subject from JWT claims Server->>Server: Extract resource/action from MCP request Server->>Server: Build AuthZEN Evaluation Request Server->>PDP: POST /access/v1/evaluation PDP->>PDP: Evaluate policies PDP-->>Server: {"decision": true|false} alt Decision: true Server->>Server: Execute MCP method Server-->>Client: JSON-RPC Response else Decision: false Server-->>Client: HTTP 403 Forbidden endThe key steps are:
AuthZEN Evaluation Request
The AuthZEN specification defines an evaluation request containing four primary components:
subjectresourceactioncontextRequest Structure
{ "subject": { "type": "<subject_type>", "id": "<subject_identifier>", "properties": {} }, "resource": { "type": "<resource_type>", "id": "<resource_identifier>", "properties": {} }, "action": { "name": "<action_name>", "properties": {} }, "context": {} }MCP-Specific Mapping Example
For MCP
tools/callrequests, the evaluation request could be constructed as follows:Subject (derived from JWT claims):
type:"user"or"identity"id: Value fromsuborpreferred_usernameclaimproperties: Additional claims such asroles,tenant,acr(authentication context class reference),amr(authentication methods references)Resource:
type:"mcp-tool"or application-specific typeid: MCP namespace or resource scope (e.g.,"mcp:expenses")Action (derived from MCP request):
name: Tool name fromparams.nameproperties: Tool arguments fromparams.argumentsExample: MCP Tool Invocation
Given the following MCP request:
{ "jsonrpc": "2.0", "id": "request_12345", "method": "tools/call", "params": { "name": "fintech_approve_expense", "arguments": { "expense_id": "exp-123", "amount": 5000 } } }And a JWT containing:
{ "sub": "xxxxx", "preferred_username": "embesozzi", "realm_access": { "roles": ["analyst"] }, "organization": "finance-dept", "acr": "inherence", "amr": ["passkeys"] }The AuthZEN evaluation request would be:
{ "subject": { "type": "user", "id": "embesozzi", "properties": { "roles": ["analyst"], "tenant": "finance-dept", "acr": "inherence", "amr": ["passkeys"] } }, "resource": { "type": "mcp-tool", "id": "mcp:expenses" }, "action": { "name": "fintech_approve_expense", "properties": { "expense_id": "exp-123", "amount": 5000 } } }AuthZEN Evaluation Response
The PDP returns a decision:
{ "decision": true }Or:
{ "decision": false }When
decisionistrue, the MCP Server proceeds with request execution. Whendecisionisfalse, the MCP Server MUST return HTTP 403 Forbidden.Benefits
Relationship to MCP Authorization Extensions
This proposal aligns with the MCP ext-auth extension framework principles, and I can open a ticket there to provide implementation guidance and reference configurations.
Open Questions
Community Interest: Is the MCP community open to evaluating the addition of AuthZEN as a standardized mechanism for fine-grained authorization in MCP deployments?
Formalization in ext-auth: Should this proposal be formalized as an official MCP authorization extension in the
ext-authrepository?References
This is the first iteration of this proposal, covering only the authorization API. If there is interest, I can clarify any questions and provide implementation examples demonstrating AuthZEN integration with MCP and MCP apps to the community.