Internet-Draft Mission Capability Binding August 2026
McGuinness Expires 23 February 2027 [Page]
Workgroup:
Network Working Group
Internet-Draft:
draft-mcguinness-mission-capability-binding-latest
Published:
Intended Status:
Standards Track
Expires:
Author:
K. McGuinness
Independent

Mission Capability Binding

Abstract

Mission-Bound Runtime Enforcement: AuthZEN Profile [I-D.draft-mcguinness-mission-authzen] carries the decision request that permits a consequential action against a Mission's approved authority. For an action sourced from a discovered catalog (the MCP Registry, [MCP-REGISTRY], is one example catalog source; its contents are discovery metadata, never authority for a server's effective capabilities), an MCP tool, an OpenAPI operation, or an equivalent capability source, the invoked identity can drift from what the catalog served at approval. This document defines the companion binding that ties an approved catalog entry to the capability source it was derived from: the tool_id, source, and content digest recorded at derivation and verified at decision time, the per-capability extraction rule that computes the digest, the capability_drift denial reason as a coordinated extension of the AuthZEN binding's runtime denial classification, and the mapping onto the OpenID AuthZEN Profile for Model Context Protocol Tool Authorization (COAZ) for MCP deployments.

About This Document

This note is to be removed before publishing as an RFC.

The latest revision of this draft can be found at https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-capability-binding.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-mcguinness-mission-capability-binding/.

Source for this draft and an issue tracker can be found at https://github.com/mcguinness/mission-bound-authorization.

Status of This Memo

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 23 February 2027.

Table of Contents

1. Introduction

An agent's approved authority can name a capability, an MCP tool, an OpenAPI operation, or a catalog entry, rather than a fixed action name. The catalog a Mission was approved against is not immutable: a tool's definition can change, a catalog can be revised, or an invoked identity can drift from the one the approval bound. Without a binding back to the capability source, a Policy Decision Point (PDP) enforcing the runtime profile's decision contract [I-D.draft-mcguinness-mission-runtime] has no way to tell a stable capability from one that has silently mutated underneath the approval.

This document is a companion to Mission-Bound Runtime Enforcement: AuthZEN Profile [I-D.draft-mcguinness-mission-authzen] (the "AuthZEN binding"). It defines the capability-source binding a validating server records at derivation and a Policy Enforcement Point (PEP) presents at decision time in context.capability_source of the OpenID AuthZEN Authorization API [AUTHZEN] request the AuthZEN binding shapes: a stable tool_id, the discovery source_uri, a source_digest over the capability's extracted definition, and an operation_ref. It defines the per-capability extraction rule that computes source_digest, the decision-time verification a PDP performs, the capability_drift denial reason this document registers as a coordinated extension of the AuthZEN binding's runtime denial classification, and the mapping onto the AuthZEN Profile for Model Context Protocol Tool Authorization (COAZ) [COAZ] for MCP deployments.

This document rides the AuthZEN binding's request as context.capability_source and the runtime profile's capability identity requirement; it defines no drift rule of its own, since that requirement is the runtime profile's ([I-D.draft-mcguinness-mission-runtime]). A deployment that does not claim this companion is unaffected: the AuthZEN binding's decision contract consumes an already established action identity.

2. Conventions and Terminology

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.

This document uses JSON [RFC8259] as the data model for the capability-source binding object. JCS canonicalization [RFC8785] applies wherever this document computes a digest, under the substrate's default commitment construction ([I-D.draft-mcguinness-mission-substrate]); this document does not define a second canonicalization.

"SHA-256" refers to [RFC6234]. A digest is encoded in the encoded form of the substrate's default commitment construction ([I-D.draft-mcguinness-mission-substrate]): sha-256: followed by the base64url, no-padding encoding of the digest. Under the substrate's default commitment construction, which this document imports normatively ([I-D.draft-mcguinness-mission-substrate]), source_digest is a canonical-object digest and catalog_digest a raw-octet digest over the exact retrieved representation.

The terms Policy Enforcement Point (PEP), Policy Decision Point (PDP), consequential action, and Executor are used as defined in [I-D.draft-mcguinness-mission-runtime]. The AuthZEN request and response envelope, the context object, and the runtime denial classification are used as defined in [I-D.draft-mcguinness-mission-authzen].

Validating server:

