Supported protocols

Every protocol, explained twice.

Agents reach the gateway over four transports — MCP, HTTP, A2A and ACP. Money moves over x402 or experimental MPP, and AP2 can additionally require proof that a human approved the purchase. Read each one in plain words or in full technical detail.

Every protocol is explained twice — technically and in plain words. Switch them all at once, or flip any block on its own.

At a glance

ProtocolLayerStatusPinned revisionWhere
MCPtransportSupported2026-07-28, 2025-11-25, @modelcontextprotocol/[email protected]/mcp
HTTPtransportSupportednative routes/api/resources/{id}/invoke
A2AtransportExperimentalv1.0.1, JSON-RPC/a2a
ACPcheckout transportExperimental2026-04-17/acp
x402paymentSupportedv2, exact, EVM and Solana; NEAR partialheaders or _payment
AP2authorizationExperimentalv0.2.0, Direct modeAgent-Authorization or _authorization
MPPpaymentExperimental[email protected]payments: [mpp]
ERC-8409signed quoteExperimentaldraft @0ee33230payments.x402.quote
UCP—Planned—no code ships

How they fit together

The whole picture

Think of the gateway as a shop front with several doors. HTTP, MCP, A2A and ACP are the doors — different ways for an agent to walk in and ask for something. Whichever door it uses, the same cashier handles the sale: x402 is how the agent pays, and AP2, when you ask for it, is the signed note proving a human approved the purchase. Your backend stays behind the counter and never has to learn any of these protocols.

text
  MCP        HTTP        A2A        ACP             agent transports
   │          │           │          │
   └──────────┴─────┬─────┴──────────┘
                    ▼
            ExecutionPipeline ──────────► your backend API
               │            │
               ▼            ▼
         AP2 mandate    x402 payment
        (who approved)  (who paid, how much, to whom)

MCP

Model Context ProtocolSupportedAgent transport2026-07-28 · 2025-11-25 · @modelcontextprotocol/[email protected]
What MCP does

MCP is the standard way AI assistants find and use tools. The gateway lists each of your endpoints as a tool, with its price written in the description, so the assistant knows what it costs before it asks. When it calls a paid tool, it first gets the bill instead of the result — it pays, then calls the same tool again with the payment attached.

In this gateway

Endpoint/mcp
TransportStreamable HTTP
Methodstools/list, tools/call
Payment proof_payment, _meta["x402/payment"] or _meta["org.paymentauth/credential"]
AP2 mandate_authorization
Buyer's receipt_meta["agent-commerce/delivery"]
Concurrency8 tool calls + a queue of 64, then GATEWAY_BUSY
Needs@modelcontextprotocol/server

The exchange

curl -s http://localhost:8080/mcp \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Not implemented

  • resources
  • prompts
  • sampling
  • completions
  • elicitation
  • roots
  • logging
  • notifications/tools/list_changed
  • tasks

Reference: MCP API · Example: Paid MCP tool


HTTP

Native resource routesSupportedAgent transport
What the HTTP surface does

The most ordinary way in: a normal web request. Anything that can call a URL — a script, a backend, an agent framework — can use your resources without learning an agent protocol. A free resource just answers. A paid one first answers “payment required” with the price, and the caller repeats the same request with the payment in a header.

In this gateway

InvokePOST /api/resources/{id}/invoke
DiscoveryGET /api/resources, GET /.well-known/agent-commerce
Payment proofPAYMENT-SIGNATURE (x402) or Authorization: Payment (MPP)
Settlement resultPAYMENT-RESPONSE; MPP adds Payment-Receipt
AP2 mandateAgent-Authorization
Authenticationnone — paid resources are protected by payment
Limits256 KB request body, 1 MB backend response

The exchange

POST /api/resources/market_report/invoke HTTP/1.1
content-type: application/json

{}
There is no rate limiting. A free resource is an unauthenticated proxy to your backend, so put quotas at your edge.

Reference: Invoke a resource


A2A

Agent2AgentExperimentalAgent transportv1.0.1 · JSONRPC · SendMessage
What A2A does

A2A is how agents work with other agents. The gateway introduces itself with a public business card — the Agent Card — listing what it can do; each of your resources is one “skill” on it. Another agent sends a single message naming the skill and the input, and gets back a finished task: either the result, or a bill to pay first. An agent that speaks the x402 extension can instead pay inside the same task.

In this gateway

