Skip to content
UCP / commerce infrastructure for agents
Menu

Specification lab · Protocol

UCP capability negotiation, step by step

UCP does not assume that every platform and merchant supports the same feature set. They compute a compatible set for each interaction.

Editorial team · Updated : 2026-08-12 · Primary query : UCP capability negotiation

Capability negotiation is the mechanism that prevents a UCP participant from assuming unsupported features. A platform advertises its profile. The business resolves that profile, compares versions and computes the intersection between both capability sets. Extensions whose dependencies are absent are then removed.

Key takeaways

  • Discovery tells each party what the other claims to support.
  • Negotiation keeps only compatible protocol and capability versions.
  • Extensions cannot survive without at least one required parent.
  • Each response advertises only capabilities relevant to that operation.

What enters the negotiation?

Negotiation starts with two versioned profiles: one for the platform and one for the business. Each profile describes its current protocol version and available services, capabilities and payment handlers. The transport also carries the platform profile location so the business can resolve the caller’s declaration.

The input is not a marketing list. It is a machine-readable contract for the current request. A capability that exists in documentation but is absent from a profile is not active for that participant.

How is the common feature set calculated?

The UCP 2026-04-08 specification defines an intersection process. First, the business determines whether the platform’s protocol version is supported. It then keeps capability versions supported by both profiles. Finally, it prunes extensions that no longer have an eligible parent.

The safe mental model is:

platform capabilities

business capabilities

compatible versions

dependency pruning

active capabilities for this operation

This sequence matters. Pruning extensions before the version intersection can leave a feature attached to a parent that is not actually compatible.

Why can extension pruning repeat?

An extension can depend on another extension, which in turn depends on a root capability. Removing the root can invalidate the first extension and then invalidate the second. The specification therefore requires pruning to continue until no more capabilities are removed.

Test this with a synthetic chain in staging:

  1. Advertise a checkout root capability.
  2. Add a fulfillment extension that extends checkout.
  3. Add a custom extension that depends on fulfillment.
  4. Remove checkout from the platform profile.
  5. Verify that both dependent extensions disappear from the result.

This is a useful regression test because a single-pass filter can leave an invalid transitive dependency behind.

What belongs in each response?

The response should not echo every negotiated capability. It includes only capabilities relevant to the operation being returned. The current UCP overview associates checkout operations with the checkout root, cart operations with the cart root, and order events with the order root. Relevant extensions can accompany those roots.

This keeps a response precise. A cart response should not claim that order or checkout behavior was active simply because both parties support those features elsewhere.

How should failures be classified?

Discovery and negotiation failures are different operational events:

  • A discovery failure means a required profile could not be fetched or parsed.
  • A version failure means the advertised protocol version is not supported.
  • A capability failure means profiles are valid, but the required common feature set is empty or incompatible.

Do not collapse these into a generic server error. The caller needs to know whether to retry a fetch, switch version, remove an optional feature or continue through a human-facing URL.

A deterministic test matrix

Build tests from controlled profile pairs:

Scenario Expected result
Same protocol and capability versions Capability remains active
Supported older protocol version Version-specific profile is used
Unsupported protocol version version_unsupported outcome
Shared root, unsupported extension Root remains, extension is removed
Extension without parent Extension is removed
No compatible required capability Capability negotiation fails

Save both input profiles and the computed result. That evidence makes a failure reproducible without access to production logs.

Implementation rule

Keep negotiation in deterministic application code. A language model can help explain an error, but it should not decide whether two signed, versioned capability declarations are compatible. Protocol compatibility must produce the same result for the same inputs every time.

Primary sources and review date

Related implementation guides