Proposal: Agent Identity and Delegation for MCP Tool Calls #2404
Replies: 20 comments 3 replies
-
|
@pcarleton @pja-ant Would love your thoughts on this, it sits at the intersection of auth and the agents working group. Happy to answer any questions or iterate on the design. |
Beta Was this translation helpful? Give feedback.
-
|
we've hacked around this before with manual allowlists, but it breaks down once you get deep nesting — you lose track of what each agent in the chain can actually do. revocation's the killer though: if a parent agent goes rogue mid-request, how do you unwind that delegation? |
Beta Was this translation helpful? Give feedback.
-
|
Good questions, both are exactly what motivated the design. On deep nesting: Each delegation in the chain can only attenuate (narrow) the parent's permissions, never widen them. So if Agent A delegates On mid-request revocation: Revocation is checked at verification time, not delegation time. Each proof includes the full chain, and The implementation is live across Rust, TypeScript, and Python if you want to try it: https://github.com/kanoniv/agent-auth |
Beta Was this translation helpful? Give feedback.
-
|
Great proposal. Agent identity and delegation is one of the most critical missing pieces in MCP right now. I've been working on a production implementation of exactly this. ScopeBlind Passport provides a portable, signed agent identity that works today:
For the "delegation" part specifically: we use a binding receipt that links the agent's Ed25519 identity key to a P-256 DPoP key. The operator signs this binding, creating a verifiable chain: Operator → Agent Identity → Per-Request DPoP Proof. The enforcement layer is protect-mcp — a stdio proxy that evaluates the agent's Passport at session start and assigns tool-level access based on the trust tier. Every tool call produces a signed decision receipt. Would love to align on the identity schema if there's interest in standardizing this at the spec level. |
Beta Was this translation helpful? Give feedback.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
This comment was marked as spam.
-
|
This proposal raises an important gap worth highlighting. Even in human-in-the-loop scenarios, today's agent or MCP Host is largely identity-less. While the MCP client can be clearly identified in authorization flows, the host or agent running above it remains mostly invisible. This is a real problem since a single host can orchestrate multiple MCP clients connecting to different tools, yet none of that host-level context surfaces in the authorization layer. This is something we've been thinking about for a while. We proposed an OAuth extension to address it through dynamically delegated access: There's also a session walking through how agent identity can be layered on top of MCP authorization, if useful for context: When an agent inside an MCP host invokes a tool requiring elevated authority, the MCP server challenges the host (HTTP 401/403 with required_scope). The host initiates a PAR flow carrying:
The issued token carries sub (user), azp (client), and act.sub (agent), giving MCP servers a full, auditable delegation chain and enabling actor-aware policy. Would be great to discuss how this host-level identity gap gets addressed, whether through extensions like the above or as a first-class consideration in the spec. |
Beta Was this translation helpful? Give feedback.
-
|
Strong thread — agent identity + delegation is one of the most-discussed primitives in the MCP community, and ship-ready implementations are rare. I've been building TokenRip (tokenrip.com) as a collaboration layer with this as a first-class concern: A few implementation notes from what we've shipped:
Happy to contribute the spec we use if helpful for the MCP working group. |
Beta Was this translation helpful? Give feedback.
This comment was marked as spam.
This comment was marked as spam.
-
|
This thread maps closely to a protocol draft I have been working on: the Agent Identity Protocol using the Naming note up front: I saw #2122 also used "AIP" for a JSON-RPC sidecar / policy manifest proposal. The mechanism I am referring to here is different: a DID- and token-based agent identity layer intended to compose with MCP authorization, not a client-side policy proxy. The gap described in this discussion seems to have three separable parts:
The current AIP draft tries to address those as a substrate rather than as a replacement for MCP OAuth:
That lets MCP keep the current OAuth model for client/server authorization while adding a composable agent identity layer: |
Beta Was this translation helpful? Give feedback.
-
|
Just submitted SEP-2672 for per-call passkey-verified approval on MCP tool calls: #2672 This proposal covers agent identity/delegation; mine covers “did the human approve this specific call with these specific arguments?” Both live in the same tools/call evidence space and compose with OAuth. Worth reviewers thinking about the layering. |
Beta Was this translation helpful? Give feedback.

Uh oh!
There was an error while loading. Please reload this page.
-
Problem
MCP has a robust authorization spec for the human-to-server relationship: OAuth 2.1 handles "which human authorized this client to access this server." This works well for the HTTP transport.
But there is no standard mechanism for agent-to-agent authorization in tool calls. When Agent A delegates a task to Agent B, and Agent B calls an MCP tool, the server has no way to answer:
This gap is especially acute for:
Today, MCP servers must fall back to API keys, environment variables, or custom headers. None of these support delegation, attenuation, or cryptographic verification.
Proposed Extension
Add an optional
authfield toparams._metaontools/callrequests:{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "search_contacts", "arguments": { "query": "Alice Smith" }, "_meta": { "auth": { "type": "delegation-proof", "version": "1", "invoker_did": "did:agent:4a1b2c3d...", "invoker_public_key": "a1b2c3d4e5f6...", "proof": "<base64-encoded invocation proof>" } } } }Design principles:
_meta.auth. Servers choose whether to require, accept, or ignore it._metais already part of the spec. Servers that don't understandauthignore it. Clients that don't support it send calls without it.How It Works
Setup (one-time)
A human or organization creates a root authority (Ed25519 keypair) and delegates to agents with constraints:
Each delegation is signed by the issuer. Caveats (action scope, expiry, cost limits, resource patterns) accumulate and can only narrow - never widen.
Per-call flow
params._meta.authServer verification (5 lines)
TypeScript:
Python:
Rust:
Caveat Types
Delegation proofs support constraints that are checked at verification time:
action_scope["search", "resolve"]expires_at"2026-04-01T00:00:00Z"max_cost5.0resource"entity:customer:*"context{"session_id": "abc"}custom{"org": "acme"}Caveats accumulate through the chain. A sub-agent inherits all parent caveats plus any additional restrictions. This means delegation can only narrow authority, never widen it.
Security Properties
did:agent:identifiers. No central registry required.is_revoked(delegation_hash) -> bool. Implementations can plug in any revocation backend.costwhenmax_costcaveat is present) result in rejection, not silent bypass.What This Does NOT Do
did:agent:but the proof format is DID-method-agnostic._metafield. No protocol-level changes needed.Reference Implementation
An MIT-licensed library implementing this proposal is available in three languages:
All three produce byte-identical proofs and can cross-verify (sign in Python, verify in Rust).
Source: github.com/kanoniv/agent-auth
Related Discussions
Beta Was this translation helpful? Give feedback.
All reactions