Skip to main content
M-Pesa Daraja Agent Kit: Agent Skills and an MCP server for Safaricom's Daraja API. You ask your agent to charge a phone number; the customer gets an M-Pesa PIN prompt; the agent reports SUCCESS with the receipt number.

mpesa-daraja-mcp

The MCP server in the M-Pesa Daraja Agent Kit. It lets an AI agent call Safaricom's Daraja API safely.

An MCP server that exposes Safaricom's Daraja APIs as tools, so an agent (Claude Code, Codex, Cursor, Gemini CLI, any MCP client) can collect payments, check whether they went through, and operate M-Pesa from a chat. It starts in the sandbox, and nothing live happens until you switch it on.

It pairs with the Agent Skills in the same kit: the skills teach an agent how to integrate M-Pesa, and this server lets it call Daraja. You can use either on its own.

Who it's for

  • Developers building payment integrations: ask your agent to run a request against the sandbox and read the real response.
  • Learners finding out how the Daraja API works: send real requests to a safe test environment and see what comes back.
  • Businesses and teams that want an AI agent to handle payments: collecting them, checking whether they went through, and reconciling them.

Install

Let your agent do it. Paste this into Claude Code, Codex, Cursor, Gemini CLI or any coding agent:

Add the M-Pesa Daraja MCP server to yourself, named "mpesa", with the command: uvx mpesa-daraja-mcp
It needs no keys in your config. If uv is missing, tell me how to install it first.
Don't ask me for my Daraja keys. Tell me to run `uvx mpesa-daraja-mcp setup` in my own terminal,
which saves them privately, then to restart you.
After I restart you, call mpesa_check_credentials and tell me if everything works.

Or do it yourself. You need uv. The wizard asks for your Daraja keys (secrets are typed hidden), checks them live with Safaricom, saves them to a file only you can read, and registers the server with Claude Code, Codex, Gemini CLI or Cursor:

uvx mpesa-daraja-mcp setup

Then restart your agent and ask: "Check my M-Pesa credentials, then send a KES 1 STK push to 0712345678 and tell me when it's paid." The full Agent Kit, with the skills and more examples, is in the main README.

Tools

Tool Daraja API Moves money
mpesa_explain_code — offline error/result code lookup
mpesa_normalize_phone — offline 07… → 2547…
mpesa_generate_stk_password — offline Password + EAT Timestamp
mpesa_parse_callback — offline parse of any callback payload
mpesa_setup_status — offline: what's configured and missing per toolset (no values)
mpesa_check_credentials OAuth token (never returned)
mpesa_get_result Final status by idempotency key or any Daraja ID (from captured callbacks; STK falls back to STK Query)
mpesa_stk_push_and_wait M-Pesa Express: push, then wait for callback / poll query; returns SUCCESS, FAILED or UNKNOWN ✅
mpesa_stk_push / mpesa_stk_query M-Pesa Express, fire-and-forget / status ✅ /
mpesa_c2b_register_urls / mpesa_c2b_simulate C2B v2 (simulate = sandbox only)
mpesa_pull_transactions Pull Transactions query
mpesa_b2c_payment B2C v3, B2Pochi ✅
mpesa_b2b_payment BusinessPayBill, BusinessBuyGoods, BusinessPayToBulk (B2C top-up), PayTaxToKRA ✅
mpesa_b2b_express_checkout B2B USSD push ✅
mpesa_transaction_status / mpesa_account_balance Status / Balance (async result)
mpesa_reverse_transaction Reversal ✅
mpesa_generate_dynamic_qr Dynamic QR, saved as a PNG file (path returned, not the image)
mpesa_ratiba_create_standing_order M-Pesa Ratiba ✅
mpesa_bill_manager_optin / mpesa_bill_manager_send_invoice / mpesa_bill_manager_cancel_invoice Bill Manager

Tool annotations mark money-moving tools as destructiveHint, so MCP clients ask for approval.

Safety

  • Defaults to the sandbox.
  • In production, money-moving tools refuse to run unless DARAJA_ALLOW_LIVE_MONEY_MOVEMENT=true.
  • Callback URLs must be HTTPS; C2B URLs with mpesa/safaricom in them are rejected up front.
  • Tokens and secrets are never returned in tool output.
  • Responses with ResponseCode "0" are tagged _note: ACCEPTED for processing only, so the agent does not report them as completed payments.
  • Idempotent money tools. Each request is stored under an idempotency key. Repeating the key returns the stored request (duplicate: true) instead of paying again.
    • Only a definitively FAILED request is re-sent.
    • ACCEPTED or UNKNOWN requests (queue timeouts, network errors) are never re-sent until their result is known.
    • B2C, B2B and B2B Express require an explicit idempotency_key, e.g. refund-order-1042. Reversal, tax and Ratiba derive one from the transaction ID, the PRN and phone + name respectively. For STK the key is optional.

Configuration

