IoMarkets Topup

app.iomarkets由 iomarkets.app 發布官方發布者v0.2.11更新於 Nov 8, 2026

Travel eSIMs and mobile top-ups paid in USDC via x402.

已驗證Streamable HTTP可網頁執行位置與生活金融商業與電商

概覽

AI 產生的概覽

透過 x402 以 Algorand 上的 USDC 購買旅遊 eSIM 與手機儲值,支援報價、付款連結、訂單追蹤與可驗證收據。

可以做什麼
  • 查詢手機號碼的國家與電信業者,並瀏覽儲值、eSIM、帳單與國際付款通道的報價
  • 鎖定 10 分鐘有效的價格報價,並取得訂單的 x402 付款挑戰
  • 建立由真人以自己 Algorand 錢包付款的結帳連結,以及批次 eSIM 領取連結的報價與購買
  • 輪詢訂單狀態直到已交付或已退款,並用 Algorand 索引器驗證 ed25519 簽章收據
  • 查詢 USDC 兌當地貨幣的參考匯率與公開交付帳本
適用情境
適合讓助理代買或儲值手機通話與行動數據、把結帳連結交給本人自行付款,或為團體旅遊、會議分送旅遊 eSIM。也適合核對訂單結果並驗證本服務或其他賣家的收據。
執行需求
遠端 streamable HTTP 端點;未宣告需要帳號、API 金鑰或信用卡。付款需要持有 USDC 的 Algorand 錢包(例如 Pera)並完成 x402 付款簽章流程,託管伺服器本身不持有錢包。需要能連線該端點,鏈上驗證還需連線 Algorand 索引器。
安裝前請注意
購買會實際花費鏈上 USDC,結算後無法撤銷;先付款後出貨,僅在供應商失敗時自動退款。購買前務必向真人顯示價格與收款對象,並保留批次 ID,因為它是領取連結的唯一憑據。收款對象與訂單資料會傳送給供應商,並出現在收款人經雜湊處理的公開帳本中;另有單筆與每日上限。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 IoMarkets Topup,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/app.iomarkets%2Ftopup/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "iomarkets-topup": {
      "type": "http",
      "url": "https://iomarkets.app/mcp"
    }
  }
}

README

IoMarkets Topup — real-world checkout for AI agents on Algorand

Your AI agent can buy real things — and send money. In the pilot today: travel eSIMs and mobile airtime/data top-ups. Prepaid bills and international payments (bank / mobile money / UPI payouts via a licensed partner) are built and supplier-gated. Everything is paid per order in USDC on Algorand via x402. No account, no API key, no card. Money settles on-chain first, goods ship second, failures refund on-chain automatically, and every terminal order carries an ed25519-signed receipt anyone can verify.

Built for the Global x402 Challenge (Algorand Foundation × GoPlausible). Pilot: https://iomarkets.app · agent docs: /agent.md · ledger: /v1/ledger · receipt spec: docs/RECEIPTS.md

How it works

