X402 Commerce
FreeNot checkedMCP server that gives Claude/GPT agents commerce tools — each tool call pays an upstream x402 endpoint and returns its artifact.
About
MCP server that gives Claude/GPT agents commerce tools — each tool call pays an upstream x402 endpoint and returns its artifact.
README
MCP server that gives Claude/GPT agents commerce tools — each tool call pays an upstream x402 endpoint and returns its artifact.
Pay in USDC on Base or Solana — the agent picks the rail, per call.
Give a model a wallet, a spending cap, and a dozen merchants. book_table, search_flights,
buy_item, check_weather — each tool call pays an upstream x402 route in USDC and hands back
the merchant's artifact with the payment receipt attached. The model never sees a key, never
signs anything, and cannot spend past a cap it doesn't control.
Why x402 for this
Tool-using agents hit a wall the moment a tool costs money: API keys have to be provisioned per
merchant, per agent, in advance, by a human. x402 inverts that — the merchant advertises a price
in a 402, the agent signs a USDC payment for exactly that amount, and the goods come back in
the same response. A new merchant becomes a new tool by adding four lines to a JSON file. No
signup, no key distribution, no billing relationship, and a per-call cost the agent can reason
about because it is printed in the result.
Quickstart
git clone https://github.com/nirholas/x402-mcp-commerce
cd x402-mcp-commerce && npm install
# rehearse the whole toolbox against the sandbox — costs a fraction of a cent
git clone https://github.com/nirholas/x402-agent-sandbox
(cd ../x402-agent-sandbox && npm install && npm run dev &) # :4038
X402_TOOLS_CONFIG=./config/tools.sandbox.json npx tsx examples/agent-client.ts
# the real thing
npm run mcp # MCP server over stdio — what Claude Desktop launches
npm run dev # the HTTP inspector on :4039
Add it to Claude Desktop with examples/claude_desktop_config.json, restart, and ask for a table next Friday.
Tools
Twelve commerce tools, generated from config/tools.json, plus three
built-ins. Every commerce tool takes an optional rail argument.
| Tool | Upstream | Price | What you get back |
|---|---|---|---|
search_flights |
x402-flight-search | $0.005 | Priced offers for a route and date. |
price_flight |
x402-flight-search | $0.003 | Live price + availability for one offer. |
find_tables |
x402-tablebook | $0.001 | Open reservation slots. |
book_table |
x402-tablebook | $0.01 | Confirmed reservation + cancel token + refund terms + ICS invite. |
search_hotels |
x402-hotel-search | $0.005 | Room offers for a city and date range. |
check_weather |
x402-weather-guard | $0.001 | Forecast with a plan-relevant summary. |
browse_catalog |
x402-storefront | free | Items, prices, buy routes. |
buy_item |
x402-storefront | per item | Digital: signed download URL + license. Physical: signed order + fulfillment record. |
search_places |
x402-places | $0.002 | Places near a point or in an area. |
search_news |
x402-news-wire | $0.003 | Coverage of a topic in a window. |
check_domain |
x402-domains | $0.001 | Registration status, holder, expiry. |
track_confirmation |
x402-confirmations | $0.005 | Any merchant confirmation → portable record + ICS. |
list_commerce_tools · spending_report · discover_service |
— | free | Capabilities, ledger, and any x402 service's manifest. |
Every call returns the same envelope — the merchant's artifact plus the receipt and the exact price paid:
{
"tool": "book_table",
"paid": true,
"rail": { "requested": "auto", "used": "evm" },
"artifact": { "reservationId": "res_…", "cancelToken": "…", "ics": "…" },
"receipt": { "success": true, "network": "base-sepolia", "transaction": "0x…", "payer": "0x…" },
"price": { "usd": 0.01, "atomic": "10000", "asset": "0x036C…" }
}
Full reference: docs/api.md · openapi.json
Choosing a payment rail
Every suite merchant offers USDC on Base and USDC on Solana in the same 402. Five layers decide which one gets signed — later wins:
| Layer | Where | Example |
|---|---|---|
| Registry default | config/tools.json → defaults.rail |
"rail": "auto" |
| Server-wide | env | X402_RAIL=solana |
| Per tool, in config | the tool's rail field |
"rail": "evm" |
| Per tool, from env | env | X402_RAIL_BOOK_TABLE=evm |
| Per call | the model | book_table({…, rail: "solana"}) |
auto takes a rail this process holds a key for, EVM first. The choice is honoured strictly: if
the requested rail isn't in the upstream's accepts, the call fails with RAIL_UNAVAILABLE
rather than quietly paying on the other one.
The EVM rail signs an EIP-3009 authorization with a viem account. The Solana rail signs an SPL
transferChecked whose network fee is covered by the facilitator's sponsor — so the agent needs
USDC and no SOL.
Spending caps
Checked before any payment is signed, against the real price in the upstream's 402 — so a runaway loop stops at the ledger, not at the chain.
MAX_PER_CALL_USD=0.05 # most this agent will pay for one call
MAX_SESSION_USD=1 # total for this process
MAX_CALLS=200 # total paid calls
ALLOWED_TOOLS= # comma-separated allowlist; empty = all
A blocked call returns the cap that stopped it plus the current spending state, so the model can explain itself rather than retry. For purchases that genuinely need to go through, escalate to a human with x402-approval-page.
How x402 works
- The tool calls its upstream route with no payment →
402 Payment Requiredwith anacceptsarray listing both rails. - This server picks the rail (config, per-tool override, or the model's own
railargument), checks the real price against its caps, and signs that payment. - It retries with the base64
X-PAYMENTheader; the merchant's facilitator verifies and settles. 200— the artifact comes back in the body, the receipt inX-PAYMENT-RESPONSE, and both land in the tool result.
The inspector's own paid route (GET /attest) speaks the same protocol from the other side:
| rail | network (default) | mainnet | payTo | facilitator |
|---|---|---|---|---|
| EVM | base-sepolia |
NETWORK=base |
PAY_TO_ADDRESS |
FACILITATOR_URL (default https://x402.org/facilitator) |
| Solana | solana |
SOLANA_NETWORK=devnet for testing |
SOLANA_PAY_TO_ADDRESS |
SOLANA_FACILITATOR_URL (default https://facilitator.payai.network) |
Both ship with the suite's public receive addresses pre-filled in .env.example, so npm run dev works with zero configuration.
Real backend / API keys
Self-contained: no third-party APIs and no keys of its own. What the envs unlock is spending ability, not data:
PRIVATE_KEY— the EVM wallet that signs Base payments. Without it the EVM rail is unavailable.SOLANA_PRIVATE_KEY— base58 or JSON-array secret key for the Solana rail. Optional; leave it unset and the agent simply never takes that rail.SOLANA_RPC_URL— used to build the SPL transfer. The public endpoint is heavily rate limited.SIGNING_SECRET— HMAC key behind the attestation signature.
Upstream services have their own key policies; this server just pays them.
For AI agents
- skill.md — agent-facing capability sheet, served at
GET /skill.md. GET /.well-known/x402— machine-readable manifest (source) with anmcpblock describing the transport and built-in tools, in the format indexed by x402scan.com, the x402 Bazaar, and agentic.market.- Not an MCP client?
POST /tools/:nameruns any tool over HTTP with the same arguments and the same envelope. It is free to call and spends your wallet — keep it off the public internet. - Guide: docs/agents.md · Claude wiring: examples/mcp-tool.md.
Docs
Site: https://nirholas.github.io/x402-mcp-commerce/ — tutorial · API · agents · curl walkthrough
Part of the x402 Suite.
Support
Questions, bugs, integration help: [email protected]
License
Installing X402 Commerce
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/nirholas/x402-mcp-commerceFAQ
Is X402 Commerce MCP free?
Yes, X402 Commerce MCP is free — one-click install via Unyly at no cost.
Does X402 Commerce need an API key?
No, X402 Commerce runs without API keys or environment variables.
Is X402 Commerce hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install X402 Commerce in Claude Desktop, Claude Code or Cursor?
Open X402 Commerce on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
Fetch
Web content fetching and conversion for efficient LLM usage.
AWS KB Retrieval
Retrieval from AWS Knowledge Base using Bedrock Agent Runtime.
by modelcontextprotocolSpring AI MCP Server
Provides auto-configuration for setting up an MCP server in Spring Boot applications.
llm-analysis-assistant
A very streamlined mcp client that supports calling and monitoring stdio/sse/streamableHttp, and can also view request responses through the /logs page. It also
by xuzexin-hzMCP-Agent
A simple, composable framework to build agents using Model Context Protocol by [LastMile AI](https://www.lastmileai.dev)
by lastmile-aiSpring AI MCP Client
Provides auto-configuration for MCP client functionality in Spring Boot applications.
mcp.natoma.ai
A Hosted MCP Platform to discover, install, manage and deploy MCP servers by [Natoma Labs](https://www.natoma.ai)
MCPHub
Website to list high quality MCP servers and reviews by real users. Also provide online chatbot for popular LLM models with MCP server support.
MCP Servers Rating and User Reviews
Website to rate MCP servers, write authentic user reviews, and [search engine for agent & mcp](http://www.deepnlp.org/search/agent)
mkinf
An Open Source registry of hosted MCP Servers to accelerate AI agent workflows.
Compare X402 Commerce with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All ai MCPs