Variable Required Notes
DARAJA_ENV sandbox (default) or production
DARAJA_CONSUMER_KEY, DARAJA_CONSUMER_SECRET ✅ From your Daraja app
DARAJA_SHORTCODE most tools Paybill / store number (174379 in sandbox)
DARAJA_PASSKEY STK Lipa na M-Pesa passkey
DARAJA_INITIATOR_NAME B2C/B2B/status/balance/reversal API operator username
DARAJA_SECURITY_CREDENTIAL same Pre-encrypted credential, or set the next two
DARAJA_INITIATOR_PASSWORD + DARAJA_CERT_PATH Server encrypts the password with the cert at startup
DARAJA_CALLBACK_BASE_URL e.g. https://abc.ngrok-free.app; tools append /mpesa/stk/callback, /mpesa/b2c/result, …
DARAJA_ALLOW_LIVE_MONEY_MOVEMENT true to allow production charges/payouts
DARAJA_CALLBACK_LISTEN e.g. 127.0.0.1:8787: starts the built-in callback receiver
DARAJA_CALLBACK_TOKEN with receiver 16+ random characters. Callback URLs become <base>/cb/<token>/…
DARAJA_STATE_DB SQLite file for requests and results (default ~/.mpesa-mcp/state.db)
DARAJA_TOOLSETS Comma list of stk,c2b,payouts,ops,qr,ratiba,billmanager (core is always on). Default: all
DARAJA_OUTPUT_DIR Where QR PNGs are saved (default ~/.mpesa-mcp/qr)

Commands and configuration files

uvx mpesa-daraja-mcp setup     # guided: keys (hidden input), live check, save, register with your agents
uvx mpesa-daraja-mcp status    # what's configured (masked) + a live key check
uvx mpesa-daraja-mcp           # the MCP server itself, on stdio: what your agent runs

The server needs no flags or environment variables in your agent's config. Settings are read in this order, highest first:

  1. Environment variables, e.g. from the client's env block.
  2. A project .env in the folder the agent starts the server in, or the file named by DARAJA_DOTENV. Only DARAJA_* lines are read.
  3. The user config file that setup writes: ~/.config/mpesa-daraja-mcp/config.env (Windows: %APPDATA%\mpesa-daraja-mcp\config.env; override the folder with DARAJA_CONFIG_DIR). It is readable only by you.

The server starts even when unconfigured. Tools then explain what's missing, and mpesa_setup_status lists the gaps for each toolset without revealing any values.

To register by hand: claude mcp add --scope user mpesa -- uvx mpesa-daraja-mcp. Every other agent is covered in docs/clients.md. The older mpesa-mcp command still works.

Results and callbacks

Every money or async tool returns one shape:

{"status": "ACCEPTED | SUCCESS | FAILED | UNKNOWN", "message": "...", "idempotency_key": "...",
 "duplicate": false, "ids": {"checkout_request_id": "..."}, "receipt": "...", "result_code": "...",
 "explanation": "...", "raw": {}}

To let the agent see final results, enable the built-in receiver:

export DARAJA_CALLBACK_LISTEN=127.0.0.1:8787
export DARAJA_CALLBACK_TOKEN=$(python -c "import secrets; print(secrets.token_urlsafe(24))")
ngrok http 8787                        # sandbox; use a reverse proxy with TLS in production
export DARAJA_CALLBACK_BASE_URL=https://<tunnel-host>

Callbacks are stored in DARAJA_STATE_DB:

  • mpesa_get_result(id) reads them.
  • mpesa_stk_push_and_wait returns the final outcome in one call.
  • Queue-timeout callbacks are recorded as UNKNOWN.
  • C2B validation requests are always accepted. Use your own receiver if you need to reject payments.

Without the receiver, mpesa_stk_push_and_wait still works through STK Query. For other APIs, paste a received payload into mpesa_parse_callback.

Load only the tools you need

Every tool the server offers takes up space in your agent's context, even when it's never called. Set DARAJA_TOOLSETS to the groups you use, and the agent sees only those tools. The basic tools (core) are always on; leave the setting unset to load everything.

Setting You get Good for
unset (default) all 24 tools exploring everything
stk the basic tools plus the 3 STK Push tools a shop that only takes STK payments
stk,payouts the above, plus B2C, B2B and B2B Express a platform that collects and pays out
stk,c2b,ops STK, C2B, then transaction status, balance and reversal reconciliation and support

The groups are stk, c2b, payouts, ops, qr, ratiba and billmanager.

Development

pip install -e ".[dev]"
pytest

Tests use respx to mock Daraja. Nothing hits the network.

License

MIT © 2026 Mr-Macharia. An independent open-source project, not affiliated with or endorsed by Safaricom PLC. M-Pesa and Daraja are trademarks of Safaricom PLC.

Metadata

Release files for mpesa-daraja-mcp 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mpesa-daraja-mcp 0.1.3
File Size Uploaded Provenance
mpesa_daraja_mcp-0.1.3.tar.gz 51.8 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for mpesa-daraja-mcp 0.1.3
File Interpreter ABI Platform
mpesa_daraja_mcp-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 90.8 kB

Release files / mpesa_daraja_mcp-0.1.3.tar.gz

Download URL mpesa_daraja_mcp-0.1.3.tar.gz
Size 51.8 kB
Tags Source
SHA-256 checksum
How to use checksums
0affb01d9491b5b0333c50632124009a3bf87b740aa327e33b6c1c7acf2dc77e
BLAKE2b-256 checksum
How to use checksums
957d396a27ad0f9b18fc28902760f96148b19a15f91aaf0797d7bc514763ff3a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Release files / mpesa_daraja_mcp-0.1.3-py3-none-any.whl

Download URL mpesa_daraja_mcp-0.1.3-py3-none-any.whl
Size 39.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e6494dbc5045c1a38d558c6587afc4ec01216f05e2497da29596bc36cb6198c4
BLAKE2b-256 checksum
How to use checksums
d3084aaacfe104560bb529f6aa90cc798ca26f4b0e20371daaf49666bb3d8054
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Security for mpesa-daraja-mcp 0.1.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for mpesa_daraja_mcp-0.1.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page