Nuri Remit

ClickPesa: read and free preview tools, send_tzs order, get_payment exact frozen amount, customer pays Base USDC or EURC, BTC on-chain or Lightning (bank orders Base USDC only), watchers or native proof verify, mobile payout automatic, bank needs approval and float, get_order read-onlyZapRemit: catalog, quote, provider Lightning invoice, customer pays provider, authenticated status, funding separate from delivery, terminal states. Separate: request_tzs and get_request collection; optional router route_price and route_payOther tools: request_tzs USSD collection and get_request; optional router route_price and route_pay, off unless configured
Diagram source
%% remit-flow.mmd
flowchart TD
  A["ClickPesa payout · TZS<br/>POST /mcp"]
  B["Read: list_banks · list_lipa_providers<br/>get_balance: float, not a transfer max<br/>get_rates"]
  C["Preview, free: check_recipient · check_bank<br/>check_lipa · quote_tzs"]
  D["send_tzs → HTTP 402: orderId + pay offers"]
  E["get_payment: exact frozen amount,<br/>address + QR, unpaid order only"]
  F["Customer pays once, exact frozen amount:<br/>Base USDC or EURC · BTC on-chain · Lightning<br/>Bank order: Base USDC only"]
  G["Server verifies: Base watcher · BTC watcher<br/>Lightning watcher, preimage checked<br/>or native proof on send_tzs retry"]
  H["payment_verified"]
  I["Mobile money, Lipa / TanQR:<br/>automatic payout"]
  J["Bank: manual approval"]
  K["Float enough: pay now, else<br/>payout_scheduled, scheduler retries"]
  L["get_order: read-only status,<br/>never confirms a payment"]
  A --> B --> C --> D --> E --> F --> G --> H
  H --> I
  H --> J --> K
  I --> L
  K --> L
  classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
  class A h

%% remit-flow-mobile.mmd
flowchart TD
  A["ClickPesa payout · TZS<br/>POST /mcp"]
  B["Read:<br/>list_banks<br/>list_lipa_providers<br/>get_balance: float,<br/>not a transfer max<br/>get_rates"]
  C["Preview, free:<br/>check_recipient<br/>check_bank<br/>check_lipa<br/>quote_tzs"]
  D["send_tzs<br/>HTTP 402:<br/>orderId + pay offers"]
  E["get_payment:<br/>exact frozen amount,<br/>address + QR,<br/>unpaid order only"]
  F["Customer pays once,<br/>exact frozen amount:<br/>Base USDC or EURC<br/>BTC on-chain<br/>Lightning<br/>Bank order:<br/>Base USDC only"]
  G["Server verifies:<br/>Base watcher<br/>BTC watcher<br/>Lightning watcher,<br/>preimage checked<br/>or native proof<br/>on send_tzs retry"]
  H["payment_verified"]
  I["Mobile,<br/>Lipa,<br/>TanQR:<br/>automatic<br/>payout"]
  J["Bank:<br/>manual<br/>approval"]
  K["Float enough:<br/>pay now; else<br/>payout_scheduled,<br/>scheduler<br/>retries"]
  L["get_order:<br/>read-only status,<br/>never confirms<br/>a payment"]
  A --> B --> C --> D --> E --> F --> G --> H
  H --> I
  H --> J --> K
  I --> L
  K --> L
  classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
  class A h

%% remit-zap.mmd
flowchart TD
  A["ZapRemit · Lightning<br/>POST /mcp"]
  B["Catalog:<br/>zapremit_countries<br/>zapremit_methods<br/>zapremit_options<br/>zapremit_rates"]
  C["zapremit_quote:<br/>quote expires,<br/>then a new quote"]
  D["zapremit_payment:<br/>one provider<br/>Lightning invoice<br/>+ QR, same invoice<br/>on repeat calls"]
  E["Customer pays<br/>provider invoice<br/>from own wallet;<br/>server never pays it"]
  F["zapremit_order:<br/>authenticated<br/>provider status;<br/>form polls 5 s"]
  G["Funding proven by<br/>funded, processing,<br/>completed, refunding<br/>or refunded;<br/>separate from<br/>delivery status"]
  H["Terminal:<br/>completed, expired<br/>or refunded.<br/>Invoice + QR only<br/>while pending,<br/>unpaid, unexpired"]
  A --> B --> C --> D --> E --> F --> G --> H
  subgraph CL["Collect TZS"]
    OB["POST /mcp<br/>request_tzs:<br/>USSD prompt,<br/>owner approves<br/>with PIN; funds go<br/>to ClickPesa account"]
    OC["get_request:<br/>status by ref"]
    OB --> OC
  end
  subgraph RT["Router, optional"]
    OE["POST /mcp<br/>route_price<br/>route_pay:<br/>external x402<br/>service; L402<br/>Lightning proof"]
    OF["Off unless<br/>router configured:<br/>router_off"]
    OE --> OF
  end
  CL ~~~ RT
  classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
  class A h

