| Internet-Draft | AIP | August 2026 |
| Prakash | Expires 20 February 2027 | [Page] |
This document specifies the Agent Identity Protocol (AIP), a protocol for verifiable, delegable identity for AI agent systems. AIP introduces Invocation-Bound Capability Tokens (IBCTs) that bind identity, authorization, scope constraints, and provenance into a single cryptographic artifact. Two token modes are defined: a compact mode using JSON Web Tokens (JWT) with Ed25519 signatures for single-hop interactions, and a chained mode using Biscuit tokens with append-only blocks and Datalog policy evaluation for multi-hop delegation chains. Protocol bindings are specified for the Model Context Protocol (MCP), Agent-to-Agent Protocol (A2A), and generic HTTP APIs. The protocol addresses authentication gaps in current AI agent infrastructure where a survey of approximately 2,000 MCP servers found all lacked authentication. This revision specifies a normative verification algorithm, defines the canonical policy encoding for chained mode, describes how AIP composes with workload identity systems such as SPIFFE, and maps AIP against the cross-organization delegation requirements enumerated in [I-D.reece-wimse-cross-org-delegation].¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 20 February 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document.¶
AI agent systems are increasingly deployed in multi-agent architectures where an orchestrator decomposes tasks and delegates subtasks to specialist agents. The protocols enabling this communication, notably the Model Context Protocol (MCP) and the Agent-to-Agent Protocol (A2A), solve the connectivity problem but do not solve the identity problem.¶
MCP provides no built-in authentication layer. A2A uses self-declared identities with no attestation mechanism. OAuth 2.1, recently added to MCP, covers single-hop client-to-server authentication but does not address multi-hop delegation chains. When an orchestrator delegates to a specialist that calls a tool, the delegation chain that led to the tool invocation is lost.¶
AIP fills this gap by introducing Invocation-Bound Capability Tokens (IBCTs) that answer four questions for every agent action: who authorized this action, through which delegation chain, with what constraints at each hop, and what was the outcome.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
AIP defines two identifier schemes for agent identity:¶
DNS-based identifiers follow the format:¶
aip:web:<domain>/<path>¶
Example: aip:web:example.com/agents/research-analyst¶
DNS-based identifiers are suitable for long-lived agents with stable domain ownership. Identity documents are resolved via HTTPS at a well-known path.¶
aip:key:ed25519:<multibase-encoded-public-key>¶
Self-certifying identifiers derive identity from the public key itself. They are suitable for ephemeral agents that do not require DNS infrastructure. The identifier is deterministically computed from the Ed25519 public key using multibase encoding.¶
Each agent with a DNS-based identifier MUST publish an identity document at:¶
https://<domain>/.well-known/aip/<path>.json¶
The identity document is a JSON object containing:¶
aip: Protocol version (MUST be "1.0")¶
id: The agent's AIP identifier¶
public_keys: Array of public key objects with validity windows¶
name: Human-readable agent name¶
delegation: Delegation preferences¶
protocols: Supported protocol bindings¶
document_signature: Ed25519 signature over the canonicalized document¶
expires: Document expiration timestamp¶
The document MUST be self-signed. Verification uses JSON Canonicalization Scheme (JCS) [RFC8785]: remove the document_signature field, canonicalize the remaining JSON, and verify the Ed25519 signature against a currently-valid public key.¶
AIP defines two token modes that share a common identity scheme but differ in delegation capability.¶
Compact mode tokens are JSON Web Tokens [RFC7519] signed with Ed25519 (EdDSA). They support single-hop interactions only.¶
Header:¶
{"alg": "EdDSA", "typ": "aip+jwt"}
¶
Claims:¶
iss: Issuer AIP identifier (REQUIRED)¶
sub: Subject/holder AIP identifier (REQUIRED)¶
scope: Array of authorized capabilities (REQUIRED)¶
budget_usd: Authorization budget ceiling in USD (REQUIRED)¶
max_depth: Maximum delegation depth, 0 for no further delegation (REQUIRED)¶
iat: Issued-at timestamp (REQUIRED)¶
exp: Expiration timestamp (REQUIRED)¶
Token lifetime SHOULD be less than one hour. Both iss and sub MUST be valid AIP identifiers.¶
Chained mode tokens use Biscuit [BISCUIT] tokens with append-only blocks and Datalog policy evaluation. They support multi-hop delegation with cryptographic scope attenuation.¶
A chained token consists of ordered blocks:¶
Scope attenuation is a fundamental security property of AIP. At each delegation step, scope can only narrow or remain equal, never widen. This applies across four dimensions:¶
Verifiers MUST check attenuation at every hop in the delegation chain. A wildcard (*) in the parent permits any specific value in the child, but a specific value in the parent MUST NOT widen to a wildcard in the child.¶
Chained mode tokens support three policy profiles of increasing expressiveness:¶
Interoperability of chained mode depends on every implementation emitting the same Datalog for the same authorization intent. Two encodings that are individually defensible will not verify against each other. Implementations of the Simple profile MUST emit exactly the forms below.¶
The authority block (block 0) MUST contain:¶
identity("<aip-identifier>");
principal("<identifier>"); ; OPTIONAL, on-behalf-of party
right("<scope>"); ; one fact per granted scope
max_depth(<n>);
budget_ceiling(<cents>); ; OPTIONAL, integer cents
check if tool($t), ["<scope>", ...].contains($t);
check if time($t), $t <= <expiry>;
¶
Each delegation block (blocks 1 through N) MUST contain:¶
delegator("<aip-identifier>");
delegate("<aip-identifier>");
context("<non-empty string>");
budget_ceiling(<cents>); ; OPTIONAL, integer cents
check if tool($t), ["<scope>", ...].contains($t);
check if time($t), $t <= <expiry>; ; OPTIONAL, <= parent expiry
¶
Scope narrowing follows from conjunction: because every block
contributes a check if tool($t) constraint and all checks in
all blocks MUST pass, the set of authorized tools is the intersection
of the per-block allowlists. A delegation block cannot widen scope,
because naming a tool absent from an ancestor's allowlist produces an
empty intersection and authorizes nothing.¶
Budget is carried as a fact rather than a check. A Datalog check of
the form check if budget($b), $b <= N binds to whatever
budget facts are in scope during evaluation, which is not the same
question as whether this block's ceiling narrows its parent's.
Encoding budget as a check therefore either rejects valid chains or,
if the verifier supplies a satisfying ambient fact, passes
unconditionally. Budget attenuation is verified structurally instead,
in step V4 of Section 4.¶
Implementations MUST NOT emit a check statement over
budget, and verifiers MUST NOT inject an ambient
budget fact during policy evaluation.¶
Budget values in AIP tokens represent per-token authorization ceilings, NOT running balances. A delegator asserts "I authorize up to $X for this task" at delegation time.¶
A budget ceiling is both declared and verified, and the two are distinct operations:¶
budget_ceiling fact in the block that
establishes it, in integer cents.¶
What the token does NOT do is track cumulative spending. Nothing in a delegation chain records how much of a ceiling has been consumed, and a verifier evaluating a single request cannot know. Enforcement of actual spend against a ceiling is out of band, and is the responsibility of the orchestration platform at dispatch time. Completion blocks record actual cost_usd for audit purposes, which supports after-the-fact reconciliation but is not an authorization control.¶
Implementations MUST NOT present ceiling verification as spend enforcement. A chain that verifies establishes that no hop authorized more than it held. It does not establish that the authorized amount remains available.¶
This section is normative. A verifier presented with an AIP token MUST perform steps V1 through V7 in the order given before treating any identity or capability asserted by the token as established. The ordering matters: no step that reads block content is permitted before chain integrity is established in V1.¶
The verifier MUST deserialize the token from its wire form and verify the signature on every block against the root public key. In chained mode this means verifying the full signature chain from block 0 through block N, not the signature on the presented leaf alone.¶
Verification MUST be performed against the serialized form as received. An implementation that holds a token in a parsed in-memory representation MUST re-serialize and re-verify before relying on it, rather than trusting the state of its own parsed object.¶
A verifier MUST NOT accept any fact, check, or claim from a block
that it has not verified as part of a chain rooted at the issuer's
key. Failure returns aip_signature_invalid.¶
The verifier MUST extract the issuer from the identity
fact in block 0 and confirm that the root public key used in V1 is the
key bound to that identifier:¶
aip:web: identifiers, by resolving the identity
document as specified in Section 2.3 and
comparing the published key.¶
aip:key: identifiers, by decoding the key from the
identifier itself and comparing.¶
An identifier that does not resolve, or that resolves to a
different key, returns aip_identity_unresolvable. A verifier
MUST NOT infer the root key from the token.¶
The verifier MUST confirm that the number of delegation blocks does
not exceed the max_depth declared in block 0. Failure returns
aip_depth_exceeded.¶
The verifier MUST walk the chain from block 1 to block N and confirm, for each block i, that every capability dimension is narrower than or equal to the corresponding dimension in block i-1:¶
aip_scope_insufficient.¶
budget_ceiling declared in block i MUST be
non-negative and MUST NOT exceed the ceiling declared by the nearest
ancestor that declares one. Failure returns
aip_budget_exceeded.¶
aip_token_expired.¶
aip_scope_insufficient.¶
principal, no
subsequent block may declare a different one. The on-behalf-of
principal is invariant along a chain: intermediaries narrow
authority, they do not substitute the party on whose behalf the
chain acts. Failure returns aip_token_malformed.¶
A dimension absent from block i inherits the value of its nearest ancestor. A wildcard in an ancestor permits any specific value in a descendant. A specific value in an ancestor MUST NOT widen to a wildcard in a descendant.¶
This step is REQUIRED and is not satisfied by the container format. A verifier MUST NOT rely on the semantics of an append-only token container to establish attenuation. Container-level signature chaining establishes that blocks were appended in order by successive keyholders, which is a different property: it prevents a block from being substituted, reordered, or forged, but it does not establish that the capabilities asserted in block i are a subset of those held by block i-1. Attenuation is a property of the capability content and MUST be checked as such, in addition to V1.¶
Every delegation block MUST carry a non-empty context
fact. A verifier MUST reject a chain in which any delegation block
omits it or supplies an empty value, returning
aip_token_malformed.¶
The verifier MUST evaluate the token's policies with the ambient
facts tool, time, and depth bound to the
request under consideration, and MUST require that every check in
every block passes.¶
The verifier MUST NOT introduce ambient facts beyond those named
above. In particular it MUST NOT supply a budget fact:
supplying one causes any budget check in the chain to evaluate against
verifier-chosen data rather than against the token, which makes the
check meaningless. Budget is handled in V4.¶
Failure returns aip_scope_insufficient.¶
If the issuer's identity document advertises a revocation endpoint,
the verifier MUST check whether any key in the chain has been revoked.
Revocation data MAY be cached. A verifier MUST be configurable with a
maximum acceptable staleness for cached revocation data, and MUST fail
closed when its cached data is older than that bound, returning
aip_key_revoked rather than proceeding on stale information.¶
Revocation responses MUST be signed by the issuer so that their authenticity is verifiable without a trusted transport to the revocation endpoint.¶
A token that passes V1 through V7 establishes: the identity of the issuer, the identity of each delegator and delegate in the chain, the capabilities available at the leaf, and that no hop in the chain exceeded the authority of its predecessor. It does not establish that the presenting party is the party the leaf was issued to. See Section 5.3.¶
AIP answers a different question from a workload identity system, and the two compose rather than compete.¶
A workload identity system such as SPIFFE [SPIFFE], in the architecture described by [I-D.ietf-wimse-arch], answers "which workload is this?" It attests a running process against the platform it runs on and issues a credential that says so. Its trust boundary is the trust domain it administers, and it does not model authority passing between parties.¶
AIP answers "on whose authority is this being done, how far back, and can a party with no relationship to the origin verify it?" It carries delegation across hops and organizations, and it says nothing about whether the process presenting the token is the one the platform attested.¶
Block 0 of a chain is signed by the issuer's key. Three ways of establishing trust in that key are defined:¶
aip:web: identifier and
the key is published in an identity document resolved over HTTPS.
Trust derives from the Web PKI and DNS control.¶
aip:key: identifier
and the key is the identifier. Trust derives from whoever accepted
the identifier.¶
In workload-attested mode, an identity document MAY carry a
workload_identity member naming the credential that attests
the issuer key, for example a SPIFFE ID. A verifier that recognises
the naming authority MAY treat that attestation as the basis for
accepting the root key, in place of resolving the document over
HTTPS. A verifier that does not recognise it MUST fall back to the
DNS-anchored or self-certifying path, and MUST NOT treat an
unrecognised attestation as an endorsement.¶
This is the deployment shape most likely in practice: a workload identity system establishes that the orchestrator is what it claims to be inside its own trust domain, and AIP carries what that orchestrator was permitted to delegate onward, across boundaries the workload identity system does not span.¶
A common deployment pattern carries delegation by repeated token
exchange [RFC8693], in which each hop presents its
credential to an authorization server and receives a narrowed token
carrying an act claim naming the acting party.¶
The mechanisms differ in where verification happens. Token exchange places an authorization server on the path at each hop, and the relying party's assurance derives from trusting that server. An AIP chain is verified by the relying party directly from the token and the issuer's published key, with no synchronous call to the originating organization. The two are not exclusive: an exchanged token may serve as the credential that anchors block 0.¶
An AIP token as specified in this document is a bearer credential. Verification establishes what authority the chain conveys and that no hop exceeded its predecessor. It does not establish that the party presenting the token is the party the leaf was delegated to. A captured or relayed token is usable by whoever holds it, within the scope, time, and budget the chain permits.¶
Deployments requiring proof of possession MUST bind the token to a key at the transport or message layer. Mutual TLS, HTTP message signatures, and workload proof tokens [I-D.ietf-wimse-wpt] are all suitable. Specifying that binding is out of scope for this document, and is deliberately left to mechanisms already being standardized rather than duplicated here.¶
Implementations MUST NOT describe AIP verification as authenticating the presenter.¶
AIP tokens are transported in MCP via the X-AIP-Token HTTP header:¶
X-AIP-Token: <compact-or-chained-token>¶
For tokens exceeding 4KB, token-by-reference is supported:¶
X-AIP-Token-Ref: https://issuer/.well-known/aip/tokens/<id>¶
An MCP server extracts the token from the header, or fetches it from the reference URL, and then verifies it according to Section 4. On success it injects the verified identity into the request context, where the tool implementation MAY use it for authorization decisions, logging, or audit. The verification steps are not restated here; the algorithm is binding-independent, and an MCP server that verifies tokens differently from an A2A agent is a source of exactly the divergence this document exists to prevent.¶
Nine error codes are defined with appropriate HTTP status mappings: 401 for authentication failures (token_missing, token_malformed, signature_invalid, identity_unresolvable, token_expired, key_revoked) and 403 for authorization failures (scope_insufficient, budget_exceeded, depth_exceeded).¶
Servers declare AIP requirements via the require_aip field in their identity document's protocols.mcp configuration.¶
In A2A interactions, AIP tokens are transported in the metadata.aip_token field of task submissions. Agent cards are extended with an aip_identity object containing the agent's AIP identifier and document URL.¶
The A2A verification flow adds a sixth step: the calling agent appends a delegation block with attenuated scope before sending the task, and the receiving agent verifies that the final delegation block delegates to its own AIP identifier.¶
For generic HTTP APIs not using MCP or A2A, tokens are transported via the Authorization header with the AIP scheme:¶
Authorization: AIP <base64url-encoded-token>¶
Token-by-reference uses the X-AIP-Token-Ref header with a 5-second fetch timeout and SSRF protection (reject reference URLs outside expected domain patterns).¶
Block 0 declares max_depth (default: 3). Each delegation block increments effective depth by 1. If current depth equals max_depth, further delegation is forbidden. In compact mode, max_depth of 0 means the holder MUST NOT delegate further.¶
Each delegation block MUST include a non-empty context field containing a human-readable description of the delegation purpose. Verifiers MUST reject tokens with missing or empty context. This requirement ensures audit trail integrity.¶
For short-lived sub-agents, a parent agent generates an Ed25519 keypair, creates an aip:key: identifier, and appends a delegation block with scoped capabilities and a short TTL (5 minutes RECOMMENDED). The parent's identity document MAY set delegation.allow_ephemeral_grants to false to prevent this.¶
DNS-based identifiers support zero-downtime key rotation through overlapping validity windows on public keys. A new key is published with a future valid_from timestamp. Both keys are valid during the overlap period. Recommended rotation period is 90 days. Cache TTL MUST NOT exceed 5 minutes.¶
Self-certifying identifiers cannot rotate keys; key rotation requires identity replacement, which is acceptable for ephemeral agents.¶
AIP prefers short-lived tokens over revocation infrastructure. Compact mode tokens SHOULD have a TTL under 1 hour, making revocation generally unnecessary. For chained mode, key revocation (removing a key from the identity document) invalidates all tokens signed by that key. Token-specific revocation via Certificate Revocation Lists is deferred to v2.¶
A completion block is the final block in a chained token, signed by the executing agent. It contains:¶
status: REQUIRED. One of "completed", "failed", or "partial".¶
result_hash: REQUIRED. SHA-256 hash of the output in format "sha256:<hex>".¶
verification_status: REQUIRED. One of "self_reported", "tool_verified", "peer_verified", or "human_verified".¶
tokens_used: OPTIONAL. LLM tokens consumed.¶
cost_usd: OPTIONAL. Actual cost incurred.¶
duration_ms: OPTIONAL. Wall-clock execution time.¶
ldp_provenance_id: OPTIONAL. Back-link to LDP provenance record.¶
AIP defines three escalating trust levels for completion data:¶
A completed chained token with a completion block appended is a self-contained audit artifact. It answers five questions without requiring an external database: who authorized (Block 0), through whom (delegation blocks), what constraints (Datalog policies), what happened (completion block), and whether it was verified (verification_status). Audit tokens are tamper-evident, non-repudiable, and verifiable offline using public keys from identity documents.¶
This section addresses the security properties and threat model for AIP.¶
AIP is designed to resist the following attack categories:¶
Two of these deserve to be separated, because conflating them is a common source of error. Signature chaining (V1) prevents blocks from being forged, reordered, or substituted. Attenuation checking (V4) prevents a block from asserting more than its predecessor held. The first is a property of the container; the second is a property of the capability content. Neither implies the other, and a verifier that performs only the first will accept a chain in which a delegation widened its own authority. Both are REQUIRED.¶
Experimental evaluation across 600 adversarial attempts in six attack categories showed a 100% rejection rate. Two attack categories (delegation depth violation and audit evasion through empty context) are uniquely addressed by AIP's chained token structure and cannot be detected by standard JWT deployments. Details are reported in the companion paper [AIP-PAPER].¶
AIP v1 mandates Ed25519 exclusively. No algorithm negotiation is supported. This is a deliberate design choice to eliminate downgrade attacks and reduce implementation complexity. Future versions MAY introduce additional algorithms through the protocol version field.¶
Identity document resolution and token-by-reference fetching MUST use HTTPS. Implementations SHOULD enforce TLS 1.3 or later. Token-by-reference URLs MUST be validated against expected domain patterns to prevent SSRF attacks. Fetch timeout SHOULD be 5 seconds.¶
This document requests the following IANA registrations:¶
Registration of the "AIP" HTTP authentication scheme in the "HTTP Authentication Scheme Registry":¶
Registration of the "aip" well-known URI suffix in the "Well-Known URIs" registry:¶
Registration of the "aip+jwt" structured syntax suffix:¶
[I-D.reece-wimse-cross-org-delegation] enumerates nine requirements for delegation between organizations that share no operator, no runtime, and no bilateral agreement. This appendix maps AIP against them. Verdicts are stated conditionally where the mechanism depends on deployment choices, and gaps are named rather than argued around.¶
Other proposals address overlapping parts of the same problem, including [I-D.rampalli-pedigree]. The requirements themselves, rather than any one mechanism, are the useful common ground, and several of the gaps identified below are shared across proposals.¶
aip:web: issuer publishes its key at a location
derived from its own DNS name, and a relying party resolves it over
HTTPS with no prior arrangement. An aip:key: issuer needs no
resolution at all. Neither requires a federation relationship
established in advance of the interaction.¶
principal, and V4 requires that no
subsequent block declare a different one. A chain that omits the
principal conveys agent authority only and does not satisfy R5.¶
Summarising the gaps: AIP does not by itself prove possession (R4) or evaluate principal entitlements (R6). Both are shared with other proposals in this space and both are better solved by composition than by any one document.¶
budget_ceiling fact verified structurally in V4, and stated
plainly that ceiling verification is not spend enforcement. The
previous encoding could not express the intended comparison.¶
principal fact with an invariance rule,
addressing principal binding along a chain.¶
The Biscuit authorization token specification influenced the chained mode design. The MCP and A2A protocol teams provided the agent communication infrastructure that AIP extends.¶