Agent CardGET /.well-known/agent-card.json
EndpointPOST /a2a
VersionA2A-Version: 1.0 (header or query parameter)
Invocationone message, one data part { resource, input }
Payment / mandateinput._payment, input._authorization
x402 extensionA2A-Extensions: https://github.com/google-a2a/a2a-x402/v0.1
Outcomesterminal tasks, except unpaid x402 extension tasks stored across restarts until expiry; at 256 pending tasks, new purchases get GATEWAY_BUSY
Enableprotocols.a2a.enabled: true
Needsnothing installed — the A2A SDK is a test-only dependency

The exchange

SendMessagejson
{
  "jsonrpc": "2.0",
  "id": "1",
  "method": "SendMessage",
  "params": {
    "message": {
      "role": "ROLE_USER",
      "messageId": "msg-1",
      "parts": [
        {
          "data": {
            "resource": "market_report",
            "input": { "_payment": "<base64 x402 payload>" }
          },
          "mediaType": "application/json"
        }
      ]
    }
  }
}

Not implemented

  • SendStreamingMessage
  • GetTask
  • ListTasks
  • CancelTask
  • SubscribeToTask
  • push notifications
  • GetExtendedAgentCard
  • HTTP+JSON binding
  • gRPC binding
  • long-running task persistence
  • multi-turn continuation
  • A2A auth schemes

Reference: A2A API


ACP

Agentic Commerce ProtocolExperimentalCheckout transport2026-04-17 · REST
What ACP does

ACP is a standard checkout for agents: open a checkout, change it, look at it, complete the purchase or cancel it. The gateway speaks that standard to agents and passes each step to the checkout you already run. The buyer pays through your own checkout — the gateway does not take a second payment for these calls.

In this gateway

DiscoveryGET /.well-known/acp.json (public)
Checkout/acp/checkout_sessions…
AuthenticationAuthorization: Bearer
VersionAPI-Version: 2026-04-17
Idempotencystored answer on retry, 409 in flight, 422 on a different body
Servicescheckout
Enableprotocols.acp.enabled: true

The exchange

Create a checkout sessionbash
curl -s http://localhost:8080/acp/checkout_sessions \
  -H "Authorization: Bearer $ACP_BEARER_TOKEN" \
  -H "API-Version: 2026-04-17" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"line_items":[{"id":"item_123"}],"currency":"usd","capabilities":{}}'

Not implemented

  • carts
  • feed
  • orders
  • delegate_payment
  • delegate_authentication
  • ACP MCP binding
  • webhooks
  • client role
  • Signature verification
  • extensions
  • other API versions

Reference: ACP API · Example: ACP checkout


x402

HTTP 402 paymentsSupportedPayment railv2 · exact · EVM · Solana · NEAR
What x402 does

When an agent requests a paid resource, the gateway answers “402 Payment Required” with the amount, token and destination wallet. The agent signs a payment for those terms and retries with the proof. Funds move directly from the buyer to you; the gateway cannot redirect them. You can offer the same price on several networks, such as Base, Polygon and Solana, and the agent chooses one.

In this gateway

