Delegation chain explorer
An enterprise identity provider brokers the token
The same agent host and tasks server, with the company's identity provider deciding who may use which MCP server. The host signs Alex in at the identity provider, exchanges the ID token for an Identity Assertion JWT Authorization Grant (ID-JAG) addressed to the server's authorization server, and presents that grant for an access token. No consent screen at the tasks server: the policy lives at the identity provider.
AttackGrant audience not checked
The resource authorization server accepts any grant the identity provider signed, without checking that the grant's audience is itself. A grant the host obtained for a different application's authorization server is presented here and redeemed for a tasks-server token the identity provider never approved.
The chain, step by step
Step 1: Alex to Enterprise IdP (idp.corp.example)
The host is an application the enterprise manages. The identity provider authenticates Alex and issues the host an ID token it keeps for later.
4.2. User AuthenticationIdentity Assertion JWT Authorization Grant draft-04
Step 2: Enterprise IdP (idp.corp.example) to Agent host
4.2. User AuthenticationIdentity Assertion JWT Authorization Grant draft-04
ID tokentyp JWT · alg RS256 · kid idp-2026
- iss
- https://idp.corp.example
- sub
- u-48213
- aud
- agent-host
- alex@corp.example
- exp
- 1790000000
- iat
- 1789996400
Unchanged since the previous token in this chain.
Step 3: Agent host to Tasks MCP server
Discovery is unchanged: the host learns the server's resource identifier and that auth.tasks.example is its authorization server, and the server declares the enterprise-managed authorization extension.
Implementation guide › For MCP serversMCP Enterprise-Managed Authorization stable
Step 4: Agent host to Enterprise IdP (idp.corp.example)
Instead of sending Alex to the tasks server's authorization endpoint, the host asks the identity provider for a grant it can present there. The audience is the resource authorization server, not the MCP server.
4.3. Token ExchangeIdentity Assertion JWT Authorization Grant draft-04
Step 5: Enterprise IdP (idp.corp.example) to itself
Group membership, the approved-app list and conditional access are checked here, once, centrally. A user without access gets an error and the host never receives a grant.
4.3.3. Processing RulesIdentity Assertion JWT Authorization Grant draft-04
Step 6: Enterprise IdP (idp.corp.example) to Agent host
4.3.4. ResponseIdentity Assertion JWT Authorization Grant draft-04
Identity Assertion JWT Authorization Granttyp oauth-id-jag+jwt · alg RS256 · kid idp-2026
- iss
- https://idp.corp.example
- sub
- u-48213
- audchanged
- https://auth.tasks.example
- client_idadded
- https://agent.example/client.json
- scopeadded
- tasks:read
- resourceadded
- https://mcp.tasks.example/mcp
- jtiadded
- 3a9e
- expchanged
- 1789996700
- iat
- 1789996400
emailremoved- no longer in the token
7 claims differ from the previous token in this chain. The required claims are iss, sub, aud, client_id, jti, exp and iat; scope and resource are optional and carry what the policy allowed.
Step 7: Agent host to auth.tasks.examplereplaces "access-token-request"
The grant is genuine, signed by the trusted identity provider, unexpired, for the right user; only its audience is another server.
3.1. ID-JAG ClaimsIdentity Assertion JWT Authorization Grant draft-04
An ID-JAG for another authorization servertyp oauth-id-jag+jwt · alg RS256 · kid idp-2026
- iss
- https://idp.corp.example
- sub
- u-48213
- audchanged
- https://auth.notes.example
- client_id
- https://agent.example/client.json
- scopechanged
- notes:read
- jtichanged
- 51c0
- exp
- 1789996700
- iat
- 1789996400
resourceremoved- no longer in the token
4 claims differ from the previous token in this chain.
Step 8: auth.tasks.example to itselfreplaces "validate-jag"
With the audience unchecked, one grant from the identity provider opens every authorization server that trusts it.
4.4.1. Processing RulesIdentity Assertion JWT Authorization Grant draft-04
Step 9: auth.tasks.example to Agent host
4.4.2. ResponseIdentity Assertion JWT Authorization Grant draft-04
Access token for the Tasks MCP servertyp at+jwt · alg ES256 · kid auth-2026-1
- isschanged
- https://auth.tasks.example
- subchanged
- alex
- audchanged
- https://mcp.tasks.example/mcp
- client_id
- https://agent.example/client.json
- scopechanged
- tasks:read
- expchanged
- 1790000000
- iatchanged
- 1789996800
- jtichanged
- d02f
7 claims differ from the previous token in this chain.
Step 10: Agent host to Tasks MCP server
Authorization › Access Token UsageMCP Authorization 2026-07-28
Access token as presentedtyp at+jwt · alg ES256 · kid auth-2026-1
- iss
- https://auth.tasks.example
- sub
- alex
- aud
- https://mcp.tasks.example/mcp
- client_id
- https://agent.example/client.json
- scope
- tasks:read
- exp
- 1790000000
- iat
- 1789996800
- jti
- d02f
Unchanged since the previous token in this chain.
Step 11: Tasks MCP server to itself
Security Considerations › Token Audience Binding and ValidationMCP Authorization 2026-07-28
Requirements this chain exercises
- PRM reachable at a well-known URIMCP server
- PRM lists an authorization serverMCP server
- Authorization server metadata discoverableAuthorization server
- Bearer token only in the Authorization headerMCP server
- Audience validationMCP server