The component that, at derivation, validates the Mission's authority and records the derivation-time facts a PDP later checks, such as a capability source_digest (Section 4). In the issuance profile this is the Mission Issuer; this document uses the term where the recording role is what matters.

3. Capability Source Context

For catalog-sourced actions, the PEP supplies the capability-source binding in context.capability_source using the object defined in Section 4. For non-catalog actions, this member is absent.

4. Capability Source Binding

Consequential actions an agent discovers at runtime, through a Model Context Protocol tool catalog, an OpenAPI document, a Protected Resource Metadata-linked catalog, or an equivalent capability source, identify the source they came from, so a Mission's approved authority stays bound to concrete tools rather than to bare action names a later catalog revision could redefine. The runtime profile assigns capability identity to the approved actions and refuses an invoked identity outside them ([I-D.draft-mcguinness-mission-runtime]); this document gives the concrete binding an AuthZEN deployment presents for catalog-sourced actions.

For MCP tools, this binding composes with the AuthZEN MCP profile's COAZ mapping [COAZ]. COAZ maps MCP tool definitions and invocation parameters into the AuthZEN Subject-Action-Resource-Context model; this document adds Mission governance, source binding, Mission evidence, and runtime metering. A Mission-governed MCP deployment MAY use COAZ to construct the AuthZEN subject, resource, action, and parameter-bearing context members, but the Mission-specific context.mission, context.actor, freshness, permit binding, and evidence requirements of the AuthZEN binding ([I-D.draft-mcguinness-mission-authzen]) still apply.

The minimum binding, committed by the validating server at derivation and presented by the executing component at request time in context.capability_source, is:

{
  "tool_id": "mcp://docs.example.com/tools/write_document",
  "source_uri": "https://docs.example.com/.well-known/mcp",
  "source_digest":
    "sha-256:OAbEIh2DTYUVP7DjRhHct4aapsT8PybZq2ILdut9UP0",
  "operation_ref": "tools/write_document"
}
tool_id:

A string. A stable capability identifier the executing component asserts the action invokes.

source_uri:

A string. The discovery source the capability was resolved from.

source_digest:

A string. The integrity-anchor encoded form ([I-D.draft-mcguinness-oauth-mission]) over the capability's extracted definition (Section 4.2), recorded at derivation time. At request time it is computed over the current extracted definition, so the PDP's comparison detects a mutated definition.

operation_ref:

A string. The source-format-specific operation reference (MCP tool name, OpenAPI operationId, or equivalent).

catalog_digest:

OPTIONAL. A string. The integrity-anchor encoded form over the exact retrieved source representation, recorded at derivation time. Its semantics are strictly stricter than source_digest: when recorded, any change to the retrieved source refuses, whether or not it touches the capability. A deployment records it where the whole catalog is the trust unit.

executor:

OPTIONAL. A string. An identifier for the executing component that serves the capability at request time (for example, an MCP server instance), asserted by the PEP that authenticates it. It is a request-time fact, not part of the derived authority recorded at derivation, and is recorded in Decision Evidence when present; it is never an input to the source_digest or catalog_digest comparison. Where the executing component authenticates under an attested-instance profile ([I-D.draft-mcguinness-oauth-client-instance-assertion], [I-D.draft-mcguinness-oauth-ai-agent-instance]), the deployment SHOULD carry the attested instance identifier here rather than a self-chosen label.

Rules:

4.1. Decision-Time Verification

For a catalog-sourced action whose approved entry recorded a capability source binding at derivation, the PDP MUST verify, as part of its decision, that context.capability_source is present and matches the approved binding: the presented source_digest, computed over the capability's current extracted definition (Section 4.2), MUST equal the recorded value, and, where a catalog_digest was recorded, the presented catalog_digest MUST equal it likewise; otherwise the PDP returns capability_drift (Section 4.3). Whether an action is catalog-sourced, and which digests were recorded, are determined from the materialized policy view the AuthZEN binding defines ([I-D.draft-mcguinness-mission-authzen]), not from the PEP's request; where no source binding was recorded, this check does not apply.

4.2. Per-Capability Extraction

