# Nuri Remit — ClickPesa MCP

Send Tanzanian shillings to mobile money, a bank account, Lipa Namba, or TanQR.

1. Check the destination with check_recipient, check_bank, or check_lipa.
   Show the recipient name, fee, and price before payment. Checks are free.
2. Call send_tzs with the same destination and amountTZS to create an order.
   Pay ONE offered method.
3. Use get_payment with the orderId for the exact amount, address, and payment QR.
   Show a QR to a person only when get_payment returns automaticDetection: true.
   Base USDC, Base EURC and Bitcoin transfers are detected automatically.
   Lightning is detected automatically only when get_payment returns automaticDetection: true;
   otherwise the Lightning QR is refused. Pay once, then wait. Never type a transaction hash or preimage.
   Agents with native L402 support may pay the invoice from the 402 challenge and retry send_tzs
   with the same orderId and amountTZS and the header Authorization: L402 <macaroon>:<preimage>.
4. 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.
5. Use get_order with the orderId to check payment, approval, and delivery status.
   Never pay an order again once get_order shows it is no longer awaiting_payment.

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.
No account, registration, or API key is needed.

## Endpoints
- Send money: https://remit.paymentrequired.com/send
- MCP and plain HTTP JSON: POST https://remit.paymentrequired.com/mcp
- OpenAPI: https://remit.paymentrequired.com/openapi.json
- MCP manifest: https://remit.paymentrequired.com/.well-known/mcp.json
- Health: https://remit.paymentrequired.com/health

## Request formats
Both formats use POST /mcp with Content-Type: application/json.
Standard MCP JSON-RPC 2.0:
```json
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"quote_tzs","arguments":{"amountTZS":5000}}}
```
Plain HTTP JSON:
```json
{"tool":"quote_tzs","amountTZS":5000}
```

## Payment and settlement
send_tzs returns a 402 payment challenge. Pay only one offered method and exactly the quoted amount.
Mobile and merchant orders support the offered Lightning, Base USDC, Base EURC, and Bitcoin methods. Bank orders accept USDC only.
get_payment returns the order-bound payment amount, address, and QR. EVM QR uses an ERC-20 transfer on the correct chain; Bitcoin uses BIP21; Lightning uses the invoice.
Payment destinations are shown only for an active order, never in public documentation.
get_payment and every send_tzs offer carry automaticDetection. Watchers detect Base USDC, Base EURC and Bitcoin transfers automatically. Lightning is detected automatically only for an invoice whose response shows automaticDetection: true; a Lightning QR without it is refused.
A person never types a transaction hash or preimage. Agents with native L402 or x402 support may retry send_tzs with the original orderId and amountTZS plus the proof header; this never creates another order or bills a paid order again.
Mobile and merchant payouts are automatic. Bank payouts require manual approval after verified payment; after approval, sufficient float allows immediate payout, otherwise the order waits for float.
Use get_order to follow the order through payment, approval, and delivery. get_order is read-only. incomingPaymentVerified shows whether the incoming payment was verified; an operator_recovery payout is labelled as such and is not a verified payment. A completed order never offers another payment QR.

## Public tool catalog

### route_price — Get a quote for an external service
Checks the price of an external x402 service; route_pay is paid over Lightning with a native L402 proof. Does not move funds.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL of the external service"
    },
    "method": {
      "type": "string",
      "description": "GET or POST; defaults to GET"
    },
    "body": {
      "type": "object",
      "description": "Request body for POST"
    }
  },
  "required": [
    "url"
  ]
}
```

### route_pay — Pay an external service
For agents with native L402 support: pay the returned Lightning invoice, then call again with Authorization: L402 <macaroon>:<preimage>; we pay the external x402 service and return its response. Without a proof, only the invoice challenge is returned. Not detected automatically.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL of the external service"
    },
    "method": {
      "type": "string",
      "description": "GET or POST; defaults to GET"
    },
    "body": {
      "type": "object",
      "description": "Request body for POST"
    }
  },
  "required": [
    "url"
  ]
}
```