agent ── GET /v1/lookup?phone=+91…  ─▶ operator + offers                      (free)agent ── POST /v1/quote {type, offerId, recipient, amount} ─▶ quoteId, price   (free, 10-min lock)agent ── POST /v1/orders {quoteId} ─▶ 402 + exact USDC amount                 (x402)agent ── …signs Algorand USDC payment, retries with PAYMENT-SIGNATURE ─▶ facilitator settles on-chainserver ── order created ONLY after settlement ─▶ supplier purchase ─▶ delivered | failed → on-chain refundagent ── GET /v1/orders/{id} ─▶ status, confirmation (operator ref / eSIM LPA), signed receipt, txids
RouteCostPurpose
GET /v1/lookup?phone=freecountry / operator / offers for a number
GET /v1/catalog?type=topup|esim|bill|payout&country=&limit=&offset=freebrowse offers / payout corridors with indicative USDC prices (paged: 100 by default, total + next_offset in the response, limit=0 for all)
GET /v1/countries?type=esimfreeevery destination a product reaches; enumerable:false = the supplier will not list them
GET /v1/fx?to=INR&amount=&type=freeindicative USDC→local rate at our sale price + estimate (type = topup | bill | payout, since the markup can differ per product)
POST /v1/quotefreelock an exact price for one purchase
POST /v1/ordersthe quoted amount, x402pay → order
GET /v1/orders/:idfreestatus, confirmation, signed receipt, refund txid
POST /v1/verifyfreeverify any receipt: signature + both txids on chain (?online=0 for signature only)
GET /v1/ledger · GET /v1/pubkey · GET /agent.md · GET /fundfreepublic ledger · receipt key · agent instructions · how to get USDCa
GET /.well-known/agent-card.json · GET /.well-known/agent.jsonfreeA2A agent card — what registries and agent routers read: the live skill list (rendered from what the suppliers can actually fill), the provider, and x402 declared as a required capability with the paid route named. Claims no transport and no url: this server does not speak A2A JSON-RPC, and neither HTTP+JSON nor a made-up MCP is an honest value for that field, so the card is discovery metadata and documentationUrl sends a caller to /agent.md for the interface that exists (src/agent-card.ts)
GET /v1/client-configfreenetwork, CAIP-2 id, algod URL, USDC ASA and the order ceiling — what a browser needs to build a payment (public values only)
GET /payfreethe batch payout console — paste a spreadsheet, price every row, approve once, export receipts (web/, ?demo=1 for canned data)
GET /consolefreethe original single-file console — no build step, works when web/dist is absent
POST /v1/links · GET /v1/links/:id · POST /v1/links/:id/quotefreepay links — an agent with no wallet hands its human a checkout URL (/l/:id); they approve the exact price in their own Pera wallet. A top-up link is a "top up my phone" request anyone can pay
GET /p/:settlement_txid · GET /v1/proof/:txidfreeproof of delivery — shareable page per goods order (price, delivery time, on-chain settlement, checked signature), keyed by the public txid, never the order id; "get the same eSIM" credits the original buyer
GET /v1/referrals · GET /v1/referrals/:address · GET /earnfreereferral share — ref on any quote or link earns a share of net margin on delivered orders, paid on-chain in USDC; off until REFERRAL_SHARE_BPS > 0
GET / · GET /brand/logo.webp · GET /favicon.icofreethe human landing page — what, why, who, a live-catalogue explorer with a simulated purchase, the ledger, and where the product sits in the IoMarkets® ecosystem; the logo and icons every page shares (src/brand.ts)

Trust model (what makes agents use it extensively)

  • No order without a settled payment — the order row is created from the facilitator's settlement txid.
  • Exact pricing — the 402 challenge carries the quoted amount; a quote pays once and expires in 10 min.
  • Automatic refunds — supplier failure ⇒ USDC returned to the paying address on-chain, note = order id.
  • Signed receipts — {order, amount, payer, settlement txid, refund txid} signed with a published ed25519 key (pnpm verify receipts/<id>.json --online checks the signature and both transactions on Algorand). The same check is an endpoint anyone can call — POST /v1/verify — and it verifies receipts from any server that adopts the format, not just ours. The format is a spec: docs/RECEIPTS.md.
  • Public ledger — every order, outcome and txid (recipients hashed).
  • Abuse posture — $50/order (goods), $200/payment (payouts), $200/payer/day, sanctioned destinations refused, replay guard, rate limits; payouts need a sender record and a partner KYC reference above $100/day (src/compliance.ts).
  • Key hygiene — the server holds one hot key (refund float, daily-capped); PAY_TO is an address only; secrets come from files / systemd encrypted credentials, never .env (see src/keys.ts).

Run it

bash
pnpm install --frozen-lockfile --ignore-scriptscp .env.example .env            # PAY_TO, RECEIPT_* (pnpm gen-key), SUPPLIER=mock to startpnpm dev                        # http://127.0.0.1:3000  (NETWORK=mainnet — the facilitator serves mainnet)pnpm test && pnpm typecheck
# The batch payout console (web/ — React + TanStack Start, installed with bun).pnpm install:web && pnpm build:web   # → web/dist/client, served by the SAME process at /paypnpm dev:web                         # or: vite with HMR on http://127.0.0.1:8080/pay/ , /v1 proxied to :3000AGENT_MNEMONIC_FILE=~/.secrets/agent.mnemonic pnpm buy --phone +919876543210 --amount 100   # real USDCpnpm check-bazaar               # listed after the first settled payment

Mock supplier rules for demos: a phone ending 0000 fails (→ refund path), 1111 is delivered after polling.

