WariMCP
This server is a unified payment orchestration tool (MCP/HTTP) for West African providers. You can:
List Providers (
list_providers): See all available providers and their configuration.Initiate Payment (
initiate_payment): Start a payment and get a checkout URL.Verify Payment (
verify_payment): Check payment status by transaction ID.Refund Payment (
refund_payment): Issue full or partial refunds.Generate Payment Link (
generate_payment_link): Create shareable payment links.Initiate Payout (
initiate_payout): Disburse funds to mobile money or bank accounts.Verify Payout (
verify_payout): Check payout status.List Transactions (
list_transactions): Retrieve and filter past transactions.Receive Webhooks: Act as a webhook receiver with signature verification.
Multi-Provider & Multi-Mode: Works with CinetPay, Wave, Hub2, etc., in mock, sandbox, or live modes.
MCP & REST: Available over stdio (MCP) and HTTP API.
Security: API key auth, HMAC verification, rate limiting; bring-your-own-keys, no custody.
Database: Requires PostgreSQL for storing transactions and API keys.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@WariMCP Initiate a payment of 5000 XOF via FedaPay to 2250701234567"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
WariMCP
WariMCP is an MCP (Model Context Protocol) server that gives AI agents and REST clients a unified interface to West African payment providers. It exposes 10 providers through a single API — payments, payouts, refunds, webhooks — with FedaPay as the recommended primary and Hub2 as the recommended secondary. Runs as an MCP stdio server (for Claude/Cursor/Windsurf), an Express HTTP API, or both simultaneously.
Quick Start
git clone https://github.com/Bigabou007-dev/warimcp.git
cd warimcp
npm install
cp .env.example .env # edit with your credentials
npm run db:migrate # set up PostgreSQL schema
npm run db:seed-api-key # generate your first API key
npm run dev # starts MCP + HTTP on port 3000Requires Node >= 22 and PostgreSQL 16+.
Related MCP server: momo-mcp
Providers
9 providers are available in the codebase. The recommended production setup is FedaPay + Hub2.
Provider | Key | Region | Methods | Currencies | Status |
FedaPay |
| CI, SN, BJ, TG, BF, ML, NE, GW | MTN, Orange, Moov, Wave, Card | XOF, XAF, GNF | Recommended Primary — live keys, true aggregator |
Hub2 |
| CI, SN, ML, BF, TG, BJ, NE, CM | Mobile Money | XOF, XAF | Recommended Secondary — pending sandbox access |
Wave |
| CI, SN, ML, BF, UG, TZ | Wave wallet | XOF | Requires RCCM |
Flutterwave |
| CI, SN, NG, GH, KE + 4 more | Mobile Money, Card, Bank | XOF, XAF, NGN, GHS, KES, USD, EUR | Available |
KKiaPay |
| CI, SN, BJ, BF, ML, TG, NE, GW | MTN, Orange, Wave, Card | XOF, XAF | Available |
Moneroo |
| CI, SN, BJ, BF + 10 more | MTN, Orange, Wave, Moov, Card, Bank | XOF, XAF, GNF, CDF, NGN, GHS, KES, USD, EUR | Available |
MTN MoMo |
| CI, GH, UG, RW, BJ, CM, CG | MTN Mobile Money | EUR | Available |
PAPSS |
| CI, KE, NG, GH | Bank Transfer | XOF, KES, NGN, GHS | Future |
Mock |
| All | All | All | Testing only |
Set WARIMCP_MODE=mock to route all providers through the mock provider (no API keys needed).
API Endpoints
All payment/payout endpoints require an X-Api-Key header. Generate keys with npm run db:seed-api-key.
Method | Path | Auth | Description |
|
| No | Health check |
|
| No | List all providers and their config status |
|
| Yes | Initiate a payment (returns checkout URL) |
|
| Yes | Verify payment status |
|
| Yes | Full or partial refund |
|
| Yes | List transactions (filterable by provider, status) |
|
| Yes | Generate a shareable payment link |
|
| Yes | Disburse to mobile money or bank |
|
| Yes | Verify payout status |
|
| No | Inbound webhook receiver (signature-verified) |
MCP Tools
When registered as an MCP server, WariMCP exposes these tools to AI agents:
Tool | Description |
| List all providers, their config status, and supported rails |
| Start a payment via any provider — returns a checkout URL |
| Check the status of a payment by transaction ID |
| Issue a full or partial refund |
| List recent transactions with provider/status filters |
| Create a shareable payment link |
| Disburse funds to a mobile money wallet or bank account |
| Check the status of a payout |
MCP Registration
Register WariMCP with any MCP client (Claude Desktop, Cursor, Windsurf, VS Code) using npx:
{
"mcpServers": {
"warimcp": {
"command": "npx",
"args": ["-y", "warimcp"],
"env": {
"WARIMCP_TRANSPORT": "stdio",
"WARIMCP_MODE": "live",
"DATABASE_URL": "postgresql://warimcp:yourpass@localhost:5432/warimcp",
"FEDAPAY_SECRET_KEY": "your-own-fedapay-key"
}
}
}
}Bring your own keys.
FEDAPAY_SECRET_KEYis your FedaPay account — settlement goes to you, never to an intermediary. SetWARIMCP_MODE=mockto exercise the tools with no keys and no real money. A reachable PostgreSQL instance is required (DATABASE_URL); runnpm run db:migrateagainst it once. For local development, pointcommandatnodeandargsatdist/index.jsinstead.
Security
Helmet with Content-Security-Policy (default-src 'self', no inline scripts)
Timing-safe HMAC verification for Wave and Hub2 webhooks (
crypto.timingSafeEqual)HMAC-SHA256 signed webhook relay — outbound relays include
X-WariMCP-SignatureheaderAPI key auth with SHA-256 hashed storage, per-key permissions, and per-key rate limits
Token bucket rate limiting — 60 req/min default per API key
Error sanitization — provider errors are caught and rewritten; internal details never leak to clients
Non-root Docker user — container runs as dedicated
warimcpuser (UID 1001)Zod validation on all inputs with strict schemas (amount bounds, phone format, UUID checks)
No Custody (Bring Your Own Keys)
WariMCP holds no funds and ships no credentials. It only instructs licensed payment service providers; money settles directly into the account that the keys belong to — never an intermediary account. Each operator runs their own instance with their own PSP credentials and is the merchant of record, responsible for their own licensing and regulatory compliance.
An earlier "manual payment collection" feature (which routed funds into a personal mobile-money account with SMS reconciliation) was removed in 2026-06 as incompatible with this no-custody posture. Do not reintroduce custody of third-party funds.
Configuration
All configuration is via environment variables (see .env.example):
# Mode: mock | sandbox | live
WARIMCP_MODE=mock
# Transport: stdio | http | both
WARIMCP_TRANSPORT=both
WARIMCP_PORT=3000
# Database
DATABASE_URL=postgresql://warimcp:changeme@localhost:5432/warimcp
# Primary — FedaPay
FEDAPAY_SECRET_KEY=
FEDAPAY_PUBLIC_KEY=
# Secondary — Hub2
HUB2_API_KEY=
# Other providers (configure as needed)
WAVE_API_KEY=
WAVE_WEBHOOK_SECRET=
FLUTTERWAVE_SECRET_KEY=
FLUTTERWAVE_PUBLIC_KEY=
KKIAPAY_PUBLIC_KEY=
KKIAPAY_PRIVATE_KEY=
KKIAPAY_SECRET=
MONEROO_SECRET_KEY=
MTN_MOMO_COLLECTION_SUBSCRIPTION_KEY=
MTN_MOMO_API_USER=
MTN_MOMO_API_KEY=
MTN_MOMO_ENVIRONMENT=sandbox
MTN_MOMO_CALLBACK_URL=
PAPSS_API_KEY=
# Webhooks
WARIMCP_WEBHOOK_BASE_URL=
WARIMCP_RELAY_SECRET=Docker Deployment
# Set DB_PASSWORD in .env, then:
docker compose up -dRuns two containers on the npm_proxy network:
warimcp — Node 22 Alpine, non-root, 512 MB limit, health-checked at
/healthwarimcp_db — PostgreSQL 16 Alpine, 256 MB limit, persistent volume
The HTTP transport is used in Docker (WARIMCP_TRANSPORT=http). For MCP stdio access, run the server directly with node dist/index.js.
Roadmap
Phase 1 (current): FedaPay as primary aggregator + Hub2 as secondary. All 10 provider adapters implemented. No-custody, bring-your-own-keys posture.
Phase 2: Wave activation once RCCM is filed. Full webhook verification for all active providers. Automatic provider fallback (FedaPay -> Hub2).
Phase 3: PAPSS pan-African corridor (CI to KE/NG/GH). Multi-currency settlement. Bulk payouts.
Production status
Sandbox-first spike (2026-08-05, board-reviewed). The agentic bridge (
authorize_and_pay) is NOT production-ready for multi-merchant use. Known gaps, tracked as product requirements indocs/superpowers/specs/2026-08-05-track4-whatsapp-merchant-product.md§10: trusted agent keys are env-based (a per-merchant key registry is required), the replay-nonce store is in-memory (a persistent store is required), and payment mandates carry no customer identity. No tenant isolation exists yet: do not run more than one merchant on a shared instance. No real-money operation before the regulatory gate chain completes (RCCM, ARTCI, counsel review).
License
License policy (2026-08-05): WariMCP core is and stays MIT. Commercial offerings (partner integrations, hosted services) are separate layers and do not change the license of this repository.
Available Tools
8 toolsgenerate_payment_linkC
Generate a shareable payment link for a customer
Inputs: amount (required), currency, provider, description.
initiate_paymentC
Initiate a payment through any configured WariMCP provider. Returns a checkout URL for the customer.
Inputs: amount (required), customerName (required), customerPhone (required), idempotencyKey (required), +6 more.
initiate_payoutA
Disburse funds to a mobile money wallet or bank account (seller payouts)
Inputs: amount (required), recipientName (required), idempotencyKey (required), recipientPhone (required), +3 more.
list_providersA
List all WariMCP payment providers, their configuration status, and supported rails
Inputs: no named parameters.
list_transactionsB
List recent payment transactions with optional filters
Inputs: limit, offset, status, provider.
refund_paymentB
Issue a refund for a completed payment transaction
Inputs: transactionId (required), amount, reason.
verify_paymentB
Check the status of a payment transaction
Inputs: transactionId (required).
verify_payoutA
Check the status of a payout
Inputs: payoutId (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Tools are mostly distinct, but initiate_payment and generate_payment_link both create payment flows, which could cause confusion. Other tools (verify, refund, list, payout) are clearly separated.
All tools follow a consistent verb_noun pattern with clear verbs (list, initiate, verify, refund, generate) and nouns (providers, payment, link, payout, transactions). No mixed conventions.
8 tools is well-scoped for a payments server, covering payment and payout operations without unnecessary bloat.
The server covers the main payment lifecycle (initiate, verify, refund, list) and payout lifecycle (initiate, verify). Missing a dedicated single-transaction retrieval or cancel operation, but these can be worked around with list/verify.
Related MCP Connectors
Discover and call 10,000+ production APIs from one MCP server. Pay-per-call billing for AI agents.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
African intelligence infrastructure for AI apps, developers, and data products via MCP.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
FlicenseNot gradedqualityDmaintenanceOpen-source MCP server that streamlines payment integration for AI agents and financial apps in Africa, providing unified tools for providers like M-Pesa.1-- AlicenseNot gradedqualityBmaintenanceAn MCP server for Mobile Money in Francophone West Africa that enables AI agents to make payments via MTN MoMo (sandbox) using tools like request_payment, check_payment_status, and disburse_payment.1MIT
- AlicenseNot gradedqualityBmaintenanceA remote MCP server that lets any AI agent accept payments in Nigeria via cards, bank transfer, USSD, and mobile money through Paystack.MIT
- AlicenseCqualityDmaintenanceAn MCP server that enables AI assistants to interact with Interswitch APIs for payments, transfers, VAS, cardless paycodes, Transaction Search, Card 360, lending, payouts, agency banking, and fintech card-processing utilities.7474 npm1MIT