### check_recipient — Check recipient and price
Check a Tanzanian mobile number before payment: recipient name, provider (M-Pesa, Tigo Pesa, Airtel, Halopesa), fee, and crypto price. Free. Always check the recipient first to avoid paying the wrong number. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "phone": {
      "description": "Tanzanian mobile number. Accepted formats: +255712345678, 255712345678, 0712345678.",
      "type": "string",
      "examples": [
        "+255712345678",
        "0712345678"
      ]
    },
    "amountTZS": {
      "description": "Amount the recipient receives in Tanzanian shillings. Accepts an integer or a string. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 3000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        5000,
        "5000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    }
  },
  "required": [
    "phone",
    "amountTZS"
  ],
  "additionalProperties": false
}
```

### request_tzs — Request money
Request money from a Tanzanian mobile number. The owner receives a USSD prompt and approves with their mobile money PIN. Funds go to the ClickPesa account. Supports M-Pesa, Tigo Pesa, Airtel Money, and Halopesa. No funds move without approval. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "phone": {
      "description": "Tanzanian mobile number to request money from. Accepts common local and international formats.",
      "type": "string",
      "examples": [
        "+255712345678",
        "0712345678"
      ]
    },
    "amountTZS": {
      "description": "Amount to request in Tanzanian shillings. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 3000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        5000,
        "5000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    },
    "nurPruefen": {
      "description": "true = preview available providers and fees only. No prompt is sent to the phone.",
      "type": "boolean",
      "default": false
    }
  },
  "required": [
    "phone",
    "amountTZS"
  ],
  "additionalProperties": false
}
```

### get_request — Check money request status
Check whether a money request was approved, is pending, or failed.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "ref": {
      "description": "Reference returned by request_tzs.",
      "type": "string",
      "examples": [
        "REQM2K4X1"
      ]
    }
  },
  "required": [
    "ref"
  ],
  "additionalProperties": false
}
```

### get_balance — Available payout liquidity
Get available ClickPesa float and separate bank/mobile transaction limits. Float is not a transfer maximum; approved bank payouts may wait for liquidity.
Input schema:
```json
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
```

### get_rates — Current exchange rates
Get the current raw exchange rates used by the service: TZS per USD, TZS per EUR, and USD per BTC. Free.
Input schema:
```json
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
```

### list_banks — List Tanzanian banks
List supported Tanzanian banks with names and BIC codes (e.g. CRDB Bank: CORUTZTZ, NMB Bank: NMIBTZTZ, Absa: BARCTZTZ, Stanbic: SBICTZTX).
Input schema:
```json
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
```

### check_bank — Check a Tanzanian bank account
Check a Tanzanian bank account before payment: account holder name, bank name, fee, and crypto prices. Free. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "amountTZS": {
      "description": "Amount to send to the bank account in Tanzanian shillings. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 21000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        50000,
        "50000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    },
    "accountNumber": {
      "description": "Account number at the Tanzanian bank.",
      "type": "string",
      "examples": [
        "01J1234567890"
      ]
    },
    "bic": {
      "description": "Bank BIC code from list_banks (e.g. CORUTZTZ for CRDB, NMIBTZTZ for NMB).",
      "type": "string",
      "examples": [
        "CORUTZTZ",
        "NMIBTZTZ"
      ]
    },
    "accountName": {
      "description": "Optional account holder name (verified if the bank supports name lookup).",
      "type": "string"
    }
  },
  "required": [
    "amountTZS",
    "accountNumber",
    "bic"
  ],
  "additionalProperties": false
}
```

### list_lipa_providers — List Lipa Namba and TanQR providers
List supported Lipa Namba providers and their three-digit providerCode values (e.g. M-Pesa 503, Airtel 504, Mixx 501, NMB 016, CRDB 003).
Input schema:
```json
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
```

### check_lipa — Check a Lipa Namba or TanQR merchant
Check a Lipa Namba (+ providerCode) or TanQR code before payment: merchant name, fees, and crypto prices. Free. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "amountTZS": {
      "description": "Amount to pay the merchant in Tanzanian shillings. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 3000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        5000,
        "5000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    },
    "lipaNamba": {
      "description": "Merchant Lipa Namba (merchant code, e.g. 48001268).",
      "type": "string"
    },
    "providerCode": {
      "description": "Three-digit provider code from list_lipa_providers (e.g. 503 for M-Pesa).",
      "type": "string"
    },
    "qrCode": {
      "description": "Full TanQR content (including tz.go.bot.tips). Alternative to lipaNamba.",
      "type": "string"
    }
  },
  "required": [
    "amountTZS"
  ],
  "additionalProperties": false
}
```

### quote_tzs — Get a payout quote
Get a price without a mobile number. Free. Use check_recipient to confirm the recipient name. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "amountTZS": {
      "description": "Amount the recipient receives in Tanzanian shillings. Accepts an integer or a string. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 21000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        5000,
        "5000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    }
  },
  "required": [
    "amountTZS"
  ],
  "additionalProperties": false
}
```