source_digest is computed over the extracted per-capability definition, not the whole retrieved source, so a revision elsewhere in a shared catalog does not invalidate a Mission's approved capabilities, while any mutation of an approved capability's own definition still refuses. The extraction rule is fixed per source format:

  • For an MCP tool catalog, the extracted definition is the single tool's definition object as retrieved (the member of the catalog's tool list whose name is the capability's), JCS-canonicalized [RFC8785].

  • For an OpenAPI document, the extracted definition is an object with two members: operation, the operation object operation_ref identifies, and components, an object carrying, under their component names, the components of the document the operation references by name, directly or transitively. The assembled object is JCS-canonicalized.

  • For another source format, the binding profile in use defines the extraction rule. A capability whose format has no defined extraction rule cannot carry a source_digest; the whole-source catalog_digest remains available for it.

For the MCP tool of the minimum binding above, the extracted definition is the tool's definition object:

{
  "name": "write_document",
  "description": "Create or update a document",
  "inputSchema": {
    "type": "object",
    "properties": {
      "path": { "type": "string" },
      "content": { "type": "string" }
    },
    "required": ["path", "content"]
  }
}

The JCS canonical bytes are a single line with sorted member names and no whitespace, shown here wrapped for layout only; remove the layout line breaks, adding no characters, to recover the canonical form:

