mcpField
J
Jami

Jami

Local
dev.jami.bioFinance0Updated 5d ago

About Jami

Jami is the official MCP server for JamiDev, enabling agents to work with creator payments and integrate Jami into applications. It provides checkout, order, payout, webhook, and documentation tools, with withdrawals disabled by default.

Key features

  1. 01Create and track ETB checkouts
  2. 02Manage products and orders
  3. 03Preview and track withdrawals
  4. 04Verify and generate webhook events
  5. 05Search and read Jami documentation

Use cases

  1. 01Build a Jami payment integration
  2. 02Reconcile orders and checkout status
  3. 03Estimate payout fees and net amounts
  4. 04Debug webhook signatures and delivery

MCP support

Exposes JamiDev payment, order, payout, webhook, and documentation tools, plus prompts and a reference resource, to MCP clients. It supports stdio and Streamable HTTP transports; withdrawals require explicit enablement.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"kenawak-jami": {
"command": "npx",
"args": [
"-y",
"jami-mcp"
],
"env": {
"JAMI_TOKEN": "<JAMI_TOKEN>",
"JAMI_WEBHOOK_SECRET": "<JAMI_WEBHOOK_SECRET>"
}
}
}
}
Run commandnpx -y jami-mcp
Environment variables to set
JAMI_TOKENSecretJamiDev API token (jamidev_test_… for sandbox, jamidev_live_… for production). Optional: docs and offline tools work without it.
JAMI_WEBHOOK_SECRETSecretDefault webhook subscription secret for the webhook tools.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npmjami-mcp0.3.0

Tools

22

Saved tool list · updated 5d ago

ParameterTypeRequiredDescription
gatewayenumNoPayment method for paid productstelebirr | mpesa | cbe
metadataobjectNoYour own key/values, returned on order webhooks (max 20 keys)
product_idstringNoProduct token (p_…) or id. Omit for a custom-amount checkout.
descriptionstringNoCustom amount only: what the buyer is paying for, e.g. "Order #1042"
success_urlstringNoWhere to send the buyer after paying
amount_minorintegerNoInteger santim. Required for custom amounts (≥ 100) and pay-what-you-want products; ignored for fixed prices
checkout_linkstringNoCheckout link token (cl_…) to attribute this session to
customer_namestringNo
customer_emailstringNoBuyer email for the receipt. Required with gateway; optional for a payment link
customer_phonestringNoBuyer phone, e.g. "251911223344"
collected_fieldsobjectNoAnswers to the product's checkout fields, keyed by field id
customer_external_idstringNoYour own user id, stored on the customer record

Details

From the project README

jami-mcp

The official Model Context Protocol server for JamiDev, the SDK for Jami's creator payouts. Connect it to Claude, Cursor, VS Code, Codex or any MCP client and your agent can create ETB checkouts, watch them settle, reconcile orders, preview and send payouts, debug webhooks, and read the Jami docs while it writes your integration. Payments are processed by ArifPay.

Built on the official jami-sdk, so every tool behaves exactly like the SDK and the REST API.

npx -y jami-mcp

Quick start

  1. Get a token: Jami dashboard → JamiDev → Developer → API Tokens. Start with a sandbox org — its jamidev_test_… token moves no real money.
  2. Add the server to your client (below), with the token as JAMI_TOKEN.
  3. Ask: "Charge [email protected] 1,237 birr for order #1042 on Telebirr, phone 251900000001, and wait for it."

No token yet? The server still runs. The docs, withdrawal-quote and webhook tools work without one, so you can start building right away.

Claude Code
claude mcp add jami -e JAMI_TOKEN=jamidev_test_xxx -- npx -y jami-mcp
Claude Desktop · Cursor · Windsurf

Add to claude_desktop_config.json, ~/.cursor/mcp.json or ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "jami": {
      "command": "npx",
      "args": ["-y", "jami-mcp"],
      "env": { "JAMI_TOKEN": "jamidev_test_xxx" }
    }
  }
}
VS Code

.vscode/mcp.json — VS Code prompts for the token and stores it securely:

{
  "inputs": [
    { "type": "promptString", "id": "jami-token", "description": "JamiDev API token", "password": true }
  ],
  "servers": {
    "jami": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "jami-mcp"],
      "env": { "JAMI_TOKEN": "${input:jami-token}" }
    }
  }
}
Codex

