jami-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| JAMI_TOKEN | No | JamiDev API token, either a sandbox token (jamidev_test_…) or a live token (jamidev_live_…). Optional: without it the server still runs and the docs, withdrawal-quote and webhook tools work; in HTTP mode each request can instead authenticate with its own Authorization: Bearer header. | |
| JAMI_READ_ONLY | No | Same as the --read-only flag: registers only the tools that read data. Use it for reporting agents. | |
| JAMI_WEBHOOK_SECRET | No | Default secret for the webhook tools (jami_verify_webhook and jami_create_test_webhook). | |
| JAMI_ENABLE_WITHDRAWALS | No | Same as the --enable-withdrawals flag: registers jami_create_withdrawal. Withdrawals are off by default so an agent can't move money by accident. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| jami_create_checkoutA | Start a checkout and get back how the buyer pays — either for one of the organization's published products, or for ANY amount with no product ("charge this buyer 1,237 ETB for order #1042"). Buyers pay in ETB via Telebirr, M-Pesa or CBE Birr; nothing is added on top. In LIVE mode a "direct" checkout pushes a real payment prompt to the buyer's phone, so only call this when the user actually wants to charge someone. What to charge:
How to collect it:
Args:
Returns: { session_id, kind: 'free' | 'redirect' | 'direct', checkout_url, order_id }.
|
| jami_get_checkout_statusA | Check a checkout session once. The server reconciles with the payment provider on every call, so this resolves even when webhooks are late. Args:
Returns: { session_id, status: 'open' | 'completed' | 'expired', order_id, order_status, amount_minor, amount, expires_at, failure }. When status is 'expired', failure.code explains why: payment_rejected · payment_failed · payment_canceled · payment_timed_out · initiate_failed · session_expired. Use jami_wait_for_checkout instead if you want to block until the buyer finishes. |
| jami_wait_for_checkoutA | Poll a checkout session until it's paid or ends, up to timeout_seconds. Reports progress while it waits. If the buyer hasn't finished when the timeout hits, this returns status 'open' (not an error) — call it again to keep waiting. Sessions expire 30 minutes after creation. Args:
Returns the same shape as jami_get_checkout_status. |
| jami_create_productA | Create a product the organization sells, and get its public Jami page (url) and p_… token. Published by default, so the page and checkouts work immediately. Pricing (can't be changed after creation; the amounts can):
Args: title (1–120 chars), pricing_model, amount_minor / minimum_amount_minor, description?, status? ('published' | 'draft'). Returns: { product_id, token, url, title, status, pricing_model, price }. To charge for it, call jami_create_checkout with product_id = token (omit gateway for a payment link). |
| jami_update_productA | Change a product's title, description, status or price amount. The pricing model itself is locked. Args: product_id (p_… token or id), and any of: title, description, status ('published' | 'draft' | 'archived' — archived stops new sales), amount_minor (fixed price), minimum_amount_minor (flexible floor). |
| jami_get_productA | Fetch one product by its p_… token or id: price, status, and its public page url. |
| jami_list_productsA | List the organization's products, newest first. Args: status ('published' | 'draft' | 'archived', optional), page (default 1), limit 1–100 (default 20). Returns: { products: [{ product_id, token, url, title, status, pricing_model, price }], total, page, limit, count, has_more, next_page }. |
| jami_list_ordersA | List the organization's orders, newest first, one page at a time. Args:
Returns: { orders: [{ order_id, status, amount_minor, amount, product: { id, title }, customer: { id, email, name }, paid_at, created_at, metadata }], total, page, limit, count, has_more, next_page }. To total revenue or find a specific buyer, page through with next_page until has_more is false. Amounts are integer santim (100 = 1.00 ETB); this is what buyers paid, before any withdrawal fee. |
| jami_get_balanceA | Get the organization's withdrawable JamiDev earnings — the ceiling on what jami_create_withdrawal can pay out. Returns: { balance_minor, balance, eligible, currency }. eligible is false (and balance 0) when the org can't withdraw yet: it's a sandbox org, Developer Mode is off, or KYC isn't approved. The money itself sits in the owner's unified Jami wallet, so a withdrawal can still fail with 402 if that wallet was spent elsewhere. |
| jami_quote_withdrawalA | Preview what reaches the destination for a withdrawal — offline, no API call, works without a token. The JamiDev usage fee (7% unless Jami set a custom rate on the account) and any government tax are cut FROM the amount: you withdraw amount, the account receives net. Rounding is round-half-up per component. The server is authoritative; the real breakdown comes back on the withdrawal. Args:
Returns the breakdown plus whether the amount auto-pays (≤ 10,000 ETB) or goes to manual review, and the per-org 100,000 ETB rolling-24h cap. |
| jami_get_withdrawalA | Fetch one withdrawal by id to track it from pending → processing → completed (or rejected). Args:
|
| jami_list_withdrawalsA | List the organization's withdrawals, newest first. Args:
Returns: { withdrawals: [...], total, page, limit, count, has_more, next_page }. |
| jami_verify_webhookA | Check whether a webhook delivery is genuine — the same timing-safe HMAC check and replay guard the SDK runs. Use it to debug "signature mismatch" errors in a handler. Args:
Returns: { valid, reason, event_type, event_id, livemode }. An invalid signature is a normal result (valid: false), not an error. |
| jami_create_test_webhookA | Build a correctly signed JamiDev webhook delivery for testing a handler locally — no real event needed. Args:
Returns: { payload, signature, headers, curl } — the exact body and X-JamiDev-Signature to send, plus delivery_status when target_url is set. Handlers must verify the RAW body and reply 2xx within 10 seconds. |
| jami_search_docsA | Search the official JamiDev developer docs (https://dev.jami.bio/docs) — the source of truth for integrating Jami payments. Works without an API token. Use this before writing integration code: SDK usage, REST endpoints, webhooks and signature checks, sandbox magic numbers, Sign in with Jami (OAuth/OIDC), the wallet API, the browser storefront, fees and limits. Args:
Returns: { results: [{ title, path, url, snippet }] }. Read a full page with jami_read_doc(path). |
| jami_read_docA | Read one JamiDev docs page as markdown, with every code sample intact. Args:
Returns: { title, url, markdown, offset, next_offset? }. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| integrate_jami | Plan and build a complete JamiDev checkout integration in the current project. |
| go_live_checklist | Check an existing integration is ready to take real money. |
| debug_payment | Find out why a checkout didn't complete and what to tell the buyer. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| jami-reference | Money units, fees, limits, environments, failure codes and webhook rules in one page. |
TDQS
Scored across 16 tools
Each tool targets a distinct resource+action, and the trio of checkout tools (create/get_status/wait) is explicitly differentiated in the descriptions ("use jami_wait_for_checkout instead if you want to block"). Product, order, withdrawal, webhook, and docs tools occupy clearly separate niches with no real overlap.
Every tool uses the jami_ prefix followed by a consistent verb_noun pattern (create_checkout, get_product, list_products, verify_webhook, read_doc). No mixed conventions or vague verbs anywhere in the set.
16 tools is well-scoped for a payments platform spanning checkout, products, orders, withdrawals, webhooks, and docs. Each tool earns its place; nothing is redundant padding.
The withdrawal lifecycle is notably incomplete: descriptions reference jami_create_withdrawal ("from jami_create_withdrawal or jami_list_withdrawals") but no such tool is exposed, so agents can quote/get/list withdrawals but never initiate one. Orders also lack a single-get or refund operation, though the core checkout and product CRUD flows are covered.