The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the MCP Flutterwave listing page.
An MCP (Model Context Protocol) 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.
Note: This server currently targets the Flutterwave v3 API. Support for v4 is coming soon.
Also 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.
Pull the image:
The 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:
The -i flag keeps stdin open so Claude Desktop can communicate with the server over stdio.
Requirements: Node.js 20 or later (for npm/npx).
| Tool | Description |
|---|---|
create_checkout | Create a hosted Flutterwave payment link |
disable_checkout | Disable an existing payment link |
| Tool | Description |
|---|---|
charge_card | Directly charge a debit or credit card — handles PIN, AVS, 3DS, and OTP flows |
charge_bank_account | Debit a bank account (NGN / GHS) |
charge_mobile_money | Mobile money — Ghana, Uganda, Rwanda, Zambia, Francophone Africa |
charge_mpesa | M-Pesa charge (KES) |
charge_ussd | USSD charge (NGN) |
validate_charge | Validate a pending charge using OTP |
| Tool | Description |
|---|---|
read_transaction | Get transaction details by ID |
read_transaction_with_reference | Get transaction details by tx_ref |
read_transaction_timeline | View the event timeline for a transaction |
resend_transaction_webhook | Resend a failed webhook |
| Tool | Description |
|---|---|
create_transfer | Initiate a bank transfer |
create_beneficiary | Save a new transfer beneficiary |
list_beneficiaries | List all saved beneficiaries |
| Tool | Description |
|---|---|
create_payment_plan | Create a recurring payment plan |
get_payment_plans | List payment plans with optional filters |
| Tool | Description |
|---|---|
create_virtual_account | Create a dedicated bank account number for a customer (NGN or GHS) |
get_virtual_account | Retrieve a virtual account's status and details by order_ref |
update_virtual_account | Link or update the BVN on an NGN virtual account |
list_virtual_account_bulk | List all accounts created in a bulk batch |
| Tool | Description |
|---|---|
get_bill_categories | List available bill categories (AIRTIME, CABLEBILLS, UTILITYBILLS, etc.) |
get_bill_providers | List billers/providers for a category |
get_bill_items | List payable items for a specific biller |
validate_bill_customer | Validate a customer account before payment (meter number, smartcard, etc.) |
pay_bill | Submit a bill payment |
get_bill_status | Check payment status and retrieve prepaid tokens (electricity) |
| Tool | Description |
|---|---|
request_fx_quote | Submit a Request For Quote (RFQ) for a currency conversion |
get_fx_quote | Poll the quote status — wait for READY before trading |
initiate_fx_trade | Lock in a READY quote and execute the trade |
get_fx_trade | Poll trade status until SETTLED or FAILED |
| Tool | Description |
|---|---|
initiate_bvn_verification | Begin a BVN identity check — returns a single-use customer consent URL |
get_bvn_details | Retrieve full BVN identity data after consent is given |
resolve_bank_account | Look up the account holder name for a bank account number |
verify_card_bin | Look up card brand, type, issuer, and country from the first 6 digits |
| Tool | Description |
|---|---|
get_stablecoin_fee | Get the transfer fee before sending — shows net amount the recipient receives |
send_stablecoin | Send USDC or USDT to a Polygon wallet address |
convert_to_stablecoin | Convert NGN or USD fiat balance into USDC or USDT |
Direct card charges are multi-step. The charge_card tool handles every stage automatically and tells Claude what to do next.
When a second call is needed, pass authorization alongside the original card details:
American Express transactions require the card_holder_name field in addition to standard card details.
Card 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.
Virtual accounts give each customer a dedicated bank account number to make transfers into. Flutterwave notifies your webhook when a payment arrives.
| Feature | NGN | GHS |
|---|---|---|
| Dynamic (one-time) | ✓ — set amount, expires in ~1 hr | ✓ — use frequency and duration |
| Static (reusable) | ✓ — is_permanent: true, BVN required | ✓ — is_permanent: true |
| BVN required | Static accounts only | No |
After creation, save the order_ref — it is the key for retrieving or updating the account via get_virtual_account and update_virtual_account.
Bill payments follow a 6-step discovery flow. Skip validate_bill_customer for airtime and mobile data.
| Code | Description |
|---|---|
AIRTIME | Mobile airtime top-up |
MOBILEDATA | Data bundle purchase |
CABLEBILLS | Cable TV (DSTV, GOTV, StarTimes) |
INTSERVICE | Internet service subscriptions |
UTILITYBILLS | Electricity (prepaid & postpaid) |
TAX | Government tax payments |
DONATIONS | Charitable donations |
TRANSLOG | Transport / logistics |
DEALPAY | Deal payments |
RELINST | Religious institutions |
SCHPB | School / education payments |
Bill payments are available for Nigeria only (
country: NG).
Currency conversion uses a two-step quote-then-trade flow. Quotes are valid for 5 minutes and available weekdays only (Monday–Friday).
| Pair | Sell | Receive |
|---|---|---|
| NGN/USD | Nigerian Naira | US Dollar |
| GHS/USD | Ghanaian Cedi | US Dollar |
| USD/NGN | US Dollar | Nigerian Naira |
| Status | Meaning |
|---|---|
NEW | Quote is being priced |
READY | Rate locked — call initiate_fx_trade now |
PROCESSING | A trade has been initiated on this quote |
EXPIRED | 5-minute window passed — submit a new quote |
FAILED | Pair unsupported, minimum not met, or account limit exceeded |
| Status | Meaning |
|---|---|
NEW | Trade queued |
PENDING | Executing |
SETTLED | Funds exchanged and credited to target currency wallet |
FAILED | Insufficient balance or processing error |
approved_quantity for reconciliationVerify a recipient's account details before sending a transfer. Always show the resolved name to the user before proceeding.
Common bank codes: 044 Access Bank · 057 Zenith Bank · 058 GTBank · 033 UBA · 011 First Bank
Identify card metadata from the first 6 digits of a card number.
AMEX cards identified via BIN require the
card_holder_namefield when callingcharge_card.
Two-step consent flow — customer must approve data sharing on the NIBSS portal.
Requires Flutterwave account enablement — contact hi@flutterwavego.com. If the customer has already consented,
initiate_bvn_verificationreturnsurl: nulland you can callget_bvn_detailsimmediately.
Send 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.
| Constraint | Detail |
|---|---|
| Network | Polygon only — no Tron, Solana, or Stellar |
| Coins | USDC and USDT |
| Wallet format | EVM address: 0x + 40 hex characters (42 total) |
| Fiat sources | NGN or USD for convert_to_stablecoin; stablecoin must match currency for send_stablecoin |
| Fee type | Flat fee for same-currency; percentage fee for fiat → stablecoin |
The app/ directory contains a standalone browser chat interface that wraps this MCP server with a Claude-powered conversation loop.
The web app uses three Anthropic Advanced Tool Use features:
input_examples for every tool improve parameter accuracy from ~72% to ~90%The 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.
Prerequisites
| Variable | Required | Description |
|---|---|---|
FLW_SECRET_KEY | Yes | Your Flutterwave secret key |
FLW_ENCRYPTION_KEY | For card charges | Your Flutterwave encryption key |
ANTHROPIC_API_KEY | Yes | Your Anthropic API key |
Get your keys from the Flutterwave Dashboard under Settings → API Keys.
Get your Anthropic key from the Anthropic Console.
Build and start
Then open http://localhost:3000.
Available scripts
| Script | Description |
|---|---|
npm run build | Build the MCP server only |
npm run build:app | Build the web app only |
npm run build:all | Build everything |
npm run start:app | Start the web app (requires a prior build) |
npm run dev:app | Build everything then start the web app |
npm test | Run the test suite |
Port
Set the PORT environment variable to change from the default 3000.
| Variable | Required | Description |
|---|---|---|
FLW_SECRET_KEY | Yes | Your Flutterwave secret key |
FLW_ENCRYPTION_KEY | For card charges | Your Flutterwave encryption key (from Dashboard → Settings → API) |
Add the following to your claude_desktop_config.json. See the MCP quickstart for details.
Pass --tools=all to enable every tool, or supply a comma-separated list to restrict which tools are registered.
Accepted tool names (use all to enable everything):
Every tool returns a rich HTML card alongside its text response, powered by @mcp-ui/server. The cards use Flutterwave's design tokens — navy #0A0E27, deep orange #FF5804, brand orange #F5A623, and the system sans-serif typeface.
| State | Card shown |
|---|---|
| PIN required | Step-by-step instructions, transaction reference |
| AVS required | Required billing address fields as chips |
| 3DS redirect | Bank authentication URL with a direct link |
| OTP required | Bank message, flw_ref to pass to validate_charge |
| Completed | Amount, status badge, transaction and Flutterwave references |
The 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.
| Tool | Card shown |
|---|---|
pay_bill | Bill receipt — biller, item, customer ID, amount, status |
get_bill_status | Status card with prepaid token (electricity) in large monospace text, with a share note |
| Tool | Card shown |
|---|---|
initiate_bvn_verification | Consent card — customer name (BVN last-4 only), single-use consent link with open button, step-by-step instructions |
get_bvn_details | Identity card — name, DOB, gender, phone, NIN, state of origin; BVN partially masked; red watchlist badge if flagged |
resolve_bank_account | Green verified card — account name in large text with account number and bank code |
verify_card_bin | Brand-coloured card (Visa blue / Mastercard red / Amex blue / dark for others) — brand, type badge, issuer, country |
| Tool | Card shown |
|---|---|
get_stablecoin_fee | Blue-themed fee card — coin pair, flat fee or percentage breakdown, net amount the recipient receives |
send_stablecoin | Transfer card — truncated wallet address, amount, status badge |
convert_to_stablecoin | Conversion card — fiat debit currency, target stablecoin, merchant ID, status |
Both request_fx_quote/get_fx_quote and initiate_fx_trade/get_fx_trade return dark navy-themed cards:
| State | Card shown |
|---|---|
| Quote NEW / PROCESSING | Instrument badge, status pill, poll instruction |
| Quote READY | Exchange rate, approved quantity, received amount, expiry, call-to-action |
| Quote FAILED / EXPIRED | Error message with reason |
| Trade NEW / PENDING | Amount in target currency, poll instruction |
| Trade SETTLED | Green settled banner, target currency amount, recipient, wallet credit note |
| Trade FAILED | Red failure banner with response_message |
Cards are compatible with:
app/) — rendered inline in the chatresource content type with HTMLWe welcome contributions! Please read our Contributing Guide for details on how to get started, development guidelines, and how to submit pull requests.
All notable changes are documented in GitHub Releases.
If you discover a security vulnerability, please do not open a public issue. Instead, email olaobajua@gmail.com directly. We will respond as quickly as possible.
MIT © Abraham Olaobaju
See LICENSE for the full text.