Agentic payments (x402)
This page describes how an AI agent pays for a monetized FlowCP tool. It is the consumer-side counterpart to the builder guide Monetize your MCP server.
FlowCP implements the x402 protocol: a paid resource responds with the payment requirements, the client pays and retries with a signed proof, and the server settles the payment before serving the result. Because MCP tool calls ride JSON-RPC (not a plain HTTP GET), FlowCP carries the x402 exchange inside the tool call rather than as a raw HTTP 402.
The flow
1. Discover the price
Call the built-in get_pricing tool. It returns everything the server charges in one read-only call, so you can budget a sequence of calls before committing to any of them:
{
"scheme": "x402",
"network": "base-sepolia",
"payTo": "0x…",
"paidTools": [
{
"name": "create_invoice",
"description": "Create an invoice",
"category": "Billing",
"price": "10000",
"asset": "USDC",
"priceUsd": "0.01"
}
],
"freeToolCount": 14,
"truncated": false,
"paymentField": "_payment",
"requirementsMetaKey": "com.flowcp/x402"
}price is in atomic token units (e.g. 10000 = 0.01 USDC at 6 decimals). priceUsd is a convenience rendering, and is null when the asset is not a USD-pegged stablecoin we recognize — in that case use price and asset.
Notes:
get_pricingexists only on a server that actually charges. If the tool is absent, every tool on that server is free. It is itself always free to call.Anything it does not list is free. Free tools are reported as a
freeToolCount, not enumerated — usetools/listfor those.Pass
categoryortoolNameto narrow the result. Iftruncatedistrue, the list was capped and you should filter to see the rest.A server whose own API already has a tool named
get_pricingkeeps its own; the built-in is skipped rather than shadowing it. In that case fall back to the per-tool metadata below.
Each paid tool also advertises its own price in its MCP tool metadata under com.flowcp/payment — useful when your client surfaces _meta, and the fallback when get_pricing is unavailable:
On a large server using dynamic tool exposure, tools are not registered until search_tools activates them — so they have no metadata to read yet. search_tools results carry price and asset for exactly this reason (null on a free tool), and get_pricing works regardless of exposure mode.
2. Call once, get the requirements
Call the tool normally. If you haven't attached a payment, the tool returns an error result whose _meta carries the full x402 requirements under com.flowcp/x402:
3. Pay and retry
Construct a signed payment that satisfies accepts[0] and call the tool again with the proof in the reserved _payment field:
FlowCP verifies the proof with its payment facilitator, settles it, and then runs the tool and returns the normal result.
Rules to code against
Pay before you get the result. The tool does not run until payment is verified and settled. Treat the first (unpaid) call as a price quote.
One nonce, one call. Each
noncesettles at most once. Re-sending the same proof is rejected (PAYMENT_REQUIRED— "payment proof already used"). Use a fresh payment for every call.Cover the price.
_payment.amountmust be ≥maxAmountRequired, and theasset,network, andpayTomust match the requirement, or the call is rejected.Fail closed. A missing/invalid proof, an underpayment, or a facilitator error all reject the call — nothing runs and nothing is charged.
Resource reads can charge too. An endpoint resource is backed by a tool. If that tool is priced, reading the resource goes through the same payment gate as calling the tool, and fails the same way without a proof.
Errors
All payment failures surface as a tool error with code PAYMENT_REQUIRED (HTTP 402 semantics). When the failure is "no payment yet", the result _meta includes the com.flowcp/x402 requirements so you can pay and retry.
Facilitator
FlowCP settles through an x402 facilitator. There are three modes:
Mock (default) — a built-in in-process facilitator, no real funds. Used by development and self-host runtimes when nothing else is configured.
Generic HTTP — set
X402_FACILITATOR_URL(andX402_FACILITATOR_API_KEYfor a bearer credential) to point at any x402 facilitator's/verify+/settle.Coinbase CDP — set
X402_FACILITATOR_PROVIDER=cdpplusCDP_API_KEY_ID/CDP_API_KEY_SECRET. The runtime uses the official Coinbase CDP facilitator via the@coinbase/x402SDK (an optional dependency, lazily loaded). This is the real on-chain rail.
Running a real CDP facilitator (testnet)
The CDP facilitator speaks true x402: the payment the agent presents must be a real signed x402 payload (an EIP-3009 authorization), not the simplified mock _payment shape. To bring the real rail up safely on base-sepolia:
Create CDP API keys at https://portal.cdp.coinbase.com and fund a testnet wallet from a base-sepolia faucet.
Set
X402_FACILITATOR_PROVIDER=cdp,CDP_API_KEY_ID,CDP_API_KEY_SECRET.Capture a real x402 verify/settle request from an x402 client (the Coinbase x402 examples emit one) into a JSON file:
{ "paymentPayload": {…}, "paymentRequirements": {…} }.Run the verification script — it does exactly what the runtime's
CdpFacilitatordoes and prints the on-chain settlement tx:
Once that prints a settlement tx, the runtime's CDP path is live. Note that FlowCP friendly network names (base, base-sepolia) are mapped to the CAIP-2 ids the SDK expects (eip155:8453, eip155:84532).
Where the money goes
Payments settle directly to the builder's payout address — FlowCP never custodies funds. FlowCP's marketplace platform fee is not taken from the on-chain settlement; instead it is metered onto the builder's existing FlowCP subscription invoice (reported in whole USD cents to the STRIPE_PLATFORM_FEE_METER_EVENT meter, reconciled hourly). Each settled payment is recorded as a receipt showing the amount, the builder's share, and the platform fee — visible on the dashboard under Monetization → Transactions.
Last updated