list_cards
List Cards
List all available virtual card aliases and their balances. No sensitive data is returned.
Takes no parameters.

io.github.Dempty-glitchPublished by GitHub account Dempty-glitchv1.10.4Updated Oct 29, 2026
Payments for AI agents: gasless USDC on Base + JIT single-use virtual cards, PAN never in context.
Gives an AI assistant a wallet and payment rails: gasless USDC on Base and single-use virtual cards for web checkouts, without exposing card numbers.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
[MCP Badge] [npm] [License: MIT]
AI Agents today can plan, reason, and code — but they are financially blind. They cannot hold money, make payments, or prove their trustworthiness. Every purchase still requires a human to copy-paste a credit card number.
Z-ZERO fixes that. One MCP server gives your agent (Claude, Cursor, any MCP-compatible client) two payment rails — gasless USDC on Base for crypto-native checkouts, and JIT single-use virtual cards for the 99% of the web that only takes cards — while the model never sees a real card number.
What makes it different:
Z_ZERO_ENABLE_WEB3_PAY=1, because an on-chain send to an address read off a web page cannot be reversed.get_merchant_hints serves platform-specific checkout playbooks (Shopify, Etsy, WooCommerce…).execute_payment hands those criteria back and requires a second call with go or pause; a confirmed purchase seals the answer into the signed receipt. The record is inspectable without pretending the platform judged whether the agent told the truth.failure_class (automatically, not only when an agent remembers to report) and stored as evidence for the merchant knowledge base. Facts are promoted into shared hints only after a later outcome or review verifies them.0xdfd1f2f8…5d7aThe AI agent never touches card data — it only handles single-use tokens. Real card details are injected by Playwright at the last step and wiped from RAM.
Crypto checkout branch: when
auto_pay_checkoutdetects a crypto-native checkout (EIP-681), it skips the card flow entirely and settles as a gasless USDC transfer on Base — see above. Off by default; enable withZ_ZERO_ENABLE_WEB3_PAY=1.
Z-ZERO is not a checkout bot — it's payment infrastructure for the agentic-commerce era (agentic transactions are projected to reach $1.5T by 2030 — Juniper Research).
Today, the web is built for humans: agents must fill forms and click buttons, and every purchase still needs a human's card. Z-ZERO solves that now — JIT single-use virtual cards + gasless USDC on Base, with card data isolated from the model. Tomorrow, agent payments become a standardized protocol — and what we build along the way is the long-term value:
📖 Full vision & architecture: The Z-Zero Whitebook
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
Get your Passport Key at: z-zero.xyz/dashboard/agents
The key you copy from the dashboard (or paste into a chat) is only a one-time bootstrap ticket. The moment your agent connects with it, the MCP server silently swaps it for a fresh key:
~/.z-zero/credentials (mode 0600). It never appears in any LLM conversation, tool result, or config file.~/.z-zero/credentials first; the Z_ZERO_API_KEY env var is only a bootstrap fallback.One key = one machine. All agents on the same machine (Claude Desktop, Claude Code, Cursor, …) share the same MCP install and the same credentials file — install once, every agent can pay. Connecting a different machine with a copied key rotates it, which instantly disconnects the original machine. That is deliberate: it blocks key sharing and doubles as an intrusion alarm — if your agent suddenly fails auth, someone else used your key; go to the dashboard and revoke.
Older self-hosted backends without the rotate endpoint keep working — the pasted key simply stays active as before.
zk_live_, get it from the dashboard above📖 Note: Version checking is handled automatically in each API call. No separate tool needed.
Four linked records and controls an agent can use here that it cannot get from a normal virtual card alone.
Pass the cart when you request a token:
Z-ZERO signs that statement (EIP-191) during issuance. It is a tamper-evident record of the criteria the agent supplied as the owner's instruction — not an independent proof that the human personally approved every line. The shipping address is stored as a hash, never raw.
Before you request a token, compare the checkout page with what the user actually asked for — same items, same quantity, same variant, same destination. A mismatch you catch there costs nothing. After the token, it costs a card.
go or pauseexecute_payment is deliberately a two-call tool:
Use decision: "pause" when anything differs. The card is not filled and the
token remains active and refundable. On go, the checkout runs; if the merchant
confirms the order, the declaration is sealed into the signed receipt with the
outcome. The platform records what the agent declared; it does not independently
inspect the page or certify that the declaration was true.
On a confirmed payment you get back:
diff is the part that matters: it is what the merchant actually did versus what
was authorized. Share verify_url with the user — the page is public and anyone
can check it. Verification is three checks: the signature is valid, the signer is
Z-ZERO, and the fields shown still hash to what was signed (so editing the record
afterwards is detectable, including by us).
What a valid receipt does and does not prove. It proves the record is signed by
Z-ZERO and unaltered. It does not by itself prove the merchant charged what the
receipt says — most fields start life as the agent's reading of a web page. Every
receipt therefore carries provenance per field: zzero_issued (the limit we set),
issuer_captured (confirmed by the card issuer's capture webhook — settlement
evidence), agent_reported (unverified), human_verified. Until the capture webhook
lands, this is a signed execution receipt, not settlement proof, and it says so.
report_checkout_fail takes a fixed enum, not free text:
card_declined_issuer · card_declined_bin_block · avs_mismatch · 3ds_required ·
bot_detected · form_changed · price_changed · out_of_stock ·
shipping_unsupported · login_required · timeout · outcome_unconfirmed ·
intent_mismatch · unknown
Failed runs are also labeled automatically from the browser outcome, so the network learns even when nobody remembers to report. Card numbers are redacted at capture — they never reach a log, screenshot or DOM dump.
The Z-ZERO backend is hosted at https://z-zero.xyz. All endpoints require a Bearer token using your Passport Key.
⚠️ Use the MCP tools above instead of calling REST directly. If you must call REST, use the exact paths below.
GET /api/tokens/cardsReturns your card list, balance, and deposit addresses.
Aliases (also work):
GET /api/v1/cards ← for agents that guess REST-style pathsPOST /api/tokens/issueIssue a JIT payment token.
POST /api/tokens/resolveResolve a token to card data (server-side only).
POST /api/tokens/burnBurn a used token.
POST /api/tokens/cancelCancel an unused token (refunds balance).
zk_live_)Z_ZERO_API_KEYzk_live_c0g3l)/api/v1/cards/api/tokens/cards directly.Security: the key you paste is never kept — it rotates the moment your agent first connects, and the fresh key lives only in a local owner-only file (~/.z-zero/credentials, mode 0600), never in any LLM conversation. Card data exists only in volatile RAM during execution.
Source: README.md at commit e9b4e91
List Cards
List all available virtual card aliases and their balances. No sensitive data is returned.
Takes no parameters.
Check Balance
Check spendable USD balance for a card alias. For active token limits, use list_cards instead.
card_aliasrequiredGet Deposit Address
Get your Base deposit address to top up your wallet with USDC (or any supported stablecoin on Base).
Takes no parameters.
Issue JIT Card (spends $0.10 fee)
Request a single-use JIT virtual card ($1–$50) locked to one amount + one store domain. ⚠️ Read mcp://resources/sop first. Only call once the FINAL total is visible — for physical goods that is AFTER shipping is submitted (use get_merchant_hints to navigate there). For digital goods with the price already visible, prefer auto_pay_checkout instead. BEFORE requesting: look at the checkout page one more time and compare it against what the user actually asked for — same items, same quantity, same variant, same destination? If anything differs, do NOT request a token; fix the cart or check with the user first. A mismatch you catch here costs nothing; after this point it costs a card. If you pass `cart`, the server signs your declared intent and binds the card to it — the user gets cryptographic proof of what this card was authorized for. Pass `criteria` too: the few things the owner actually cared about, which this purchase gets scored against at payment time.
cartamountrequiredship_tocriteriamerchantrequiredcard_aliasrequiredmerchant_countryMerchant Checkout Hints
Get merchant navigation flow for a domain or platform key (e.g. '_platform_etsy'). Returns pre_steps (how to navigate checkout) and platform notes. Call BEFORE starting checkout to understand the multi-step flow.
domainrequiredProbe UCP Checkout (creates draft)
UCP discovery + quote — creates an UNPAID draft checkout; no money moves; NOT a payment rail yet. Checks whether a merchant speaks UCP (Shopify-native agent commerce), lists its declared payment handlers, and — when variant_gid or query is given — creates a DRAFT checkout and returns the merchant's real quote: total_minor (wire units, 8900 = $89.00), total_major, currency, status, blockers, continue_url. NO payment happens; drafts expire server-side. Completing a UCP checkout needs Shopify Token-tier agent auth, which Z-Zero does not hold yet — to PAY, hand the buyer continue_url or use the standard execute_payment flow where permitted. Call this first on Shopify stores: their robots.txt bans scripted checkout, so the UCP lane is the sanctioned path.
queryship_toquantityshop_urlrequiredbuyer_emailvariant_gidExecute Payment (charges the card)
Execute a payment with a one-time token. TWO CALLS: call it first WITHOUT `recheck` — nothing is charged and it hands you what the owner actually asked for, locked when the card was issued; look at the page again, then call it a second time with `recheck` to pay or to pause. Then Z-Zero opens a headless browser, injects the card (you NEVER see the PAN), clicks Pay, and watches for a REAL confirmation before reporting success. Returns a `status`: `confirmed` (order placed → token burned, receipt_id may hold a real order #), `declined` (merchant rejected → token kept for refund), `unconfirmed` (submitted but no confirmation seen → do NOT retry blindly, verify first), `not_submitted` (no Pay button → supply a submit_selector hint), or `no_fields`. ALWAYS pass actual_amount so overcharges are blocked and underspend refunded.
hintstokenrequiredrecheckcheckout_urlrequiredactual_amountCancel Token — Safe Refund
Cancel unused token and refund instantly. Use when user cancels the purchase or to free up a card slot.
tokenrequiredreasonrequiredShow Approval Instructions
Pause and ask the user for approval before risky actions (price mismatch, large amount, unusual request).
situationrequiredcurrent_tokenalternative_actionrecommended_actionrequiredChange Passport Key (switches identity)
Activate a new Passport Key instantly, no restart needed. Only call when user explicitly provides a key.
api_keyrequiredPassport Key Status
Check if Passport Key is configured. Shows prefix only, for debugging.
Takes no parameters.
Auto-Pay Checkout (charges the card)
⚠️ MANDATORY: Read mcp://resources/sop first. Only use on PAYMENT pages where final total is visible. Issues a JIT card and completes the payment (paying a crypto address found on the page is OFF unless the owner set Z_ZERO_ENABLE_WEB3_PAY=1). For physical goods (Shopify, Etsy), get_merchant_hints first.
card_aliasrequiredcheckout_urlrequiredReport Checkout Failure
Report a checkout you could not complete. Pick the failure_class that best matches what you saw — this feeds Z-ZERO's self-healing loop (labeled failures become better merchant hints for the next run). If nothing fits, use 'unknown' and describe what happened in error_message.
urlrequiredsteperror_messagefailure_classrequiredremediation_triedVerify Receipt
Check where an order ENDED UP, and prove it. Returns TWO separate axes: `order_status` — 'completed' (bought, issuer not reported yet) · 'settled' (issuer confirmed) · 'reversed' (auth voided before clearing — the order does NOT stand) · 'partially_refunded' / 'refunded' (merchant returned money AFTER settlement — the order still happened) — and `funds_status` — 'no_payout_due' · 'payout_pending' (money owed back but not yet confirmed on-chain) · 'returned' (confirmed on-chain). Read BOTH before speaking: 'reversed' or 'refunded' with funds 'payout_pending' means the buyer has NOT got the money back yet — never say they have. If you told the user a purchase was done and a later check returns 'reversed', tell them unprompted.
receipt_idrequired90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
npx z-zero-mcp-server User AI Agent MCP Tools Z-ZERO API │ │ │ │ │ "Buy me this │ │ │ │ Shopify item" │ │ │ ├─────────────────▶│ │ │ │ │ read mcp://resources/sop (MANDATORY) │ │ ├─────────────────────▶│ │ │ │◀── platform rules ───┤ │ │ │ + payment SOP │ │ │ │ │ │ │ │ get_merchant_hints("_platform_shopify") │ │ ├─────────────────────▶│ GET /checkout-hints │ │ │ ├─────────────────────▶│ │ │◀── pre_steps+notes ──┤◀──── hints data ─────┤ │ │ │ │ │ │ (fills shipping form, reaches payment page) │ │ │ │ │ │ │ request_payment_token(amount, cart, criteria)│ │ ├─────────────────────▶│ │ │ │◀── temp_auth token ──┤ (1-hour TTL) │ │ │ │ │ │ │ execute_payment(token, checkout_url) │ │ ├─────────────────────▶│ │ │ │◀── purpose_check ────┤ (nothing charged) │ │ │ compare locked criteria with final page │ │ │ │ │ │ │ execute_payment(..., recheck: go | pause) │ │ ├─────────────────────▶│ │ │ │ pause → no card is filled │ │ │ go → Playwright fills + submits, │ │ │ then burns token if confirmed 🔥 │ │ │◀──── ✅ success ─────┤ │ │ "Done! Your item │ │ │ │ is ordered." │ │ │ │◀─────────────────┤ │ │npx z-zero-mcp-server{ "mcpServers": { "z-zero": { "command": "npx", "args": ["-y", "z-zero-mcp-server@latest"], "env": { "Z_ZERO_API_KEY": "zk_live_your_passport_key_here" } } }}request_payment_token({ card_alias: "Card_01", amount: 44.00, merchant: "etsy.com", cart: [{ title: "Ceramic mug — matte white", qty: 2, unit_price: 18.50 }], ship_to: "12 Nguyen Hue, District 1, Ho Chi Minh City, VN", criteria: { source: "user_described", items: [ { key: "item", stated: "two matte-white ceramic mugs" }, { key: "max_total", stated: "no more than $44 delivered" } ] }})// Call 1 — omit recheck. No browser, PAN, or charge.execute_payment({ token, checkout_url, actual_amount: 44.00 })// → { status: "purpose_check", nothing_charged: true, owner_asked_for: ... }
// Call 2 — describe the final page and make an explicit decision.execute_payment({ token, checkout_url, actual_amount: 44.00, recheck: { page_shows: "2 matte-white mugs, delivered total $44.00", decision: "go" }})"signed_receipt": { "receipt_id": "8ea36791-…", "receipt_hash": "0x…", "match": { "total": "over", "domain": "ok" }, "diff": [{ "field": "total", "expected": 44.00, "observed": 46.75 }], "verify_url": "https://z-zero.xyz/receipt/8ea36791-…"}curl -X GET "https://z-zero.xyz/api/tokens/cards" \ -H "Authorization: Bearer zk_live_your_key"