Agent integrations

  • .claude-plugin/plugin.json — Claude Code plugin: this skill + the hosted MCP server, zero setup for the user.
  • server.json — MCP registry manifest (remotes → https://iomarkets.app/mcp); needs the deploy live + a DNS TXT record proving the app.iomarkets namespace.
  • skills/iomarkets-topup/SKILL.md — the single shared skill for OpenClaw, Hermes and Claude Code (agentskills format); publishing to each hub is a copy, not a fork (skills/README.md).
  • pnpm mcp — MCP server (stdio) with lookup_phone, list_offers, quote, buy, order_status, verify_receipt, ledger, create_pay_link.
  • Bazaar: the paid route declares discovery metadata + the x402-global-challenge tag; it is indexed on first settlement.

Layout

src/app.ts          HTTP surface + x402 wiring (dynamic price = quote, preflight hook, post-settle order creation)src/orders.ts       quote → paid → fulfilling → delivered | failed → refunded   (single-flight, resumable)src/suppliers/      types · mock · zendit · reloadly · composite (goods + payouts) · payout-partner (skeleton)src/compliance.ts   payout gate (sanctions, caps, sender, KYC threshold)src/receipt.ts      ed25519 receipts        src/refunds.ts  on-chain refunds (daily cap)src/db.ts           node:sqlite             src/keys.ts     secret sources (file / systemd cred / env)src/growth.ts       pay links · proof pages · referral routes   src/referrals.ts  margin share, reserve-first payoutssrc/mcp.ts          MCP server              src/client/paying.ts  x402 paying fetch with budgetscripts/            gen-key · new-wallet · optin-usdc · buy · verify-receipt · check-bazaardocs/RECEIPTS.md    the signed-receipt format, as a spec other sellers can adoptdeploy/entrypoint.sh  container entrypoint: refuses to start on a config that cannot take money

來源:README.md,提交 3787fdf

工具

11

lookup_phone

Identify the country and mobile operator of a phone number and list the top-up offers available for it. Free. The operator is DETECTED from the number range and is a guess: MVNOs (Tesco Mobile, Giff Gaff, Lebara, Voxi, Sky…) resolve to the host network they ride on. Read the detected brand back to the human and have them confirm it before buying, and use `other_brands` to correct it — a voucher bought for the wrong network delivers successfully and cannot be redeemed or refunded.

輸入參數phone必填

list_offers

Browse purchasable offers: mobile top-ups, travel eSIMs, prepaid bills, or international payment corridors (bank / mobile money / UPI) for a country. Free. Prices shown are indicative; the quote fixes them.

輸入參數type必填brandlimitoffsetcountry

quote

Lock a price (10 minutes) for one purchase. Returns quoteId, exact USDC price and what will be delivered. Free. ALWAYS show the human the price and the recipient before buying.

輸入參數reftype必填iccidpayerphoneamountfieldssenderofferId必填

buy

Get the x402 payment challenge for a quote. This hosted server holds no wallet, so it does NOT spend your money: it returns the exact amount, asset, payTo address and facilitator for you to pay from your own Algorand wallet, then you POST the quote again with your payment signature. Requires prior human confirmation of the quote. Works the same for a quote from quote_vouchers; the paid response is the batch (batchId and claim links) rather than an order.

輸入參數quoteId必填

quote_vouchers

Lock a price (10 minutes) for a BATCH of travel eSIMs paid in one payment: N claim links, one per person, for a group trip, a conference delegation or event giveaways. Each eSIM is bought when its link is claimed (the person opens it on their phone and installs the QR), and links nobody claims within 30 days are refunded to the paying wallet. Free. Pay the returned quoteId with `buy`, or send the human to this service's /pay/?mode=vouchers page to buy it with their own wallet. Limits: 2–50 eSIMs, each within the per-order limit, the batch within its own limit ($100 by default). ALWAYS show the human the total and the count before buying.

輸入參數notecount必填payerofferId必填

voucher_batch

A paid voucher batch: every claim link, which have been claimed and delivered, the expiry, and any refund for unclaimed links. The batchId is the only handle on the links — keep it, and hand each person their own link privately (whoever opens a link first gets that eSIM).

輸入參數batchId必填

order_status

Check an order. Poll every ~3 s until `terminal` is true: delivered (confirmation + signed receipt), refunded (refund txid + signed receipt) or refund_failed.

輸入參數orderId必填

verify_receipt

Verify an ed25519-signed receipt: the signature, and — unless you pass onChain:false — both txids against an Algorand indexer. Give it an orderId to check one of this service's own orders, or a receipt object to check ANY receipt in this format, including one issued by another server.

輸入參數onChainorderIdreceipt

fx

Indicative USDC → local-currency rate at our sale price, with an estimate for an amount. The quote is the binding price.

輸入參數to必填typeamount

ledger

Public delivery ledger: totals, delivered-or-refunded %, volume, countries, recent orders.

無需輸入參數。

版本歷史

5
  1. v0.2.11最新Nov 8, 2026
  2. v0.2.10Oct 29, 2026
  3. v0.2.8Oct 1, 2026
  4. v0.2.7Sep 16, 2026
  5. v0.2.5Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。

其他 Iomarkets 整合