~/.codex/config.toml:

[mcp_servers.jami]
command = "npx"
args = ["-y", "jami-mcp"]
env = { JAMI_TOKEN = "jamidev_test_xxx" }

Tools

ToolWhat it doesNeeds token
jami_create_checkoutCharge a product (p_… token or id) or any amount (amount_minor + description). With gateway: pushes the prompt to the buyer's phone. Without: returns a Jami payment link to send them.✓
jami_create_product · jami_update_productCreate or edit products; each comes back with its public page and p_… token.✓
jami_get_product · jami_list_productsRead the catalog.✓
jami_get_checkout_statusCheck a session once, with the failure reason when it expired.✓
jami_wait_for_checkoutWait for the buyer to finish, with progress updates. Never hangs: returns open at the timeout.✓
jami_list_ordersOrders, newest first, paginated and filterable by status.✓
jami_get_balanceWithdrawable earnings and whether the org can withdraw.✓
jami_quote_withdrawalFee, tax and net for an amount, plus auto-pay and cap checks. Offline.—
jami_create_withdrawalPay out to Telebirr, M-Pesa or CBE Birr. Opt-in (see Safety).✓
jami_get_withdrawal · jami_list_withdrawalsTrack payouts.✓
jami_verify_webhookCheck a captured delivery's signature, and why it fails.—
jami_create_test_webhookBuild a correctly signed test event, and optionally POST it to your local handler.—
jami_search_docs · jami_read_docSearch and read the live docs at dev.jami.bio.—

Every tool returns a readable markdown summary plus typed structuredContent. Pass response_format: "json" for the raw payload. Money is always integer santim, and every parameter that takes money ends in _minor: amount_minor: 15000 = 150.00 ETB.

Prompts: integrate_jami (build a full integration in your stack), go_live_checklist, debug_payment. Resource: jami://reference — fees, limits, sandbox numbers, failure codes and webhook rules in one page.

Safety

The defaults are set so an agent can't move money by accident.

  • Withdrawals are off until you start the server with --enable-withdrawals (or JAMI_ENABLE_WITHDRAWALS=true). When they're on, clients that support elicitation ask you to confirm each payout, and every payout needs an idempotency_key, so a retry can never pay twice. Sandbox tokens are refused before any request is made.
  • --read-only registers only the tools that read data. Use it for reporting agents.
  • Live mode is announced. With a jamidev_live_ token, the server tells the agent that checkouts charge real buyers and to confirm first.
  • Tokens stay in the environment. They never appear in tool output.

Options

--http                 Streamable HTTP on POST /mcp instead of stdio
--port <n>             HTTP port (default 3333)
--host <addr>          HTTP bind address (default 127.0.0.1)
--read-only            Only read tools
--enable-withdrawals   Register jami_create_withdrawal
--base-url <url>       Override the API base (default https://jami.bio/api/jamidev)
--docs-url <url>       Override the docs origin (default https://dev.jami.bio)
EnvPurpose
JAMI_TOKENjamidev_test_… or jamidev_live_…
JAMI_WEBHOOK_SECRETDefault secret for the webhook tools
JAMI_READ_ONLY, JAMI_ENABLE_WITHDRAWALSSame as the flags
Remote (HTTP) mode
npx -y jami-mcp --http --port 3333
# → http://127.0.0.1:3333/mcp   (health check: /healthz)

The HTTP server is stateless, so any number of clients can share one process. Without JAMI_TOKEN, each request authenticates with its own Authorization: Bearer jamidev_… header, which makes one deployment safe to share across teams. On loopback it rejects foreign Host headers (DNS-rebinding protection). In HTTP mode, jami_create_test_webhook never sends requests; it only returns the signed payload and a curl command.

Embedding

import { createJamiServer } from 'jami-mcp';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = createJamiServer({ token: process.env.JAMI_TOKEN, docsUrl: 'https://dev.jami.bio', readOnly: true, withdrawals: false });
await server.connect(new StdioServerTransport());

Development

npm install
npm test          # in-memory MCP client against a mocked API
npm run build
npm run inspect   # opens the MCP Inspector on dist/index.js

Full guide: dev.jami.bio/docs/mcp · Support: [email protected]

MIT © Jami

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.