Networkslocal eip155:31337; Base Sepolia, Base, Ethereum, Polygon, Arbitrum One and Sepolia, Avalanche C-Chain; Solana and Solana Devnet; NEAR and NEAR Testnet (partial); EVM networks you declare (partial)
Offersone or several per resource (payments.x402.options, or a resource's own x402.accepts); the buyer pays one
AssetUSDC by default; configurable tokens such as MockUSDC on EVM (partial on built-in networks); USDC only on Solana and NEAR
Challenge402 + PAYMENT-REQUIRED (412 when a Permit2 allowance is missing), the MCP envelope, or the A2A task
ProofPAYMENT-SIGNATURE, _payment, MCP _meta["x402/payment"] or the A2A extension's x402.payment.payload
Facilitatorlocal (dev chain only) or remote with none / bearer / cdp auth
Custodynone — buyer pays payTo directly
Signed quotesexperimental ERC-8409 quotes on EVM offers; use a dedicated, unfunded signing key. /.well-known/agent-commerce publishes its issuer address. Off by default (payments.x402.quote)
Needs@x402/[email protected] @x402/[email protected] viem; Solana adds @x402/svm @solana/kit, NEAR @x402/near, cdp facilitator auth @coinbase/[email protected]

Where it has settled

RouteSupportPublic testnetMainnet
EIP-3009 on Base Sepolia and BaseSupportedBase Sepolia, x402.orgBase, PayAI
EIP-3009 on Ethereum, Polygon, Arbitrum One and Sepolia, Avalanche C-ChainSupportednot runnot run
Permit2 on the built-in EVM networksSupportedBase Sepolia, x402.orgBase, PayAI
EVM networks declared in configPartial--
Custom token on a built-in EVM networkPartialnot runnot run
SolanaSupporteddevnet, x402.orgmainnet, PayAI
NEARPartialtestnet, SDK facilitatormainnet, SDK facilitator

Every route also settles locally in the offline test suite. NEAR has not yet settled through a hosted facilitator, and a Permit2 buyer approves the Permit2 contract once, paying gas.

The exchange

 agent                      gateway                        facilitator / chain
   │ request, no proof        │                                  │
   ├─────────────────────────►│ price → PaymentRequirements      │
   │◄─────────────────────────┤ 402 + PAYMENT-REQUIRED           │
   │ sign EIP-3009:           │                                  │
   │ amount → payTo           │                                  │
   │ retry + proof            │                                  │
   ├─────────────────────────►│ verify, reserve replayKey        │
   │                          │ call merchant backend            │
   │                          ├─────────────────────────────────►│ transferWithAuthorization
   │                          │◄─────────────────────────────────┤ tx hash
   │◄─────────────────────────┤ result + PAYMENT-RESPONSE        │

Not implemented

  • Permit2 gas-sponsoring extensions
  • upto scheme
  • batch-settlement scheme
  • auth-capture scheme
  • x402 v1
  • multi-asset routing
  • dynamic pricing

Guides: Accept payments · Handle a payment · Networks & facilitators · Examples: Solana devnet · NEAR testnet · Multi-network mainnet


MPP

Machine Payments ProtocolExperimentalPayment rail[email protected] · charge · EVM · EIP-3009
What MPP does

MPP is a second way for an agent to pay, from the standard Tempo and Stripe published for machine payments. The shape is the one you already know from x402: the gateway names the price, the agent authorises exactly that amount to exactly your wallet, and the request goes through. Choose a rail for each resource. Both pay directly to a wallet you control, with the same pricing and receipts.

StatusExperimental, off by default
Pinned revisiondraft-httpauth-payment-01, [email protected], intent charge, evm, EIP-3009
CarriersHTTP headers; MCP _meta or _payment; A2A _payment
AssetsUSDC on Base Sepolia and Base; a local token on eip155:31337
SettlementThrough an x402 facilitator, to the merchant's own destination
Payment flowupfront by default: settles before the backend; authorization on request
Enablepayments.mpp.enabled: true, and mpp first among the resource's enabled rails
Needsmppx viem @x402/core @x402/evm

Guide: payments and rails


AP2

Agent Payments ProtocolExperimentalAuthorizationv0.2.0 · Direct mode · b4587ac
What AP2 does

AP2 answers a different question: did a person actually approve this purchase? Before the payment goes through, the agent shows a signed note from the buyer's side saying “yes — buy exactly this, at this price, from this shop”. The gateway checks the signature and that the note matches the purchase, and each note works only once. It never pays for anything by itself: the payment still has to happen.

In this gateway

CarrierAgent-Authorization (HTTP, ≤ 8192 bytes), _authorization (MCP, A2A)
Envelope{ "method": "ap2", "payload": "<SD-JWT>" }
Truststatic public keys; no JWKS, jku or x5u
Require itauthorization: { required: [ap2] }
Errors403 required / invalid, 409 replayed, 503 provider unavailable
Signing helpercreateCheckoutJwt (merchant side)
Needsjose @sd-jwt/core canonicalize

The exchange

{ "method": "ap2", "payload": "<the SD-JWT presentation>" }

Not implemented

  • autonomous mode
  • open mandates
  • Payment Mandates
  • constraint evaluation
  • cnf-bound keys
  • delegation chains and KB-JWTs
  • OpenID4VP delegation
  • JWKS / jku / x5u
  • algorithms other than ES256
  • mandate issuance
  • Checkout Receipts
  • AP2 over ACP

Guide: AP2 mandates


Planned: UCP

Universal Commerce ProtocolPlannedRoadmap

UCP is on the roadmap and does not ship in this release. “Planned” means exactly that: no partial adapter, no endpoint and no diagnostic pretending otherwise — expose: [ucp] fails config validation. New transports land only after the adapter model survives real use.


Status and versions

StatusMeaning
SupportedShips, is the stable surface of this release, and is covered end to end by the test suite.
ExperimentalShips, is tested against the protocol's own official artifacts, serves a narrow named subset — and is off by default.
PlannedNo code ships.

Every adapter reports its supportedSpec, capabilities, unsupported list and status at runtime. If this page and the gateway ever disagree, the gateway is the truth.

curl -s http://localhost:8080/.well-known/agent-commerce

Next on the roadmap

A doctor GitHub Action · UCP · autonomous-mode AP2 (open mandates, agent key binding, constraint evaluation) · more of ACP (carts, feed, delegated payment) · Shopify and WooCommerce examples · PostgreSQL · richer observability · multi-file and remote OpenAPI sources.