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.
MisconfigurationScope accumulation
The resource authorization server ignores the scope in the grant and issues the access token with everything the host's client registration allows. The identity provider's policy said tasks:read; the token says tasks:read tasks:write tasks:admin. Each hop that widens scope defeats the one before it.
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.example
The grant is presented as an assertion; the host authenticates with the credentials it holds at this authorization server.
4.4. Access Token RequestIdentity Assertion JWT Authorization Grant draft-04
Step 8: auth.tasks.example to itself
The authorization server trusts the identity provider's decision and issues no consent screen of its own.
4.4.1. Processing RulesIdentity Assertion JWT Authorization Grant draft-04
Step 9: auth.tasks.example to Agent hostreplaces "access-token"
The grant's scope is the ceiling the identity provider set. A token wider than the grant means the central policy no longer decides what the host may do.
4.4.1. Processing RulesIdentity Assertion JWT Authorization Grant draft-04
Access token, wider than the granttyp 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 tasks:write tasks:admin
- expchanged
- 1790000000
- iatchanged
- 1789996800
- jtichanged
- d02f
resourceremoved- no longer in the token
8 claims differ from the previous token in this chain.
Step 10: Agent host to Tasks MCP serverreplaces "bearer-call"
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 tasks:write tasks:admin
- 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