
x402 Micro Tollgate
io.github.kevin2003050666-coder由 GitHub 账号 kevin2003050666-coder 发布v0.3.3更新于 Oct 24, 2026
x402 HTTP 402 + MCP paywall: charge USDC per agent call. Self-host via npx or Docker.
发布方自己的服务:Mu
概览
自托管的 x402 收费网关,为你的 API 或 MCP 工具加上 USDC 微支付门槛,让智能体按次付费。
- 可以做什么
- 提供免费的报价与发现接口:服务器信息、价格报价、商户注册表和面向智能体与爬虫的发现清单,以及健康检查和 OpenAPI、llms.txt 文档,便于在付费前了解目录与价格。为付费路由设置门槛:未付费请求返回 HTTP 402 价格标签而非直接拒绝,USDC 结算完成后网关将请求代理到你的上游 API。抓取并转换网页:付费路由可抓取 HTML 页面并以 Markdown 返回,带 SSRF 防护。通过 Coinbase CDP 结算:校验并结算 EIP-3009 授权,具备重放防护和结算缓慢时的待处理与重试状态。
- 适用场景
- 当你出售 API 或 MCP 工具,希望智能体以 USDC 按次付费,而不想自建计费后台或按月席位收费时使用。适合希望在现有上游 API 前部署轻量自托管收费网关的运营者,也可用演示模式在不进行链上结算的情况下体验 402 流程。
- 运行要求
- 以 Node.js 22+ 本地进程运行(npx 或 Docker),或作为 HTTP 服务运行并在 8402 端口提供 MCP 端点。真实结算需要 Coinbase CDP 凭据(CDP_API_KEY_ID、CDP_API_KEY_SECRET)和收款地址(X402_PAY_TO 或 SELLER);缺少时进入演示模式。网络相关设置包括 NETWORK、PRICE、UPSTREAM_URL 和 X402_ENVIRONMENT。
安装
在 SourceWeft 中
- 打开 控制台中的 x402 Micro Tollgate,将其添加到工作区。
- 为需要使用其工具的对话启用该服务。
Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。
其他 MCP 客户端
参照 仓库 中的启动说明。
README
x402-micro-tollgate
Visa for AI agents that can’t hold a card.
Second-scale settlement bridge for agent traffic — the Web3 tollbooth that clears USDC micropayments and takes 0.1%.
为千万级无支付能力的 AI Agent 提供秒级过桥清算,抽成 0.1% 的 Web3 版 Visa 收费站
Security backed by Coinbase CDP. We don't touch your keys or settle payments on custom cryptography — EIP-3009 authorization nonces are single-use at the CDP facilitator (source of truth for on-chain uniqueness). The gateway hardens four buyer/seller trust surfaces: payment-proof replay/race, SSRF on URL fetch, upstream bypass (shared-secret trust header), and Base congestion / settle-latency (pending + retry same proof — never treat HTTP timeout alone as “payment failed”).
What it is
A thin self-hosted tollgate in front of your API or MCP tools. When an agent calls a paid route, it gets HTTP 402 as a price tag (not a hard deny). It pays a small USDC (or configured USDT) amount; you deliver. Default clearing is Base + USDC via Coinbase CDP; multi-network accepts are env-driven (see matrix below). Humans can still hit a free path; agents convert at the booth.
Self-host is free (MIT). Repo: github.com/kevin2003050666-coder/x402-micro-tollgate · Questions: [email protected]
Not an official Coinbase product. Not a full agent marketplace. Not a billing SaaS. A sharp Visa-style tollbooth. Not fiat custody.
Why this exists: MANIFESTO.md — pain, engineering, on-chain proof, MIT.
Network × asset matrix
Default deploy profile: Base USDC only (dev: Base Sepolia). Enable multi with NETWORKS + ASSETS or ACCEPTS_JSON / X402_* aliases. Browser HTML 402 shows a chain + asset picker when more than one accept is configured.
USDT on EVM typically uses extra.assetTransferMethod: "permit2" (not EIP-3009). FeeSplitter production path remains Base + USDC; other chains are config stubs under contracts/deployments/.
Browser wallets
Who it’s for
- API sellers who want agents to pay per call — without building a billing console or selling monthly seats
- Tool builders shipping paid MCP endpoints into Cursor / Claude
- Operators who want Visa-like take-rate economics (0.1%), not hosting invoices
How money works
- Price tag — unpaid traffic gets HTTP 402 with the amount due (conversion, not rejection)
- Pay — the agent settles a USDC micropayment in seconds via Coinbase CDP
- Unlock — the tollgate proxies to your upstream; you keep ~99.9%, protocol take 0.1%
No protocol monthly fee. Monetization is the toll — like interchange on card rails.
1-minute quickstart
Requires Node.js 22+.
npx one-liners (no clone):
--seller / -s sets X402_PAY_TO before boot (env vars still work). Default without --stdio is HTTP + /mcp on port 8402.
Agent / crawler docs: llms.txt (also GET /llms.txt and GET /.well-known/llms.txt) · OpenAPI 3.1: docs/openapi.yaml · well-known: GET /.well-known/x402.json, GET /.well-known/agent-card.json
Alternative one-liner: docker compose up --build
Without CDP keys the process runs in demo mode (protocol-shaped 402 / MCP PaymentRequired, no on-chain settle).
Cursor mcp.json:
Stdio:
(X402_PAY_TO in env still works if you omit --seller.)
Library drop-in (permissionless seller)
Or set SELLER / X402_SELLER in .env and run npm start. See Environment for the $10 threshold, factory address, and fee-release details.
Buyer / Agent client
Thin TypeScript helper that wraps official @x402/fetch + @x402/evm ExactEvmScheme. On HTTP 402 it parses PAYMENT-REQUIRED, checks budgets, signs EIP-3009 once, and retries once with PAYMENT-SIGNATURE (never loops).
Defaults: maxSingleSpendUsdc = 0.05, maxTotalSpendUsdc = 1.00 (clear Error if exceeded). Circuit breaker (before sign): max 10 paid 402s / 0.05 USDC per rolling 60s, plus fingerprint dead-loop halt (maxPaidRequestsPerMinute, maxSpendUsdcPerMinute, enableFingerprintBreaker). Hot-wallet warning: keep only ~$5–$10 USDC on the signing key — treat it as an agent spend faucet, not a treasury.
Human-delegated agent credit (CLI)
Thin PoC: Human sets B_max → Agent loops createX402Fetch against a paid URL (auto 402 → pay once → retry). Chrome / Telegram / Session Key / Passkey UI are deferred.
The script imports the local client (../src/client) so repo CI does not need a live chain pay. For a live demo against the published package, swap the import to x402-micro-tollgate/client (same API as 0.3.2+). Each round prints status, autoPaid, and sessionSpendUsdc on stdout; the safety banner goes to stderr.
Deploy
Uses render.yaml: Node 22, npm start, health /health, env names from .env.example. Set CDP_API_KEY_ID, CDP_API_KEY_SECRET, and X402_PAY_TO in the dashboard for live settlement; set PUBLIC_BASE_URL to your https://….onrender.com origin for Bazaar.
Ops bump: redeploy discover + well-known (force Render GitHub auto-deploy so production picks up GET /x402/discover, GET /.well-known/x402.json, GET /.well-known/agent-card.json, and MCP fetch_md). If auto-deploy does not fire within a few minutes after this lands on main, use the Render dashboard → Manual Deploy → Deploy latest commit.
Self-host production: Docker — docker compose up --build (see Dockerfile / docker-compose.yml).
Environment
Permissionless seller + $10 threshold (0.3.0)
0.3.0: set SELLER (or use x402Tollgate({ seller })) and FACTORY_ADDRESS for ≥ $10 CREATE2 routing. No MERCHANTS_JSON required.
x402 exact + EIP-3009 only credits payTo — it does not execute FeeSplitter / factory code and does not split in the same transaction. For ≥ $10: set FACTORY_ADDRESS to the operator-deployed factory (Base reference: contracts/deployments/base.json), call getOrCreate(seller) before the first such settle, then release() later (99.9% / 0.1%). Address typos send funds to the wrong place — the gateway checksum-validates SELLER at startup. Do not hardcode private keys or operator secrets in source.
Merchant registry (optional hosted multi-tenant)
Operator FEE_COLLECTOR is fixed: 0xa922F38041B5ee227c96A547F106F1330447e30E. Each merchant gets their own FeeSplitter (seller = merchant wallet, feeCollector = operator, feeBps = 10). The registry maps merchantId → splitter address (payTo) + seller for display. When SELLER is set, the registry is optional; ?merchant= still works if you provide MERCHANTS_JSON.
Register a merchant:
- Deploy
FeeSplitterwithseller= merchant wallet,feeCollector=0xa922F38041B5ee227c96A547F106F1330447e30E,feeBps= 10, and the chain’s native USDC asasset. - Add an entry to
MERCHANTS_JSON(ormerchants.json/ copy frommerchants.example.json): - Call gated APIs with
?merchant=acmeor headerx-merchant-id: acme(case-insensitive). Agents SHOULD always send merchant id. If omitted, the gateway falls back toDEFAULT_MERCHANT(demo) — that means traffic (and USDC) can silently land on the demo FeeSplitter. SetREQUIRE_MERCHANT=trueto reject missing merchant with400 { "error": "merchant_required" }. Unknown merchant on gated paths →400{ "error": "unknown_merchant" }. - Free listing:
GET /merchants(also/v1/merchants). - Agent yellow pages:
GET /x402/discover(aliasGET /discover) — stable JSON catalog derived from the same registry /SELLER/ demo. JSON config stays supported; there is no on-chainRegistry.sol$5 stake in this release.
Note: The Base demo splitter has seller = feeCollector = operator — fine for demo. Real merchants need their own splitter with their wallet as seller.
CDP createX402Server uses a single global payTo for SDK init (X402_PAY_TO or the default merchant splitter). Per-request merchant routing rewrites PAYMENT-REQUIRED accepts[].payTo to the resolved FeeSplitter (same pattern as the https resource.url rewrite).
If X402_PAY_TO is still an EOA and you only have one merchant, behavior stays simple. Multi-merchant production should point each registry payTo at a deployed splitter — x402/exact credits that splitter via EIP-3009; call release() later (manually or via the optional keeper) to send 99.9% / 0.1%. Same contract on Base / Arbitrum / Polygon — see the multi-chain FeeSplitter matrix. This is receive → later release(), not an atomic same-transaction split and not OpenZeppelin PaymentSplitter.
Discovery (live) + liquidity roadmap (planned)
Ship now — Discovery only. Free route GET /x402/discover (alias /discover) returns agent-readable yellow pages from existing sources (MERCHANTS_JSON / merchants file / SELLER / built-in demo) + PUBLIC_BASE_URL. No 402. Example shape:
status is health-honest: live only when CDP facilitator credentials + payTo are configured; otherwise demo (or config when accepts are non-live). This is not an on-chain Agent Registry.
Planned (documented only — do not treat as shipped):
Full notes: docs/ROADMAP-LIQUIDITY.md. No depositBounty / claimBounty on FeeSplitter and no fake “live” cross-chain clearing claims in this release.
发现层已上线(
GET /x402/discover);闪电流动性池与反向赏金仅为规划,见 roadmap。
Gas vs micropayment floor (optional)
Micropayments ($0.001–$0.01) assume Base low fees. When L2 gas spikes, estimated settle cost can eat most of a tiny payment. Opt in with X402_DYNAMIC_MIN_ENABLED=true: a cached Base baseFee oracle (TTL 15–60s, no RPC spam) estimates gas USD (gasUsedEstimate * baseFee * X402_ETH_USD) and, if that exceeds X402_GAS_COST_MAX_FRACTION of the payment (default 50%), bumps the displayed/enforced minimum accept amount and may raise feeFreeBelow so FeeSplitter+release() isn’t used until larger amounts. Default is OFF so demo $0.001 still works under normal conditions. Operators can also set a static X402_MIN_PRICE_USDC. Current effective mins are on GET /health → gasFloor.
Security (gateway hardening)
Four defenses buyers and sellers should know about:
- Payment signature replay / race — Idempotency key = SHA-256(
PAYMENT-SIGNATURE). An in-process mutex +PaymentDedupeStore(memory today; Redis-shaped interface) does set-if-absent before upstream. Concurrent losers get409 { "error": "payment_already_used" }. Durable mark happens only after settle success; verify failure releases the pending reservation so honest retries are not bricked. - SSRF on
/v1/fetch-md— Onlyhttp/https; DNS resolve rejects private/bogon/link-local/metadata; DNS is re-checked before fetch (rebinding defense); redirects are disabled. - Upstream bypass — Optional
UPSTREAM_SHARED_SECRET: after payment, proxy injectsX-Tollgate-Secret/X-Tollgate-Paid/X-Tollgate-Timestamp. Your upstream must require them (see snippet below). This is a shared-secret MVP, not mTLS. - Base congestion / settle latency —
X402_SETTLE_TIMEOUT_MS(default 3 minutes) is separate from the short verify budget. If settle is still in progress when the waiter expires →202 { "error": "payment_pending", "retry_with_same_proof": true }. Do not create a new payment and do not treat the buyer as failed solely because HTTP timed out — retry the same proof; the gateway resumes without double-settling.
CDP facilitator is a single-vendor settle dependency by default; see SECURITY.md for X402_FACILITATOR_URL (alternate facilitator when available — no multi-facilitator routing yet).
Payment proof idempotency + settle pending
CDP x402 exact + EIP-3009 authorizations are single-use at the facilitator (nonce). The gateway additionally tracks each proof fingerprint as pending → settled → consumed:
Process-local only by default (restart clears). Facilitator remains authoritative for on-chain nonce uniqueness.
Upstream trust header (Express example)
Or import verifyUpstreamTrustHeaders from x402-micro-tollgate in your upstream process.
Optional FeeSplitter release keeper
Scaffold in src/keeper.ts. Off by default (KEEPER_ENABLED unset/false). When enabled, every KEEPER_INTERVAL_MS (default 1h) it checks USDC balances of registry payTo FeeSplitter addresses and calls release() when balance ≥ KEEPER_MIN_USDC (default $1).
Warning: Gas for release() can exceed the 0.1% operator fee on sub-cent payments — hence the min-balance gate. Do not turn this on by default on Render. Prefer KEEPER_DRY_RUN=true (logs keeper_would_release) before using a real KEEPER_PRIVATE_KEY. Never commit keys.
Bazaar discovery (agents find sellers)
Bazaar is the x402 discovery catalog.
- HTTP:
createX402Serverauto-injects bazaar; we override withdiscoverable: true, descriptions, and input/output schemas (GET /v1/quote+ gated prefix proxies). - MCP:
x402ResourceServerdoes not auto-declare Bazaar — we registerbazaarResourceServerExtensionand passdeclareDiscoveryExtension({ toolName, inputSchema, … })onget_quote/proxy_request/fetch_md. Resource URL isPUBLIC_BASE_URL/mcp(a real http(s) URL, not a display name). - Origin well-known:
GET /.well-known/x402.json(alias/.well-known/x402) mirrors discover + lists live paid HTTP/MCP resources for facilitator-independent crawlers.
To appear in Bazaar:
- Set
PUBLIC_BASE_URLto a public https origin (localhost listings are a no-op for real crawlers). - Run with live CDP credentials +
X402_PAY_TO. - Complete one successful settlement through the CDP facilitator (empty-body probes on gated routes return 402, not 400).
Launch tip: share your /mcp or /v1/quote URL in Discord #x402 after that first settlement.
Pay in browser (Smart Wallet)
When a browser hits a gated route (Accept: text/html + Mozilla UA), the gateway returns a thin HTML paywall instead of JSON. Agents / MCP / curl keep the JSON 402 body.
What you get
- Connect / create a Coinbase Smart Wallet via the official
@x402/paywallEVM UI (Coinbase Wallet connector — Passkey Smart Wallet, no MetaMask required). - Sign the x402
exactEIP-3009 payment on Base (or Base Sepolia in development) and retry withPAYMENT-SIGNATURE. - Get USDC (optional): when server CDP keys are set, the paywall shows a Get USDC button that calls
POST /x402/session-tokenand opens Coinbase Onramp. Apple Pay / card appear only if Onramp supports them for your domain — this repo does not fake Apple Pay outside Onramp, and does not claim a guaranteed “10 second Apple Pay” without Portal production access.
Setup (buyer UX)
Honesty / production notes
- MVP networks: Base Sepolia (
development) and Base mainnet (production/NETWORK=eip155:8453). - Onramp production: enable Onramp in CDP Portal, allowlist your domain, and complete any Apple Pay domain verification Coinbase requires. Until then, Smart Wallet pay + sign + retry still works; Get USDC may error or omit card rails.
- CSP: the paywall ships inline scripts (same as upstream
@x402/paywall). Prefer not to set a strictscript-srcwithout nonces on 402 HTML responses. - Security: wallet private keys never touch the frontend; only the public client key is embedded. Session tokens are minted server-side.
Try it: open https://your-host/v1/quote in Chrome after configuring the keys above.
What it does
CLI: npx [email protected] | --seller 0x… / -s | --stdio | --port N
Agent SEO: llms.txt · docs/openapi.yaml
Publishing
Package identity (must stay in sync):
package.jsonmcpName=io.github.kevin2003050666-coder/x402-micro-tollgateserver.jsonname= same string
Flow (needs tokens on a machine that has them — not this VM):
- Public GitHub mirror at
kevin2003050666-coder/x402-micro-tollgate npm publish(or tagv*→.github/workflows/publish-mcp.yml)mcp-publisher publish(OIDC) → official MCP Registry- PulseMCP auto-ingests from the official registry — do not submit to PulseMCP directly
Update server.json remotes[0].url to your real public /mcp before publishing remotes.
Tests
No live CDP credentials required.
License
MIT · See CONTRIBUTING.md · SECURITY.md
来源:README.md,提交 55ac3b5
工具
0版本历史
1- v0.3.3最新Sep 16, 2026
评分
已满足适用检查项的 50%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
- 近 30 天内可连通25 分
请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。
- 已声明认证方式10 分
请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。
- 已列出工具15 分
请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。
- 描述必需15 分
- 图标10 分
- 文档15 分
- 许可证10 分
其他 Micro 集成

Mu
mu.micro官方发布者
Mu 是以单一 MCP 端点提供的个人助理运行时,为助手提供应用、博客、文档、书签、聊天、联系人、日程与归档等工具。

NEMO x402 Micro-Services
由 GitHub 账号 floortomproductions-droid 发布
远程按次付费网关,提供 34 个数据工具:站点/SEO 审计、天气、加密货币与 Polymarket 数据、YouTube、播客和招聘信息。

Myworker — 20 paid crypto & AI micro-APIs (x402)
由 GitHub 账号 princearies 发布
远程 MCP 服务器,提供 20 个付费的加密、DeFi、汇率、网页抓取与 AI 微服务,按次以 USDC 通过 x402 计费。

Skavio USDC Payment Verification & Proof MCP
eu.skavio
托管型 MCP 服务器,用于查验与核对原生 USDC 转账、生成区块链证据 PDF、审计 DNS/TLS,并转发付费的文档、OCR 与音频处理任务。

Micro-Manager Microscope
由 GitHub 账号 K-Dense-AI 发布
让助手控制 Micro-Manager 显微镜:拍摄图像、执行 Z 层扫描和时间序列、移动载物台与对焦、切换通道和物镜。