MCP Server to interact with Flutterwave APIs. The repository is published under the slug io.github.bajoski34/mcp-flutterwave, providing a Node.js package (mcp-flutterwave) and a Docker image available via ghcr.io/bajoski34/mcp-flutterwave.
π οΈ Key Features
Integrates with Flutterwave APIs via an MCP server.
Distributed as an npm package: mcp-flutterwave.
π Use Cases
Use MCP to perform operations against Flutterwaveβs APIs from an MCP-capable client.
β‘ Developer Benefits
Access via npm and Docker (ghcr.io/mcp--flutterwave).
Repository includes CI workflow badges for automated checks.
Licensed under MIT (per repository excerpt).
β οΈ Limitations
Tool availability and specific MCP endpoints are not provided in the provided data (e.g., toolCount is not listed).
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.
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:
When a second call is needed, pass authorization alongside the original card details:
json
// PIN flow{"authorization":{"mode":"pin","pin":"3310"}}// AVS flow{"authorization":{"mode":"avs_noauth","city":"Lagos","address":"12 Victoria Island","state":"LA","country":"NG","zipcode":"100001"}}
AMEX cards
American Express transactions require the card_holder_name field in addition to standard card details.
Payload encryption
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
Virtual accounts give each customer a dedicated bank account number to make transfers into. Flutterwave notifies your webhook when a payment arrives.
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 Payment Flow
Bill payments follow a 6-step discovery flow. Skip validate_bill_customer for airtime and mobile data.
code
1. get_bill_categories
β choose a category (e.g. UTILITYBILLS)
2. get_bill_providers(category)
β get biller_code (e.g. "BIL127" for IKEDC)
3. get_bill_items(biller_code)
β get item_code and amount info
4. validate_bill_customer(item_code, customer_id) β skip for AIRTIME / MOBILEDATA
β confirm customer name and details
5. pay_bill(biller_code, item_code, customer_id, amount)
β returns reference
6. get_bill_status(reference)
β confirms completion
for electricity: prepaid token is in extra.token β share it with the customer
Supported categories
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).
FX Trade Flow
Currency conversion uses a two-step quote-then-trade flow. Quotes are valid for 5 minutes and available weekdays only (MondayβFriday).
code
1. request_fx_quote(base_currency, target_currency, quantity)
β returns quote_id, status: NEW
2. get_fx_quote(quote_id) β poll until READY or FAILED
β READY: contains rate, approved_quantity, total_value, expiry
3. initiate_fx_trade(quote_id, narration)
β locks in rate, returns trade_id, status: NEW
4. get_fx_trade(trade_id) β poll until SETTLED or FAILED
β SETTLED: converted funds credited to target currency wallet instantly
Supported currency pairs
Pair
Sell
Receive
NGN/USD
Nigerian Naira
US Dollar
GHS/USD
Ghanaian Cedi
US Dollar
USD/NGN
US Dollar
Nigerian Naira
Quote statuses
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
Trade statuses
Status
Meaning
NEW
Trade queued
PENDING
Executing
SETTLED
Funds exchanged and credited to target currency wallet
FAILED
Insufficient balance or processing error
Key constraints
Minimum trade: $1,000 USD equivalent in the base currency
Quote lifetime: 5 minutes from issuance (READY state)
One-time use: Each quote can only be used for one trade
Approved quantity: May differ from requested quantity due to liquidity or account limits β always use approved_quantity for reconciliation
Account enablement: Contact hi@flutterwavego.com to enable FX trading on your account
Verification
Bank Account Resolution
Verify a recipient's account details before sending a transfer. Always show the resolved name to the user before proceeding.
AMEX cards identified via BIN require the card_holder_name field when calling charge_card.
BVN Verification (Nigeria)
Two-step consent flow β customer must approve data sharing on the NIBSS portal.
code
1. initiate_bvn_verification(bvn, firstname, lastname, redirect_url)
β returns reference + single-use consent URL
2. Customer visits consent URL β approves data sharing on NIBSS portal
β webhook (bvn.completed) fires OR poll:
3. get_bvn_details(reference)
β returns name, DOB, gender, phone, NIN, state of origin, watchlist status
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.
Stablecoins
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.
Wallet-to-wallet transfer
code
1. get_stablecoin_fee(amount, currency: "USDT", debit_currency: "USDT")
β shows fee and net amount
2. send_stablecoin(wallet_address, amount, currency, debit_currency)
β returns reference and transfer status
Fiat-to-stablecoin conversion
code
1. get_stablecoin_fee(amount, currency: "USDC", debit_currency: "NGN")
β shows fee (percentage-based) and net USDC amount
2. convert_to_stablecoin(merchant_id, amount, currency, debit_currency: "NGN")
β deducts NGN from your fiat wallet, credits USDC/USDT
Key constraints
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
Web App
The app/ directory contains a standalone browser chat interface that wraps this MCP server with a Claude-powered conversation loop.
Flutterwave MCP-UI Components
How it works
code
Browser β POST /api/chat
β
Claude (Sonnet) β all MCP tools injected via advanced-tool-use beta
β tool_use
MCP Server (this repo, spawned via stdio)
β
Flutterwave API
The web app uses three Anthropic Advanced Tool Use features:
Tool Search β non-core tools are deferred and loaded on demand, reducing token usage by ~85%
Programmatic Tool Calling β Claude can write code that calls multiple tools in sequence without inflating the conversation context
Tool Use Examples β curated 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.
# Clone and install
git clone https://github.com/bajoski34/mcp-flutterwave.git
cd mcp-flutterwave
npm install
# Build both the MCP server and the web app
npm run build:all
# Start
ANTHROPIC_API_KEY=sk-ant-... FLW_SECRET_KEY=FLWSECK_... npm run start:app
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.
Card charge UI states
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
Virtual account UI
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.
Bill payment UI
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
Verification UI
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
Stablecoin UI
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
FX trade UI
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:
Flutterwave Web App (this repo's app/) β rendered inline in the chat
MCP Inspector β for testing during development
Any MCP client that supports the resource content type with HTML
Contributing
We welcome contributions! Please read our Contributing Guide for details on how to get started, development guidelines, and how to submit pull requests.
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.