### send_tzs — Send money
Send Tanzanian shillings to mobile money, a bank account, Lipa Namba, or TanQR. The first call returns a payment request (HTTP 402) with an orderId, the recipient name and the offered payment methods; each offer states whether automaticDetection is true. People pay once from get_payment and wait; no transaction hash or preimage is typed. Agents with native L402 or x402 support may retry send_tzs with the same orderId and amountTZS plus the payment proof header (Authorization: L402 <macaroon>:<preimage> or PAYMENT-SIGNATURE); a retry never creates a new order and never re-bills a paid order. Mobile and merchant payouts are automatic after verified payment. Bank payouts accept USDC only and require manual approval after verified payment; once approved, sufficient float allows immediate payout, otherwise the order waits for float. 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.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "amountTZS": {
      "title": "Recipient receives (TZS)",
      "description": "Amount the recipient receives in Tanzanian shillings. Accepts an integer or a string. 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.",
      "anyOf": [
        {
          "type": "integer",
          "minimum": 1,
          "maximum": 21000000
        },
        {
          "type": "string",
          "pattern": "^[0-9]+$"
        }
      ],
      "examples": [
        5000,
        "5000"
      ],
      "x-maximum-by-destination": {
        "bank": 21000000,
        "mobile": 3000000,
        "merchant": 3000000,
        "tanqr": 3000000
      }
    },
    "phone": {
      "title": "Mobile number",
      "description": "Tanzanian mobile money number, e.g. +255712345678, 255712345678, 0712345678.",
      "type": "string",
      "examples": [
        "+255712345678",
        "0712345678"
      ]
    },
    "lipaNamba": {
      "title": "Merchant number",
      "description": "Merchant Lipa Namba (merchant code, e.g. 48001268). Alternative to phone.",
      "type": "string"
    },
    "providerCode": {
      "title": "Merchant provider",
      "description": "Three-digit provider code (e.g. 503 for M-Pesa). Required with lipaNamba.",
      "type": "string"
    },
    "qrCode": {
      "title": "TanQR content",
      "description": "TanQR content (including tz.go.bot.tips). Alternative to phone/lipaNamba.",
      "type": "string"
    },
    "accountNumber": {
      "title": "Bank account",
      "description": "Account number at a Tanzanian bank. Alternative to phone/lipaNamba.",
      "type": "string"
    },
    "bic": {
      "title": "Bank",
      "description": "Bank BIC code from list_banks (e.g. CORUTZTZ, NMIBTZTZ). Required with accountNumber.",
      "type": "string"
    },
    "accountName": {
      "title": "Account holder (optional)",
      "description": "Account holder name for bank transfers (optional).",
      "type": "string"
    },
    "orderId": {
      "title": "Existing order ID (proof retry only)",
      "description": "Only for retrying an existing order with a native payment proof header. Must be the orderId returned by the first send_tzs call, with the same amountTZS. The destination is taken from the stored order. Omit it to create a new order.",
      "type": "string",
      "pattern": "^NURI-[A-Za-z0-9-]+$",
      "examples": [
        "NURI-00000000-0000-4000-8000-000000000001"
      ]
    }
  },
  "required": [
    "amountTZS"
  ],
  "additionalProperties": false
}
```

### get_payment — Get payment details
Get the exact payment amount, address and QR for an existing unpaid order. No payment is sent. Show a QR to a person only when the response has automaticDetection: true; then pay once and wait, no proof is typed. EVM QR encodes an ERC-20 transfer on the correct chain; Bitcoin uses BIP21. Lightning returns an invoice QR only when this order's invoice has automatic settlement detection; otherwise the Lightning request is refused. Paid, recovered or expired orders never return payment details.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "orderId": {
      "type": "string",
      "title": "Order ID",
      "description": "Order ID returned by send_tzs."
    },
    "rail": {
      "type": "string",
      "title": "Payment method",
      "enum": [
        "usdc_base",
        "eurc_base",
        "btc_onchain",
        "lightning"
      ],
      "default": "usdc_base"
    }
  },
  "required": [
    "orderId"
  ],
  "additionalProperties": false
}
```

### get_order — Check transfer status
Check order status, including payout delivery or pending bank approval. Read-only: it never confirms a payment by itself. incomingPaymentVerified states whether the service verified the incoming payment; an operator_recovery payout is shown as such, not as a verified payment. Free.
Input schema:
```json
{
  "type": "object",
  "properties": {
    "orderId": {
      "title": "Order ID",
      "description": "Order ID returned by send_tzs.",
      "type": "string",
      "examples": [
        "NURI-0b3f..."
      ]
    }
  },
  "required": [
    "orderId"
  ],
  "additionalProperties": false
}
```