{
  "markdown": "# mcp-flutterwave\n\n[![CI](https://github.com/bajoski34/mcp-flutterwave/actions/workflows/ci.yml/badge.svg)](https://github.com/bajoski34/mcp-flutterwave/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/mcp-flutterwave.svg)](https://www.npmjs.com/package/mcp-flutterwave)\n[![npm downloads](https://img.shields.io/npm/dm/mcp-flutterwave.svg)](https://www.npmjs.com/package/mcp-flutterwave)\n[![Docker](https://img.shields.io/badge/ghcr.io-mcp--flutterwave-blue?logo=docker)](https://github.com/bajoski34/mcp-flutterwave/pkgs/container/mcp-flutterwave)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)\n[![Node.js](https://img.shields.io/node/v/mcp-flutterwave.svg)](https://www.npmjs.com/package/mcp-flutterwave)\n[![MCP](https://img.shields.io/badge/MCP-compatible-blue.svg)](https://modelcontextprotocol.io)\n\nAn [MCP (Model Context Protocol)](https://modelcontextprotocol.io) server that enables AI assistants to interact with the Flutterwave API — create payment links, charge customers directly, manage transfers, collect via virtual accounts, pay bills, and more.\n\n> **Note:** This server currently targets the Flutterwave v3 API. Support for v4 is coming soon.\n\nAlso ships with a **built-in web app** that connects to the MCP server and lets you talk to a Claude-powered Flutterwave assistant directly in your browser.\n\n---\n\n## Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Available Tools](#available-tools)\n- [Card Charge Flow](#card-charge-flow)\n- [Virtual Accounts](#virtual-accounts)\n- [Bill Payment Flow](#bill-payment-flow)\n- [FX Trade Flow](#fx-trade-flow)\n- [Verification](#verification)\n- [Stablecoins](#stablecoins)\n- [Web App](#web-app)\n- [MCP Server Setup](#mcp-server-setup)\n- [Usage with Claude Desktop](#usage-with-claude-desktop)\n- [MCP-UI Components](#mcp-ui-components)\n- [Contributing](#contributing)\n- [Changelog](#changelog)\n- [Security](#security)\n- [License](#license)\n\n---\n\n## Features\n\n- **Checkout** — Create hosted payment links and disable them\n- **Direct Charges** — Charge customers via card, bank account, mobile money, M-Pesa, or USSD\n- **Full card auth flow** — PIN, AVS (Address Verification), 3D Secure redirect, and OTP validation all handled automatically\n- **Charge Validation** — Validate OTP-based charges with a dedicated tool\n- **Transactions** — Verify by ID or reference, view event timeline, resend failed webhooks\n- **Transfers** — Initiate single transfers, manage beneficiaries\n- **Payment Plans** — Create and retrieve subscription plans\n- **Virtual Accounts** — Generate dedicated account numbers for NGN and GHS bank transfer collection (static or dynamic)\n- **Bill Payments** — Pay airtime, data, cable TV, electricity, internet bills and more (Nigeria)\n- **FX Trade** — Convert between NGN, GHS, and USD with live quotes (RFQ → trade in two steps)\n- **Verification** — BVN identity verification, bank account name resolution, and card BIN lookup\n- **Stablecoins** — Send USDC/USDT to Polygon wallets, or convert NGN/USD fiat into stablecoins\n- **Rich UI** — Every tool returns a branded HTML card rendered inline in supported clients\n- **Web App** — A standalone browser chat interface powered by Claude + this MCP server\n\n---\n\n## Installation\n\n### npm\n\n```bash\nnpm install -g mcp-flutterwave\n```\n\n### npx (no install needed)\n\n```bash\nnpx mcp-flutterwave --tools=all\n```\n\n### Docker\n\nPull the image:\n\n```bash\ndocker pull ghcr.io/bajoski34/mcp-flutterwave:latest\n```\n\nThe server communicates over stdio, so it must be launched by an MCP client — not run standalone. Configure Claude Desktop to use the Docker image as the MCP server:\n\n```json\n{\n  \"mcpServers\": {\n    \"flutterwave\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"--rm\", \"-i\",\n        \"-e\", \"FLW_SECRET_KEY=YOUR_SECRET_KEY\",\n        \"-e\", \"FLW_ENCRYPTION_KEY=YOUR_ENCRYPTION_KEY\",\n        \"ghcr.io/bajoski34/mcp-flutterwave:latest\"\n      ]\n    }\n  }\n}\n```\n\nThe `-i` flag keeps stdin open so Claude Desktop can communicate with the server over stdio.\n\n**Requirements:** Node.js 20 or later (for npm/npx).\n\n---\n\n## Available Tools\n\n### Checkout\n| Tool | Description |\n|---|---|\n| `create_checkout` | Create a hosted Flutterwave payment link |\n| `disable_checkout` | Disable an existing payment link |\n\n### Direct Charges\n| Tool | Description |\n|---|---|\n| `charge_card` | Directly charge a debit or credit card — handles PIN, AVS, 3DS, and OTP flows |\n| `charge_bank_account` | Debit a bank account (NGN / GHS) |\n| `charge_mobile_money` | Mobile money — Ghana, Uganda, Rwanda, Zambia, Francophone Africa |\n| `charge_mpesa` | M-Pesa charge (KES) |\n| `charge_ussd` | USSD charge (NGN) |\n| `validate_charge` | Validate a pending charge using OTP |\n\n### Transactions\n| Tool | Description |\n|---|---|\n| `read_transaction` | Get transaction details by ID |\n| `read_transaction_with_reference` | Get transaction details by `tx_ref` |\n| `read_transaction_timeline` | View the event timeline for a transaction |\n| `resend_transaction_webhook` | Resend a failed webhook |\n\n### Transfers\n| Tool | Description |\n|---|---|\n| `create_transfer` | Initiate a bank transfer |\n| `create_beneficiary` | Save a new transfer beneficiary |\n| `list_beneficiaries` | List all saved beneficiaries |\n\n### Payment Plans\n| Tool | Description |\n|---|---|\n| `create_payment_plan` | Create a recurring payment plan |\n| `get_payment_plans` | List payment plans with optional filters |\n\n### Virtual Accounts\n| Tool | Description |\n|---|---|\n| `create_virtual_account` | Create a dedicated bank account number for a customer (NGN or GHS) |\n| `get_virtual_account` | Retrieve a virtual account's status and details by `order_ref` |\n| `update_virtual_account` | Link or update the BVN on an NGN virtual account |\n| `list_virtual_account_bulk` | List all accounts created in a bulk batch |\n\n### Bill Payments\n| Tool | Description |\n|---|---|\n| `get_bill_categories` | List available bill categories (AIRTIME, CABLEBILLS, UTILITYBILLS, etc.) |\n| `get_bill_providers` | List billers/providers for a category |\n| `get_bill_items` | List payable items for a specific biller |\n| `validate_bill_customer` | Validate a customer account before payment (meter number, smartcard, etc.) |\n| `pay_bill` | Submit a bill payment |\n| `get_bill_status` | Check payment status and retrieve prepaid tokens (electricity) |\n\n### FX Trade\n| Tool | Description |\n|---|---|\n| `request_fx_quote` | Submit a Request For Quote (RFQ) for a currency conversion |\n| `get_fx_quote` | Poll the quote status — wait for READY before trading |\n| `initiate_fx_trade` | Lock in a READY quote and execute the trade |\n| `get_fx_trade` | Poll trade status until SETTLED or FAILED |\n\n### Verification\n| Tool | Description |\n|---|---|\n| `initiate_bvn_verification` | Begin a BVN identity check — returns a single-use customer consent URL |\n| `get_bvn_details` | Retrieve full BVN identity data after consent is given |\n| `resolve_bank_account` | Look up the account holder name for a bank account number |\n| `verify_card_bin` | Look up card brand, type, issuer, and country from the first 6 digits |\n\n### Stablecoins\n| Tool | Description |\n|---|---|\n| `get_stablecoin_fee` | Get the transfer fee before sending — shows net amount the recipient receives |\n| `send_stablecoin` | Send USDC or USDT to a Polygon wallet address |\n| `convert_to_stablecoin` | Convert NGN or USD fiat balance into USDC or USDT |\n\n---\n\n## Card Charge Flow\n\nDirect card charges are multi-step. The `charge_card` tool handles every stage automatically and tells Claude what to do next.\n\n```\n1. charge_card(card details)\n        │\n        ├─ mode: \"pin\"        → ask customer for PIN\n        │       charge_card(same params + authorization: { mode: \"pin\", pin: \"...\" })\n        │               │\n        │               ├─ mode: \"otp\"      → validate_charge(flw_ref, otp)\n        │               └─ mode: \"redirect\" → send customer to 3DS URL\n        │\n        ├─ mode: \"avs_noauth\" → ask customer for billing address\n        │       charge_card(same params + authorization: { mode: \"avs_noauth\", city, address, ... })\n        │               │\n        │               ├─ mode: \"otp\"      → validate_charge(flw_ref, otp)\n        │               └─ mode: \"redirect\" → send customer to 3DS URL\n        │\n        ├─ mode: \"redirect\"   → send customer to 3DS URL, then read_transaction to verify\n        │\n        └─ (none)             → charge complete — read_transaction to verify\n```\n\n### Authorization parameters\n\nWhen a second call is needed, pass `authorization` alongside the original card details:\n\n```json\n// PIN flow\n{ \"authorization\": { \"mode\": \"pin\", \"pin\": \"3310\" } }\n\n// AVS flow\n{ \"authorization\": { \"mode\": \"avs_noauth\", \"city\": \"Lagos\", \"address\": \"12 Victoria Island\", \"state\": \"LA\", \"country\": \"NG\", \"zipcode\": \"100001\" } }\n```\n\n### AMEX cards\n\nAmerican Express transactions require the `card_holder_name` field in addition to standard card details.\n\n### Payload encryption\n\nCard payloads are encrypted with 3DES-ECB using your `FLW_ENCRYPTION_KEY` before they are sent to Flutterwave (PCI DSS requirement). The encryption is handled automatically — set the environment variable and the server does the rest.\n\n---\n\n## Virtual Accounts\n\nVirtual accounts give each customer a dedicated bank account number to make transfers into. Flutterwave notifies your webhook when a payment arrives.\n\n| Feature | NGN | GHS |\n|---|---|---|\n| Dynamic (one-time) | ✓ — set `amount`, expires in ~1 hr | ✓ — use `frequency` and `duration` |\n| Static (reusable) | ✓ — `is_permanent: true`, **BVN required** | ✓ — `is_permanent: true` |\n| BVN required | Static accounts only | No |\n\n### NGN static account\n\n```json\n{\n  \"email\": \"customer@example.com\",\n  \"currency\": \"NGN\",\n  \"tx_ref\": \"VA-NGN-001\",\n  \"is_permanent\": true,\n  \"bvn\": \"22415929481\"\n}\n```\n\n### GHS dynamic account\n\n```json\n{\n  \"email\": \"customer@example.com\",\n  \"currency\": \"GHS\",\n  \"tx_ref\": \"VA-GHS-001\",\n  \"amount\": 500,\n  \"frequency\": 5,\n  \"duration\": 7\n}\n```\n\nAfter creation, save the `order_ref` — it is the key for retrieving or updating the account via `get_virtual_account` and `update_virtual_account`.\n\n---\n\n## Bill Payment Flow\n\nBill payments follow a 6-step discovery flow. Skip `validate_bill_customer` for airtime and mobile data.\n\n```\n1. get_bill_categories\n        ↓ choose a category (e.g. UTILITYBILLS)\n\n2. get_bill_providers(category)\n        ↓ get biller_code (e.g. \"BIL127\" for IKEDC)\n\n3. get_bill_items(biller_code)\n        ↓ get item_code and amount info\n\n4. validate_bill_customer(item_code, customer_id)   ← skip for AIRTIME / MOBILEDATA\n        ↓ confirm customer name and details\n\n5. pay_bill(biller_code, item_code, customer_id, amount)\n        ↓ returns reference\n\n6. get_bill_status(reference)\n        ↓ confirms completion\n          for electricity: prepaid token is in extra.token — share it with the customer\n```\n\n### Supported categories\n\n| Code | Description |\n|---|---|\n| `AIRTIME` | Mobile airtime top-up |\n| `MOBILEDATA` | Data bundle purchase |\n| `CABLEBILLS` | Cable TV (DSTV, GOTV, StarTimes) |\n| `INTSERVICE` | Internet service subscriptions |\n| `UTILITYBILLS` | Electricity (prepaid & postpaid) |\n| `TAX` | Government tax payments |\n| `DONATIONS` | Charitable donations |\n| `TRANSLOG` | Transport / logistics |\n| `DEALPAY` | Deal payments |\n| `RELINST` | Religious institutions |\n| `SCHPB` | School / education payments |\n\n> Bill payments are available for Nigeria only (`country: NG`).\n\n---\n\n## FX Trade Flow\n\nCurrency conversion uses a two-step quote-then-trade flow. Quotes are valid for **5 minutes** and available **weekdays only** (Monday–Friday).\n\n```\n1. request_fx_quote(base_currency, target_currency, quantity)\n        ↓ returns quote_id, status: NEW\n\n2. get_fx_quote(quote_id)   ← poll until READY or FAILED\n        ↓ READY: contains rate, approved_quantity, total_value, expiry\n\n3. initiate_fx_trade(quote_id, narration)\n        ↓ locks in rate, returns trade_id, status: NEW\n\n4. get_fx_trade(trade_id)   ← poll until SETTLED or FAILED\n        ↓ SETTLED: converted funds credited to target currency wallet instantly\n```\n\n### Supported currency pairs\n\n| Pair | Sell | Receive |\n|---|---|---|\n| NGN/USD | Nigerian Naira | US Dollar |\n| GHS/USD | Ghanaian Cedi | US Dollar |\n| USD/NGN | US Dollar | Nigerian Naira |\n\n### Quote statuses\n\n| Status | Meaning |\n|---|---|\n| `NEW` | Quote is being priced |\n| `READY` | Rate locked — call `initiate_fx_trade` now |\n| `PROCESSING` | A trade has been initiated on this quote |\n| `EXPIRED` | 5-minute window passed — submit a new quote |\n| `FAILED` | Pair unsupported, minimum not met, or account limit exceeded |\n\n### Trade statuses\n\n| Status | Meaning |\n|---|---|\n| `NEW` | Trade queued |\n| `PENDING` | Executing |\n| `SETTLED` | Funds exchanged and credited to target currency wallet |\n| `FAILED` | Insufficient balance or processing error |\n\n### Key constraints\n\n- **Minimum trade:** $1,000 USD equivalent in the base currency\n- **Quote lifetime:** 5 minutes from issuance (READY state)\n- **One-time use:** Each quote can only be used for one trade\n- **Approved quantity:** May differ from requested quantity due to liquidity or account limits — always use `approved_quantity` for reconciliation\n- **Account enablement:** Contact hi@flutterwavego.com to enable FX trading on your account\n\n---\n\n## Verification\n\n### Bank Account Resolution\n\nVerify a recipient's account details before sending a transfer. Always show the resolved name to the user before proceeding.\n\n```json\n{ \"account_number\": \"0690000040\", \"account_bank\": \"044\" }\n```\n\nCommon bank codes: `044` Access Bank · `057` Zenith Bank · `058` GTBank · `033` UBA · `011` First Bank\n\n### Card BIN Lookup\n\nIdentify card metadata from the first 6 digits of a card number.\n\n```json\n{ \"bin\": \"553188\" }\n// → { brand: \"MASTERCARD\", type: \"CREDIT\", issuer: \"NEXUS MERCHANT BANK\", country: \"NIGERIA\" }\n```\n\n> AMEX cards identified via BIN require the `card_holder_name` field when calling `charge_card`.\n\n### BVN Verification (Nigeria)\n\nTwo-step consent flow — customer must approve data sharing on the NIBSS portal.\n\n```\n1. initiate_bvn_verification(bvn, firstname, lastname, redirect_url)\n        ↓ returns reference + single-use consent URL\n\n2. Customer visits consent URL → approves data sharing on NIBSS portal\n        ↓ webhook (bvn.completed) fires OR poll:\n\n3. get_bvn_details(reference)\n        ↓ returns name, DOB, gender, phone, NIN, state of origin, watchlist status\n```\n\n> Requires Flutterwave account enablement — contact hi@flutterwavego.com. If the customer has already consented, `initiate_bvn_verification` returns `url: null` and you can call `get_bvn_details` immediately.\n\n---\n\n## Stablecoins\n\nSend USDC or USDT over the **Polygon network**, or convert NGN/USD fiat balances into stablecoins. Always call `get_stablecoin_fee` first so the user knows the net amount the recipient will receive.\n\n### Wallet-to-wallet transfer\n\n```\n1. get_stablecoin_fee(amount, currency: \"USDT\", debit_currency: \"USDT\")\n        ↓ shows fee and net amount\n\n2. send_stablecoin(wallet_address, amount, currency, debit_currency)\n        ↓ returns reference and transfer status\n```\n\n### Fiat-to-stablecoin conversion\n\n```\n1. get_stablecoin_fee(amount, currency: \"USDC\", debit_currency: \"NGN\")\n        ↓ shows fee (percentage-based) and net USDC amount\n\n2. convert_to_stablecoin(merchant_id, amount, currency, debit_currency: \"NGN\")\n        ↓ deducts NGN from your fiat wallet, credits USDC/USDT\n```\n\n### Key constraints\n\n| Constraint | Detail |\n|---|---|\n| **Network** | Polygon only — no Tron, Solana, or Stellar |\n| **Coins** | USDC and USDT |\n| **Wallet format** | EVM address: `0x` + 40 hex characters (42 total) |\n| **Fiat sources** | NGN or USD for `convert_to_stablecoin`; stablecoin must match `currency` for `send_stablecoin` |\n| **Fee type** | Flat fee for same-currency; percentage fee for fiat → stablecoin |\n\n---\n\n## Web App\n\nThe `app/` directory contains a standalone browser chat interface that wraps this MCP server with a Claude-powered conversation loop.\n\n![Flutterwave MCP-UI Components](https://github.com/user-attachments/assets/d3996cdf-acfd-4bea-81cf-aa7d454a59a6)\n\n### How it works\n\n```\nBrowser  →  POST /api/chat\n               ↓\n           Claude (Sonnet) — all MCP tools injected via advanced-tool-use beta\n               ↓  tool_use\n           MCP Server (this repo, spawned via stdio)\n               ↓\n           Flutterwave API\n```\n\nThe web app uses three Anthropic Advanced Tool Use features:\n\n- **Tool Search** — non-core tools are deferred and loaded on demand, reducing token usage by ~85%\n- **Programmatic Tool Calling** — Claude can write code that calls multiple tools in sequence without inflating the conversation context\n- **Tool Use Examples** — curated `input_examples` for every tool improve parameter accuracy from ~72% to ~90%\n\nThe app returns a rich branded UI card for every tool response — checkout links, transaction details, charge states, transfer summaries, virtual accounts, bill receipts — rendered inline in the chat.\n\n### Running the web app\n\n**Prerequisites**\n\n| Variable | Required | Description |\n|---|---|---|\n| `FLW_SECRET_KEY` | Yes | Your Flutterwave secret key |\n| `FLW_ENCRYPTION_KEY` | For card charges | Your Flutterwave encryption key |\n| `ANTHROPIC_API_KEY` | Yes | Your Anthropic API key |\n\nGet your keys from the [Flutterwave Dashboard](https://dashboard.flutterwave.com) under **Settings → API Keys**.  \nGet your Anthropic key from the [Anthropic Console](https://console.anthropic.com).\n\n**Build and start**\n\n```bash\n# Clone and install\ngit clone https://github.com/bajoski34/mcp-flutterwave.git\ncd mcp-flutterwave\nnpm install\n\n# Build both the MCP server and the web app\nnpm run build:all\n\n# Start\nANTHROPIC_API_KEY=sk-ant-... FLW_SECRET_KEY=FLWSECK_... npm run start:app\n```\n\nThen open [http://localhost:3000](http://localhost:3000).\n\n**Available scripts**\n\n| Script | Description |\n|---|---|\n| `npm run build` | Build the MCP server only |\n| `npm run build:app` | Build the web app only |\n| `npm run build:all` | Build everything |\n| `npm run start:app` | Start the web app (requires a prior build) |\n| `npm run dev:app` | Build everything then start the web app |\n| `npm test` | Run the test suite |\n\n**Port**\n\nSet the `PORT` environment variable to change from the default `3000`.\n\n---\n\n## MCP Server Setup\n\n### Via npm\n\n```bash\nnpm install -g mcp-flutterwave\n```\n\n### Via GitHub\n\n```bash\ngit clone https://github.com/bajoski34/mcp-flutterwave.git\ncd mcp-flutterwave\nnpm install\nnpm run build\n```\n\n### Environment variables\n\n| Variable | Required | Description |\n|---|---|---|\n| `FLW_SECRET_KEY` | Yes | Your Flutterwave secret key |\n| `FLW_ENCRYPTION_KEY` | For card charges | Your Flutterwave encryption key (from Dashboard → Settings → API) |\n\n---\n\n## Usage with Claude Desktop\n\nAdd the following to your `claude_desktop_config.json`. See the [MCP quickstart](https://modelcontextprotocol.io/quickstart/user) for details.\n\nPass `--tools=all` to enable every tool, or supply a comma-separated list to restrict which tools are registered.\n\n### Via npm\n\n```json\n{\n  \"mcpServers\": {\n    \"flutterwave\": {\n      \"command\": \"mcp-flutterwave\",\n      \"args\": [\"--tools=all\"],\n      \"env\": {\n        \"FLW_SECRET_KEY\": \"YOUR_SECRET_KEY\",\n        \"FLW_ENCRYPTION_KEY\": \"YOUR_ENCRYPTION_KEY\"\n      }\n    }\n  }\n}\n```\n\n### Via local build\n\n```json\n{\n  \"mcpServers\": {\n    \"flutterwave\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"/path/to/mcp-flutterwave/build/index.js\",\n        \"--tools=all\"\n      ],\n      \"env\": {\n        \"FLW_SECRET_KEY\": \"YOUR_SECRET_KEY\",\n        \"FLW_ENCRYPTION_KEY\": \"YOUR_ENCRYPTION_KEY\"\n      }\n    }\n  }\n}\n```\n\n### Selective tools\n\n```json\n\"args\": [\n  \"--tools=create_checkout,read_transaction,create_transfer\"\n]\n```\n\n**Accepted tool names** (use `all` to enable everything):\n\n```\ncreate_checkout            disable_checkout\nread_transaction           read_transaction_with_reference\nread_transaction_timeline  resend_transaction_webhook\ncreate_transfer            create_beneficiary            list_beneficiaries\ncreate_payment_plan        get_payment_plans\ncharge_card                charge_bank_account           charge_mobile_money\ncharge_mpesa               charge_ussd                   validate_charge\ncreate_virtual_account     get_virtual_account           update_virtual_account\nlist_virtual_account_bulk\nget_bill_categories        get_bill_providers            get_bill_items\nvalidate_bill_customer     pay_bill                      get_bill_status\nrequest_fx_quote           get_fx_quote\ninitiate_fx_trade          get_fx_trade\ninitiate_bvn_verification  get_bvn_details\nresolve_bank_account       verify_card_bin\nget_stablecoin_fee         send_stablecoin               convert_to_stablecoin\n```\n\n---\n\n## MCP-UI Components\n\nEvery tool returns a rich HTML card alongside its text response, powered by [@mcp-ui/server](https://www.npmjs.com/package/@mcp-ui/server). The cards use Flutterwave's design tokens — navy `#0A0E27`, deep orange `#FF5804`, brand orange `#F5A623`, and the system sans-serif typeface.\n\n### Card charge UI states\n\n| State | Card shown |\n|---|---|\n| PIN required | Step-by-step instructions, transaction reference |\n| AVS required | Required billing address fields as chips |\n| 3DS redirect | Bank authentication URL with a direct link |\n| OTP required | Bank message, `flw_ref` to pass to `validate_charge` |\n| Completed | Amount, status badge, transaction and Flutterwave references |\n\n### Virtual account UI\n\nThe virtual account card shows the bank account number in a large, prominent box alongside the bank name, account type (Static / Dynamic), currency, expiry date, and order reference.\n\n### Bill payment UI\n\n| Tool | Card shown |\n|---|---|\n| `pay_bill` | Bill receipt — biller, item, customer ID, amount, status |\n| `get_bill_status` | Status card with prepaid token (electricity) in large monospace text, with a share note |\n\n### Verification UI\n\n| Tool | Card shown |\n|---|---|\n| `initiate_bvn_verification` | Consent card — customer name (BVN last-4 only), single-use consent link with open button, step-by-step instructions |\n| `get_bvn_details` | Identity card — name, DOB, gender, phone, NIN, state of origin; BVN partially masked; red watchlist badge if flagged |\n| `resolve_bank_account` | Green verified card — account name in large text with account number and bank code |\n| `verify_card_bin` | Brand-coloured card (Visa blue / Mastercard red / Amex blue / dark for others) — brand, type badge, issuer, country |\n\n### Stablecoin UI\n\n| Tool | Card shown |\n|---|---|\n| `get_stablecoin_fee` | Blue-themed fee card — coin pair, flat fee or percentage breakdown, net amount the recipient receives |\n| `send_stablecoin` | Transfer card — truncated wallet address, amount, status badge |\n| `convert_to_stablecoin` | Conversion card — fiat debit currency, target stablecoin, merchant ID, status |\n\n### FX trade UI\n\nBoth `request_fx_quote`/`get_fx_quote` and `initiate_fx_trade`/`get_fx_trade` return dark navy-themed cards:\n\n| State | Card shown |\n|---|---|\n| Quote NEW / PROCESSING | Instrument badge, status pill, poll instruction |\n| Quote READY | Exchange rate, approved quantity, received amount, expiry, call-to-action |\n| Quote FAILED / EXPIRED | Error message with reason |\n| Trade NEW / PENDING | Amount in target currency, poll instruction |\n| Trade SETTLED | Green settled banner, target currency amount, recipient, wallet credit note |\n| Trade FAILED | Red failure banner with `response_message` |\n\nCards are compatible with:\n\n- **Flutterwave Web App** (this repo's `app/`) — rendered inline in the chat\n- **MCP Inspector** — for testing during development\n- **Any MCP client** that supports the `resource` content type with HTML\n\n---\n\n## Contributing\n\nWe welcome contributions! Please read our [Contributing Guide](./CONTRIBUTING.md) for details on how to get started, development guidelines, and how to submit pull requests.\n\n---\n\n## Changelog\n\nAll notable changes are documented in [GitHub Releases](https://github.com/bajoski34/mcp-flutterwave/releases).\n\n---\n\n## Security\n\nIf you discover a security vulnerability, please **do not** open a public issue. Instead, email [olaobajua@gmail.com](mailto:olaobajua@gmail.com) directly. We will respond as quickly as possible.\n\n---\n\n## License\n\nMIT © [Abraham Olaobaju](https://github.com/bajoski34)\n\nSee [LICENSE](./LICENSE) for the full text.\n",
  "bytes": 24456,
  "sha": "39003b198fc4593ccb06df6c40bf1c6a613522c8a588c43373c063d85dc0ed71",
  "repo_slug": "bajoski34/mcp-flutterwave",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_bajoski34_mcp_flutterwave_381d5e2f/readme"
}