{"description":"Create or update a document","inputSchema":{"propert
ies":{"content":{"type":"string"},"path":{"type":"string"}},"require
d":["path","content"],"type":"object"},"name":"write_document"}
source_digest = sha-256:OAbEIh2DTYUVP7DjRhHct4aapsT8PybZq2ILdut9UP0

Adding, removing, or renaming another tool in the same catalog leaves this value unchanged; any byte change to this definition changes it.

Cross-format canonicalization, signed capability manifests, and media-type negotiation across catalog formats are out of scope ([I-D.draft-mcguinness-mission-runtime]); this document requires only the stable identifier plus source evidence above.

4.3. Capability Drift Denial Reason

This document registers capability_drift as a coordinated extension to the runtime denial classification, under the AuthZEN binding's extensibility rule ([I-D.draft-mcguinness-mission-authzen]): an extension value MUST be either a collision-resistant name (following the Collision-Resistant Name guidance of [RFC7519] Section 4.2) or a name coordinated within the Mission-Bound Authorization document family; capability_drift is the name this document reserves.

capability_drift:

for a catalog-sourced action whose approved entry recorded a capability source binding (Section 4), the digest of the action's current extracted capability definition differs from the source_digest committed at derivation, a recorded catalog_digest no longer matches the retrieved source, or the presented tool_id is outside the approved set.

capability_drift applies only when a source binding was recorded and the digest comparison ran; an invoked identity outside the approved set for which no source binding was recorded is out_of_authority ([I-D.draft-mcguinness-mission-authzen]), not capability_drift.

Capability or catalog drift, and an invoked identity outside the approved set when a source binding was recorded, surface as a PDP denial carrying capability_drift, under the carrier taxonomy of the AuthZEN binding ([I-D.draft-mcguinness-mission-authzen]).

5. Conformance

A deployment claims Mission Capability Binding only for the catalog-sourced actions within the runtime enforcement scope it documents ([I-D.draft-mcguinness-mission-runtime]), under the AuthZEN decision-API binding ([I-D.draft-mcguinness-mission-authzen]).

A validating server conforming to this document MUST record tool_id, source_uri, source_digest, operation_ref, and any catalog_digest for every consequential action sourced from a discovered catalog, at derivation (Section 4).

A PEP conforming to this document MUST present context.capability_source on a consequential request for a catalog-sourced action (Section 3).

A PDP conforming to this document MUST verify the presented binding against the recorded one and return capability_drift on a mismatch (Section 4.1, Section 4.3).

A deployment that does not claim this document is unaffected: the AuthZEN binding's decision contract consumes an already established action identity ([I-D.draft-mcguinness-mission-authzen]).

6. Security Considerations

The runtime profile's Security Considerations ([I-D.draft-mcguinness-mission-runtime]) and the AuthZEN binding's ([I-D.draft-mcguinness-mission-authzen]) apply in full. This section addresses only threats specific to capability-source binding.

6.1. Catalog compromise and stale digests

A validating server that records source_digest over stale or attacker-influenced source data commits to the wrong capability from the start; this document detects drift after derivation, not a poisoned derivation. Where the catalog itself is not trusted, a deployment SHOULD additionally record catalog_digest and constrain source_uri to a trusted, authenticated origin.

6.2. Executor identity is not a security boundary

The executor member is a request-time fact the PEP asserts after authenticating the serving component; it is never an input to source_digest or catalog_digest, so a spoofed executor cannot mask or forge a drift check. Resource policy, not this document, bounds which executors are trusted (Section 4).

7. Privacy Considerations

The runtime profile's evidence-privacy guidance ([I-D.draft-mcguinness-mission-runtime]) applies in full. source_uri, tool_id, and executor, when recorded in Decision Evidence ([I-D.draft-mcguinness-mission-runtime-evidence]), MAY reveal internal catalog topology; this document defines no additional record content and no exemption from that guidance.

8. IANA Considerations

This document requests no IANA actions. The context.capability_source member this document adds to the AuthZEN request context object ([I-D.draft-mcguinness-mission-authzen]) is AuthZEN extension data and is not registered in an IETF registry. The capability_drift denial-reason value is a specification-coordinated extension of the runtime denial classification ([I-D.draft-mcguinness-mission-authzen]), not an IANA-registered value.

9. References

9.1. Normative References

[AUTHZEN]
OpenID Foundation, "OpenID AuthZEN Authorization API 1.0", , <https://openid.net/specs/authorization-api-1_0-final.html>.
[I-D.draft-mcguinness-mission-authzen]
McGuinness, K., "Mission-Bound Runtime Enforcement: AuthZEN Profile", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-authzen.html>.
[I-D.draft-mcguinness-mission-runtime]
McGuinness, K., "Mission-Bound Runtime Enforcement", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-runtime.html>.
[I-D.draft-mcguinness-mission-substrate]
McGuinness, K., "Mission Substrate Requirements", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-substrate.html>.
[I-D.draft-mcguinness-oauth-mission]
McGuinness, K., "Mission-Bound Authorization for OAuth 2.0", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-oauth-mission.html>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC6234]
Eastlake 3rd, D. and T. Hansen, "US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)", RFC 6234, DOI 10.17487/RFC6234, , <https://www.rfc-editor.org/rfc/rfc6234>.
[RFC7519]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token (JWT)", RFC 7519, DOI 10.17487/RFC7519, , <https://www.rfc-editor.org/rfc/rfc7519>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[RFC8259]
Bray, T., Ed., "The JavaScript Object Notation (JSON) Data Interchange Format", STD 90, RFC 8259, DOI 10.17487/RFC8259, , <https://www.rfc-editor.org/rfc/rfc8259>.
[RFC8785]
Rundgren, A., Jordan, B., and S. Erdtman, "JSON Canonicalization Scheme (JCS)", RFC 8785, DOI 10.17487/RFC8785, , <https://www.rfc-editor.org/rfc/rfc8785>.

9.2. Informative References

[COAZ]
OpenID Foundation, "AuthZEN Profile for Model Context Protocol Tool Authorization - Draft 1", , <https://openid.github.io/authzen/authzen-mcp-profile-1_0.html>.
[I-D.draft-mcguinness-mission-runtime-evidence]
McGuinness, K., "Mission Runtime Evidence", , <https://mcguinness.github.io/mission-bound-authorization/draft-mcguinness-mission-runtime-evidence.html>.
[I-D.draft-mcguinness-oauth-ai-agent-instance]
McGuinness, K., "OAuth 2.0 AI Agent Instance Profile", Work in Progress, Internet-Draft, draft-mcguinness-oauth-ai-agent-instance-00, , <https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-ai-agent-instance-00>.
[I-D.draft-mcguinness-oauth-client-instance-assertion]
McGuinness, K., "OAuth 2.0 Client Instance Assertion", Work in Progress, Internet-Draft, draft-mcguinness-oauth-client-instance-assertion-01, , <https://datatracker.ietf.org/doc/html/draft-mcguinness-oauth-client-instance-assertion-01>.
[MCP-REGISTRY]
Model Context Protocol Project, "The MCP Registry", , <https://modelcontextprotocol.io/registry/about>.

Acknowledgments

This document extracts the capability-source binding from Mission-Bound Runtime Enforcement: AuthZEN Profile and builds on the OpenID AuthZEN Profile for Model Context Protocol Tool Authorization. The author thanks the OpenID AuthZEN community and the Mission-Bound Authorization implementer community for feedback.

Author's Address

Karl McGuinness
Independent