%% remit-zap-mobile.mmd
flowchart TD
  A["ZapRemit · Lightning · POST /mcp"]
  B["Catalog: zapremit_countries · zapremit_methods<br/>zapremit_options · zapremit_rates"]
  C["zapremit_quote: quote expires, then a new quote"]
  D["zapremit_payment: one provider Lightning invoice<br/>+ QR, same invoice on repeat calls"]
  E["Customer pays provider invoice from own wallet;<br/>server never pays it"]
  F["zapremit_order: authenticated provider status;<br/>form polls 5 s"]
  G["Funding proven by funded, processing, completed,<br/>refunding or refunded; separate from delivery status"]
  H["Terminal: completed, expired or refunded.<br/>Invoice + QR only while pending, unpaid, unexpired"]
  A --> B --> C --> D --> E --> F --> G --> H
  classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
  class A h

%% remit-ops-mobile.mmd
flowchart TD
  A["Collect TZS · POST /mcp"]
  B["request_tzs: USSD prompt, owner approves<br/>with PIN; funds go to ClickPesa account"]
  C["get_request: status by ref"]
  D["Router, optional · POST /mcp"]
  E["route_price · route_pay: external x402 service;<br/>L402 Lightning proof"]
  F["Off unless router configured: router_off"]
  A --> B --> C
  C ~~~ D
  D --> E --> F
  classDef h fill:#073642,stroke:#073642,color:#fdf6e3,font-weight:bold
  class A,D h
remit-flow.mmd · remit-flow-mobile.mmd · remit-zap.mmd · remit-zap-mobile.mmd · remit-ops-mobile.mmd

Send Tanzanian shillings via ClickPesa, or pay out abroad via ZapRemit. One MCP endpoint, JSON-RPC 2.0 or plain JSON: POST https://remit.paymentrequired.com/mcp

Tools

Payment, limits and protocol

Mobile and merchant payouts are automatic after verified payment. Bank payouts accept USDC only and require manual approval after verified payment. After approval, sufficient float allows immediate payout; otherwise the order waits for float.

Minimum 500 TZS. Bank: up to 21,000,000 TZS per transfer. Mobile money: up to 3,000,000 TZS per recipient phone number per transfer. Merchant/TanQR: up to 3,000,000 TZS per transfer. Available float is not a transaction limit; approved bank payouts can wait for float. Spread 5.0%. Quotes hold for 30 minutes.

ClickPesa orders: send_tzs returns HTTP 402 with Lightning, Base USDC, Base EURC and Bitcoin options. get_payment returns the exact amount, address and QR for an unpaid order, with automaticDetection. Base USDC, Base EURC and Bitcoin are detected automatically. A Lightning QR is offered only when the order's payment response shows automaticDetection: true; otherwise Lightning is for agents with a native L402 proof only.

ZapRemit orders: zapremit_quote, then zapremit_payment returns the Lightning invoice that funds the payout; zapremit_order shows its status.

Pay once, then wait. Nobody types a transaction hash or preimage. get_order is read-only; it shows incomingPaymentVerified, and an operator recovery is labelled operator_recovery, never as a verified payment. A completed order never shows another payment QR.

curl -X POST https://remit.paymentrequired.com/mcp -H "Content-Type: application/json" -d '{"tool":"quote_tzs","amountTZS":5000}'

/.well-known/mcp.json · /llms.txt · /openapi.json · /health