AuthZEN MCP Profile
Author: @embesozzi
Status: Draft
Type: Feature Proposal
Created: 2026-02-04
Context
The Model Context Protocol (MCP) enables AI assistants to discover and invoke tools, resources, and prompts from MCP Servers. MCP Servers and MCP Gateways are natural AuthZEN Policy Enforcement Points (PEPs).
An MCP Gateway executes authorization filters before forwarding the MCP request to the target MCP Server, and can execute filters before returning the response to the caller. AuthZEN filters are meant to execute with very low latency, since they are in the execution path of every MCP request. The purpose of an AuthZEN filter in the MCP context is to translate between the MCP JSON-RPC Information Model and the AuthZEN Evaluation Request format.
This profile provides a standardized mapping that developers can use to enable MCP Servers and Gateways to become AuthZEN clients.
Scope
This profile focuses on the MCP JSON-RPC transport, specifically the standard MCP methods:
tools/call - Invoke a tool
tools/list - List available tools
resources/read - Read a resource
resources/list - List available resources
resources/subscribe - Subscribe to resource changes
resources/unsubscribe - Unsubscribe from resource changes
prompts/get - Get a prompt
prompts/list - List available prompts
This profile primarily addresses the tools/call method with detailed examples, and provides mappings for other methods.
Scenarios
This profile covers two authorization scenarios for MCP:
Medium-Grained Authorization
Answering the question: "Can this subject invoke this MCP tool?"
In this scenario, the gateway authorizes access to the tool based on its identity without considering the specific arguments. This provides defense-in-depth by ensuring users can only access tools they are authorized to use, regardless of input parameters.
Fine-Grained Authorization
Answering the question: "Can this subject invoke this MCP tool with these specific arguments?"
In this scenario, the gateway extracts the tool arguments and includes them in the AuthZEN evaluation request, enabling the PDP to make context-aware decisions based on resource attributes, environmental factors, and dynamic policy conditions.
MCP Information Model
The MCP JSON-RPC protocol defines the following semantically important elements that need to be mapped to the AuthZEN information model:
- JSON-RPC method name (e.g.,
tools/call, resources/read)
- Request parameters:
- Tool/resource/prompt name
- Arguments/parameters
- Session context
- Connection metadata
- Authentication tokens (OAuth Access Token)
Since MCP has adopted OAuth 2.1 as the security standard, I’m assuming that the MCP Server or Gateway acts as an OAuth Resource Server.
Mappings
AuthZEN's information model defines a subject, action, resource, and context for a well-formed AuthZEN payload. The mappings for MCP are given below.
Subject
An authenticated MCP call typically contains an Authorization header with an OAuth 2.1 Bearer token (JWT). The subject of the authorization request is identified by claims in that token.
Subject: Case Human (On-Behalf-Of User)
The MCP Server / MCP Gateway validates the JWT in the Authorization header as part of its request processing and extracts claims such as sub, preferred_username, etc.
The gateway formats the subject in the AuthZEN request as follows
{
"subject": {
"type": "user", // or identity
"id": "<JWT.sub or JWT.preferred_username>"
}
}
Another example for adding standard claims, such as Authentication Context Reference (acr) and Authentication Mechanism Reference (amr), to the AuthZEN request as follows:
{
"subject": {
"type": "user", // or identity
"id": "<JWT.sub or JWT.preferred_username>",
"properties": {
"acr": "<JWT.acr>",
"amr": ["<JWT.amr>"]
}
}
}
Subject JWT Mapping
| JWT Claim |
AuthZEN Field |
Description |
sub |
subject.id |
Subject identifier |
preferred_username |
subject.id |
Human-readable username (preferred over sub) |
acr |
subject.properties.acr |
Authentication Context Class Reference |
amr |
subject.properties.amr |
Authentication Methods References |
Subject: Case Non-Human Identity (NHI)
In the case of NHI, an OAuth token can be issued to an agent, negotiated using client credentials or SPIFFE. In this scenario, the MCP server / gateway validates the JWT, it will have extracted claims such as `sub.
{
"subject": {
"type": "agent", // or ?
"id": "<JWT.sub>"
}
}
[TBD: In some cases, it can be useful to know that we are evaluating an agent rather than a user]
Action
The action.name field is required for an AuthZEN request. A compliant MCP Gateway passes the MCP method name as the action.name.
The MCP method name corresponds to the JSON-RPC method being invoked:
| MCP Method |
AuthZEN action.name |
tools/call |
tools/call |
resources/read |
resources/read |
resources/list |
resources/list |
prompts/get |
prompts/get |
prompts/list |
prompts/list |
Example for tools/call:
{
"action": {
"name": "tools/call"
}
}
Resource
The resource.type and resource.id fields are required for an AuthZEN request.
In the case of tool execution MCP Gateway maps the tool name.
| MCP Element |
AuthZEN Field |
Value |
| - |
resource.type |
"mcp-tool", "mcp-resource", or "mcp-prompt" |
| Tool name |
resource.id |
|
[TBD: We should review the use cases for resources or prompts]
[TBD Not sure if we really need the syntax resource.type to be mcp-xxxx]
For example, if invoking the tool fintech_approve_expense:
{
"resource": {
"type": "mcp-tool",
"id": "fintech_approve_expense"
}
}
Resource Properties
The following information SHOULD be provided in resource.properties:
| MCP Element |
AuthZEN Field |
Type |
Description |
| Tool arguments |
resource.properties.arguments |
Object |
Arguments passed to the tool |
| Resource parameters |
resource.properties.parameters |
Object |
Parameters for resource access |
Example with arguments:
{
"resource": {
"type": "mcp-tool",
"id": "fintech_approve_expense",
"properties": {
"arguments": {
"expense_id": "exp-123",
"amount": 5000
}
}
}
}
Context
An MCP request includes session and connection metadata that MAY be relevant for authorization. An MCP Gateway that complies with this profile MAY provide additional context in the context object.
| MCP Element |
AuthZEN Field |
Description |
| Client information |
context.client |
Information about the MCP client |
| Connection metadata |
context.connection |
Connection metadata from handshake |
| Request timestamp |
context.timestamp |
When the request was received |
Example:
{
"context": {
"client": {
"name": "Claude Desktop",
"version": "1.0.0"
},
"connection": {
"transport": "http",
"session_id": "session-abc123"
}
}
}
Complete Example: tools/call
MCP Request
POST /mcp HTTP/1.1
Host: mcp-gateway.example.com
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwiZW1haWwiOiJqb2huLmRvZUBhY21lY29ycC5jb20iLCJuYW1lIjoiSm9obiBEb2UiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiYW5hbHlzdCJdfSwib3JnYW5pemF0aW9uIjoiZmluYW5jZS1kZXB0IiwiYWNyIjoiaW5oZXJlbmNlIiwiYW1yIjpbInBhc3NrZXlzIl19.k4SjE4EeFX9QVZx7YnB1TQ
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": "request_12345",
"method": "tools/call",
"params": {
"name": "fintech_approve_expense",
"arguments": {
"expense_id": "exp-123",
"amount": 5000
}
}
}
JWT Payload
{
"sub": "1234567890",
"email": "john.doe@acmecorp.com",
"preferred_username": "john doe",
"name": "John Doe",
"realm_access": {
"roles": ["analyst"]
},
"organization": "finance-dept",
"acr": "inherence",
"amr": ["passkeys"],
"iat": 1516239022
}
AuthZEN Evaluation Request
{
"subject": {
"type": "user",
"id": "1234567890",
"properties": {
"preferred_username": "john doe",
"email": "john.doe@acmecorp.com",
"roles": ["analyst"],
"tenant": "finance-dept",
"acr": "inherence",
"amr": ["passkeys"]
}
},
"action": {
"name": "tools/call"
},
"resource": {
"type": "mcp-tool",
"id": "fintech_approve_expense",
"properties": {
"arguments": {
"expense_id": "exp-123",
"amount": 5000
}
}
},
"context": {
"client": {
"name": "Claude Desktop",
"version": "1.0.0"
},
"connection": {
"session_id": "session-abc123"
}
}
}
AuthZEN Evaluation Response
Additional Examples
Example: resources/read
MCP Request
{
"jsonrpc": "2.0",
"id": "request_67890",
"method": "resources/read",
"params": {
"uri": "file:///project/src/docs-server/documents/annual-report-2024.pdf"
}
}
AuthZEN Evaluation Request
{
"subject": {
"type": "user",
"id": "embesozzi",
"properties": {
"roles": ["analyst"],
"tenant": "finance-dept"
}
},
"action": {
"name": "resources/read"
},
"resource": {
"type": "mcp-resource",
"id": "file:///project/src/docs-server/documents/annual-report-2024.pdf",
"properties": {
"parameters": {}
}
}
}
Example: prompts/get
MCP Request
{
"jsonrpc": "2.0",
"id": "request_11111",
"method": "prompts/get",
"params": {
"name": "finance_summary",
"arguments": {
"period": "Q4-2024",
"department": "sales"
}
}
}
AuthZEN Evaluation Request
{
"subject": {
"type": "user",
"id": "xxxxxxx",
"properties": {
"roles": ["analyst"],
"tenant": "finance-dept"
}
},
"action": {
"name": "prompts/get"
},
"resource": {
"type": "mcp-prompt",
"id": "finance_summary",
"properties": {
"arguments": {
"period": "Q4-2024",
"department": "sales"
}
}
}
}
Example: tools/list
MCP Request
{
"jsonrpc": "2.0",
"id": "request_22222",
"method": "tools/list"
}
AuthZEN Evaluation Request
{
"subject": {
"type": "user",
"id": "xxxxxxx",
"properties": {
"roles": ["analyst"],
"tenant": "finance-dept"
}
},
"action": {
"name": "tools/list"
},
"resource": {
"type": "mcp-tool",
"id": "*" // ?
}
}
Example: resources/list
MCP Request
{
"jsonrpc": "2.0",
"id": "request_33333",
"method": "resources/list"
}
AuthZEN Evaluation Request
{
"subject": {
"type": "user",
"id": "embesozzi",
"properties": {
"roles": ["analyst"],
"tenant": "finance-dept"
}
},
"action": {
"name": "resources/list"
},
"resource": {
"type": "mcp-resource",
"id": "*" // ?
}
}
When decision is true, the MCP Gateway forwards the request to the target MCP Server. When decision is false, the MCP Gateway MUST return a JSON-RPC error response:
{
"jsonrpc": "2.0",
"id": "request_12345",
"error": {
"code": -32000,
"message": "Request denied due to authorization policy"
}
}
References
AuthZEN MCP Profile
Author: @embesozzi
Status: Draft
Type: Feature Proposal
Created: 2026-02-04
Context
The Model Context Protocol (MCP) enables AI assistants to discover and invoke tools, resources, and prompts from MCP Servers. MCP Servers and MCP Gateways are natural AuthZEN Policy Enforcement Points (PEPs).
An MCP Gateway executes authorization filters before forwarding the MCP request to the target MCP Server, and can execute filters before returning the response to the caller. AuthZEN filters are meant to execute with very low latency, since they are in the execution path of every MCP request. The purpose of an AuthZEN filter in the MCP context is to translate between the MCP JSON-RPC Information Model and the AuthZEN Evaluation Request format.
This profile provides a standardized mapping that developers can use to enable MCP Servers and Gateways to become AuthZEN clients.
Scope
This profile focuses on the MCP JSON-RPC transport, specifically the standard MCP methods:
tools/call- Invoke a tooltools/list- List available toolsresources/read- Read a resourceresources/list- List available resourcesresources/subscribe- Subscribe to resource changesresources/unsubscribe- Unsubscribe from resource changesprompts/get- Get a promptprompts/list- List available promptsThis profile primarily addresses the
tools/callmethod with detailed examples, and provides mappings for other methods.Scenarios
This profile covers two authorization scenarios for MCP:
Medium-Grained Authorization
Answering the question: "Can this subject invoke this MCP tool?"
In this scenario, the gateway authorizes access to the tool based on its identity without considering the specific arguments. This provides defense-in-depth by ensuring users can only access tools they are authorized to use, regardless of input parameters.
Fine-Grained Authorization
Answering the question: "Can this subject invoke this MCP tool with these specific arguments?"
In this scenario, the gateway extracts the tool arguments and includes them in the AuthZEN evaluation request, enabling the PDP to make context-aware decisions based on resource attributes, environmental factors, and dynamic policy conditions.
MCP Information Model
The MCP JSON-RPC protocol defines the following semantically important elements that need to be mapped to the AuthZEN information model:
tools/call,resources/read)Since MCP has adopted OAuth 2.1 as the security standard, I’m assuming that the MCP Server or Gateway acts as an OAuth Resource Server.
Mappings
AuthZEN's information model defines a subject, action, resource, and context for a well-formed AuthZEN payload. The mappings for MCP are given below.
Subject
An authenticated MCP call typically contains an
Authorizationheader with an OAuth 2.1 Bearer token (JWT). The subject of the authorization request is identified by claims in that token.Subject: Case Human (On-Behalf-Of User)
The MCP Server / MCP Gateway validates the JWT in the Authorization header as part of its request processing and extracts claims such as sub, preferred_username, etc.
The gateway formats the subject in the AuthZEN request as follows
Another example for adding standard claims, such as Authentication Context Reference (
acr) and Authentication Mechanism Reference (amr), to the AuthZEN request as follows:Subject JWT Mapping
subsubject.idpreferred_usernamesubject.idsub)acrsubject.properties.acramrsubject.properties.amrSubject: Case Non-Human Identity (NHI)
In the case of NHI, an OAuth token can be issued to an agent, negotiated using client credentials or SPIFFE. In this scenario, the MCP server / gateway validates the JWT, it will have extracted claims such as `sub.
[TBD: In some cases, it can be useful to know that we are evaluating an agent rather than a user]
Action
The
action.namefield is required for an AuthZEN request. A compliant MCP Gateway passes the MCP method name as theaction.name.The MCP method name corresponds to the JSON-RPC method being invoked:
tools/calltools/callresources/readresources/readresources/listresources/listprompts/getprompts/getprompts/listprompts/listExample for
tools/call:Resource
The
resource.typeandresource.idfields are required for an AuthZEN request.In the case of tool execution MCP Gateway maps the tool name.
resource.type"mcp-tool","mcp-resource", or"mcp-prompt"resource.id[TBD: We should review the use cases for resources or prompts]
[TBD Not sure if we really need the syntax resource.type to be mcp-xxxx]
For example, if invoking the tool
fintech_approve_expense:Resource Properties
The following information SHOULD be provided in
resource.properties:resource.properties.argumentsresource.properties.parametersExample with arguments:
Context
An MCP request includes session and connection metadata that MAY be relevant for authorization. An MCP Gateway that complies with this profile MAY provide additional context in the
contextobject.context.clientcontext.connectioncontext.timestampExample:
Complete Example: tools/call
MCP Request
JWT Payload
AuthZEN Evaluation Request
AuthZEN Evaluation Response
Additional Examples
Example: resources/read
MCP Request
{ "jsonrpc": "2.0", "id": "request_67890", "method": "resources/read", "params": { "uri": "file:///project/src/docs-server/documents/annual-report-2024.pdf" } }AuthZEN Evaluation Request
Example: prompts/get
MCP Request
{ "jsonrpc": "2.0", "id": "request_11111", "method": "prompts/get", "params": { "name": "finance_summary", "arguments": { "period": "Q4-2024", "department": "sales" } } }AuthZEN Evaluation Request
Example: tools/list
MCP Request
{ "jsonrpc": "2.0", "id": "request_22222", "method": "tools/list" }AuthZEN Evaluation Request
Example: resources/list
MCP Request
{ "jsonrpc": "2.0", "id": "request_33333", "method": "resources/list" }AuthZEN Evaluation Request
When
decisionistrue, the MCP Gateway forwards the request to the target MCP Server. Whendecisionisfalse, the MCP Gateway MUST return a JSON-RPC error response:{ "jsonrpc": "2.0", "id": "request_12345", "error": { "code": -32000, "message": "Request denied due to authorization policy" } }References