In this article
October 29, 2026
October 29, 2026

Why agent-to-agent chains need per-hop delegated tokens

Shared credentials turn one manipulated agent into a compromised chain. Narrow, audience-bound tokens at every hop shrink the blast radius.

Explore with AI
Open in ChatGPT
Open in Claude
Open in Perplexity

Earlier this month, independent researcher Syed Anas Mohiuddin's work drew attention to how easily trust spreads through agent networks. He found the same SSRF flaw in MCP servers run by Google, JPMorgan Chase, Weaviate, France's interministerial digital directorate and the city government of Tangerang, Indonesia, and all five fixed it (The Next Web). Google's flaw, CVE-2026-14540, was rated 8.0 and affected MCP Toolbox for Databases 0.3.0 to 1.4.0: the HTTP client had no restrictive redirect policy and no check on target IP addresses.

Mohiuddin also describes a wider attack he calls protocol pivoting. An attacker plants text in content an MCP tool returns, shaped like a task for Google's A2A protocol. In The Next Web's words, "An orchestrating agent passes it to a subagent, which runs it because it trusts the orchestrator." Rapid7's Douglas McKee described the structural problem this way: "Every piece in that chain did exactly what it was designed to do, which is what makes this so tricky to catch."

That research is about request forgery and trust between agents, not about stolen credentials. But it shows the shape of the problem authorization has to answer. When one hop has been manipulated, what is it still allowed to do? This post is about how to shrink that answer.

The pattern that makes chains dangerous

A common setup, and one to avoid, hands every hop the same long-lived credential, often held by the MCP server. This is an architecture pattern, not a finding of the research above.

Diagram of an agent chain with five boxes in a row: User, Agent A, Agent B, MCP server and Downstream API. Dashed red lines run from Agent A, Agent B, the MCP server and the API down to one wide red box labeled long-lived server-held credential, showing that every hop can use the same broad credential. Three callouts underneath read: authority is ambient, identity disappears, trust is transitive.

It causes three problems.

Problem What it looks like Why it hurts
Authority is ambient Any hop can use the server-held credential A manipulated translation agent can reach the billing API
Identity disappears The API sees "the MCP server did it" No record of which user or agents started the request
Trust is transitive Agent C accepts Agent B because B is "internal" One compromised hop becomes a launchpad for every hop after it

‍

This is a confused deputy problem in the general sense: a component with broad authority is tricked into using it on someone else's behalf. It is related to, but distinct from, the specific proxy-consent attack the MCP security guidance calls the confused deputy problem, which involves static client IDs, dynamic client registration and consent cookies. Agent chains make the general version worse because the chain is longer, the deputies follow natural-language instructions, and nobody watches the middle hops.

The fix: authority that narrows at every hop

Stop passing one credential down the chain. Give each hop its own token, issued for that hop, scoped as narrowly as possible, and carrying the identity of everyone upstream.

Diagram of the same agent chain with a different token at each hop. Boxes above the arrows show the user's consent to Agent A, then a token for Agent B, a token for the MCP server and a token for the downstream API, each listing its audience, a scope and an act claim recording who acted before it. Below the chain, an authorization server box with dashed arrows to each hop reads: validates the incoming token, narrows scope, binds audience, issues the next one through token exchange.

OAuth already has the pieces. This is a recipe built from existing standards, not a new one. Note that the MCP authorization spec does not prescribe token exchange for downstream calls; it forbids passthrough and requires audience validation, and token exchange is the standard OAuth way to get a token for another resource without passing one through.

Building block Where it comes from What it does for agent chains
Token exchange RFC 8693 The client asks an authorization server for a different token. The act claim records delegation: the outermost act is the current actor and nested act claims are prior actors.
Audience binding RFC 8707 (resource indicators) A token is requested for one specific resource. The MCP authorization spec requires clients to send the resource parameter and requires servers to validate that tokens were issued for them.
No token passthrough MCP authorization spec, Token Handling "MCP servers MUST NOT accept or transit any other tokens." Do not forward an upstream token to a downstream API. Request a new one instead.
Scope minimization MCP security best practices Request only the scopes an operation needs and elevate incrementally, so a stolen token can do less.
Short lifetimes General OAuth practice A leaked token expires quickly instead of staying useful for weeks.

Before and after

Shared credential Per-hop delegated tokens
Scope at hop 3 Everything the credential can do Only what hop 3 was delegated
Audit trail "MCP server called API" User, Agent A, Agent B, server, API
After a compromise Rotate a secret that everything depends on Revoke one delegation; the others keep working
Cross-resource replay Possible Blocked by audience binding
Policy enforcement Scattered across services Centralized at the authorization server

What this does and doesn't buy you

It does not stop prompt injection. A manipulated agent will still try the wrong thing. What changes is the blast radius.

It does not fix SSRF. Google's fix added a DNS rebinding guard and allowed and blocked IP range lists. The MCP security guidance recommends the same class of control for OAuth URL fetching: block private and reserved IP ranges, validate redirect targets, and consider an egress proxy. Delegated tokens complement these controls and do not replace them.

It does give you:

  • Least privilege that holds under compromise: each hop has only what it was explicitly granted.
  • Attributable actions: the final API sees the full chain.
  • A handle for revocation: revoke one user's or one agent's delegation without rotating a shared secret.
  • Policy at the boundary, for example "Agent B may never request billing scopes on behalf of any user."

What to do this quarter

  • Inventory your chains. List every MCP server and agent-to-agent path, including vendor-managed ones.
  • Find the shared credentials. Any long-lived secret reachable by more than one agent is your biggest exposure.
  • Move to exchange, not passthrough. Servers obtain downstream tokens through token exchange, scoped to the specific call.
  • Bind audiences and shorten lifetimes. One token, one resource, minutes not days.
  • Log the delegation chain. If logs cannot show user, agent, agent, resource, you cannot investigate an incident.
  • Gate sensitive actions explicitly. High-risk calls between agents need their own authorization decision, not trust inherited from position in the chain.

Where WorkOS fits

WorkOS applies the same principles, with different mechanisms than a general RFC 8693 exchange between hops.

AuthKit as the authorization server for your MCP server. AuthKit issues access tokens with an aud claim that matches the requested resource, so a token is minted for one MCP server and not reusable at another. It supports Client ID Metadata Documents (off by default, and recommended) and Dynamic Client Registration for clients that don't support them yet. See the AuthKit MCP docs.

Agent Auth for delegated chains. In a delegated session, the agent acts on behalf of a specific user. An agent can present its own access token to mint a child session, and each hop re-derives permissions from current authority instead of trusting the token it was handed. Access tokens last at most one hour, and revoking a session also revokes every session chained under it. The act claim on a delegated session identifies the delegating user. It does not list every intermediate hop, and chaining uses Agent Auth's own minting API, not RFC 8693 token exchange. Agent Auth must be enabled for your environment, so contact your WorkOS account team. See the Agent Auth docs.

Keeping provider credentials out of the agent. For third-party APIs, Relay routes the agent's calls through WorkOS, which attaches the provider credential at that boundary and refreshes it, so the agent does not handle the provider token. See Keeping credentials out of an AI agent's context with Relay. For the on-behalf-of basics, see OAuth on-behalf-of for AI agents.

The takeaway

The lesson is not that agent networks are hopeless. "Trusted because internal" is no longer a defensible authorization model when the things inside your network follow instructions from untrusted text. Agents need identities of their own, delegated and narrowed at every hop, so one manipulated agent cannot spend the whole chain's authority.