Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

Jami

NPM · JAMI-MCP

Jami creator payouts for your agent: ETB checkouts, orders, payouts, webhooks. Powered by ArifPay.

Available components

+3 this week 73 Trust /100

Last scanned (22 hours ago)

Scores higher than 46% of npm servers

Category Finance and Payments

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 30 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
Schema Quality & AI Usability73
  • 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 5334 tokens (~231/item across 23 items; 22 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management33
  • Stability observed for 10 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage86
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 50% of tool parameters carry a description.Partial
  • Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 24 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 3 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.

  • 1 Nov 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

  • 30 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 13 to 17. That category is still filling its 30-day observation window: 4 days of observed history at the previous scan, 5 at this one. The score rises as the window fills, whether or not the server changes.

  • 28 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

  • 26 Oct 26 +1

    No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

  • 25 Oct 26 68

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 4 Nov 2026 · Analysed npm/jami-mcp@0.3.0

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 93 packages
Packages resolved 93
Stale 30
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 22 exposed · ~5,098 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
jami_cancel_subscription ~215

Cancel a wallet subscription so the payer is not charged again. Confirm with the user first — a cancel the payer didn't ask for loses a customer, and there are no refunds. Args: - subscription_id: the sub_… id. - at_period_end: default true — no more charges, and it ends at current_period_end (the payer keeps what they paid for). You can undo this kind of cancel before then with jami_resume_subscription. false ends it immediately (a past_due subscription always ends immediately). Returns the updated subscription: { subscription_id, status, cancel_at_period_end, ended_at, cancellation_reason, … }. Idempotent: cancelling twice is harmless.

NameTypeReqDescription
at_period_endboolean––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
subscription_idstringyesSubscription id, e.g. "sub_9f2kQ…" from jami_list_subscriptions or a subscription.* webhook
NameTypeReqDescription
amountstringyes–
amount_minorintegeryesCharged every period, integer santim (locked at approval)
cadencestringyese.g. "monthly", "every 3 months"
cancel_at_period_endbooleanyes–
canceled_atstring|nullyes–
cancellation_reasonstring|nullyes–
created_atstring|nullyes–
current_period_endstring|nullyes–
current_period_startstring|nullyes–
customer_emailstring|nullyes–
customer_external_idstring|nullyes–
customer_idstringyes–
ended_atstring|nullyes–
failed_attemptsintegeryes–
intervalstringyes–
interval_countintegeryes–
last_failure–yes–
livemodebooleanyes–
metadataobjectyes–
next_charge_atstring|nullyesNext renewal or retry; null once canceled or set to end
product_idstringyes–
product_titlestringyes–
statusstringyes–
subscription_idstringyes–

No examples provided.

jami_create_checkout ~729

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: - Product: product_id (p_… token or 24-char id, must be published). amount_minor only for flexible-price (pwyw) products. - Custom amount: omit product_id, pass amount_minor (≥ 100 = 1.00 ETB) and description (what the buyer sees, ≤ 120 chars). How to collect it: - Direct push: pass gateway + customer_email + customer_phone. The prompt goes straight to the buyer's phone (kind 'direct'). - Payment link: omit gateway. You get a Jami link in checkout_url (kind 'redirect') to send the buyer by SMS/Telegram/email; they pick the method and enter their details there, and can retry a failed attempt until the link expires (30 min). customer_* is optional. Args: - customer_email / customer_phone: required for a direct push; optional for a link. Phone like "251911223344" or "0911223344". Sandbox magic numbers: 251900000001 = instant success, 251900000002 = instant failure. - gateway: 'telebirr' | 'mpesa' | 'cbe'. Omit for a payment link. - amount_minor: integer santim. 123700 = 1,237.00 ETB. - metadata: optional string map (e.g. { "orderId": "1042" }) stored on the order and sent back on order webhooks. Returns: { session_id, kind: 'free' | 'redirect' | 'direct', checkout_url, order_id }. - free: completed instantly; order_id is set. - redirect: send the buyer to checkout_url. - direct: the buyer confirms on their phone; call jami_wait_for_checkout next.

NameTypeReqDescription
amount_minorinteger–Integer santim. Required for custom amounts (≥ 100) and pay-what-you-want products; ignored for fixed prices
checkout_linkstring–Checkout link token (cl_…) to attribute this session to
collected_fieldsobject–Answers to the product's checkout fields, keyed by field id
customer_emailstring–Buyer email for the receipt. Required with gateway; optional for a payment link
customer_external_idstring–Your own user id, stored on the customer record
customer_namestring––
customer_phonestring–Buyer phone, e.g. "251911223344"
descriptionstring–Custom amount only: what the buyer is paying for, e.g. "Order #1042"
gatewaystring–Payment method for paid products
metadataobject–Your own key/values, returned on order webhooks (max 20 keys)
product_idstring–Product token (p_…) or id. Omit for a custom-amount checkout.
success_urlstring–Where to send the buyer after paying
NameTypeReqDescription
checkout_urlstring|nullyes–
kindstringyes–
order_idstring|nullyes–
session_idstringyes–

No examples provided.

jami_create_product ~471

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): - fixed: amount_minor is the price, e.g. 250000 = 2,500.00 ETB. - pwyw (flexible): minimum_amount_minor; each checkout then sends its own amount. - free: no price. Subscription plans: product_type 'recurring' + pricing_model 'fixed' + billing_interval ('week' | 'month' | 'year') and optional interval_count (default 1; ≤ 52 weeks, ≤ 12 months, 1 year). amount_minor is charged from the payer's Jami wallet every period, 100–1,000,000 santim (1–10,000 ETB). The interval is locked after creation; a new price only applies to new subscribers. Args: title (1–120 chars), pricing_model, amount_minor / minimum_amount_minor, product_type? ('one_time' default | 'recurring'), billing_interval?, interval_count?, description?, status? ('published' | 'draft'). Returns: { product_id, token, url, title, status, pricing_model, product_type, billing_interval, interval_count, price }. To charge for a one-time product, call jami_create_checkout with product_id = token (omit gateway for a payment link). For a recurring plan, call jami_create_subscription_link instead.

NameTypeReqDescription
amount_minorinteger–Fixed price in santim
billing_intervalstring–Recurring only: how often the payer's wallet is charged
descriptionstring––
interval_countinteger–Recurring only: periods per charge (default 1), e.g. 3 + month = every 3 months
minimum_amount_minorinteger–Flexible price floor in santim
pricing_modelstringyes–
product_typestring––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
titlestringyes–
NameTypeReqDescription
amount_minor–yes–
billing_interval–yes–
interval_count–yes–
minimum_amount_minor–yes–
pricestringyes–
pricing_modelstringyes–
product_idstringyes–
product_typestringyes'recurring' = a wallet subscription plan
statusstringyes–
titlestringyes–
tokenstringyesUse as product_id in jami_create_checkout
urlstring|nullyesPublic Jami page where anyone can buy it (published only)

No examples provided.

jami_create_subscription_link ~390

Create a hosted subscribe link for a recurring product (a plan made with jami_create_product product_type 'recurring'). Send the link to the payer. Nothing is charged by this call. An API key can only PROPOSE a subscription: the payer opens the link, signs in to Jami, reviews the plan, amount and cadence, and approves with their Jami wallet PIN. Only then is the first period charged from their Jami wallet; Jami renews it every period after that until either side cancels. The link is single use and valid 24 hours. Args: - product_id: the recurring product's p_… token or id (must be published). - customer_email: optional, prefills / tags the payer. - customer_external_id: optional, your own user id (≤ 200 chars); it comes back on the subscription and its webhooks, and jami_list_subscriptions can filter by it. - success_url / cancel_url: optional absolute http(s) URLs. success_url gets ?subscription_id=sub_… (and {SUBSCRIPTION_ID} is filled). - metadata: optional string map (≤ 20 keys) copied onto the subscription. Returns: { checkout_id: 'sc_…', url, expires_at, livemode }. Watch for the subscription.created webhook, or call jami_list_subscriptions, to see the approval.

NameTypeReqDescription
cancel_urlstring––
customer_emailstring––
customer_external_idstring––
metadataobject–Your own key/values, copied onto the subscription (max 20 keys)
product_idstringyesRecurring product p_… token or id
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
success_urlstring––
NameTypeReqDescription
checkout_idstringyessc_… subscribe-link id
expires_atstringyes–
livemodebooleanyes–
urlstringyesSend the payer here to approve

No examples provided.

jami_create_test_webhook ~277

Build a correctly signed JamiDev webhook delivery for testing a handler locally — no real event needed. Args: - type: 'order.created' | 'order.completed' | 'benefit.granted' | 'checkout.session.expired' | 'withdrawal.paid' | 'withdrawal.failed' | 'subscription.created' | 'subscription.renewed' | 'subscription.payment_failed' | 'subscription.updated' | 'subscription.canceled'. - secret: signing secret (defaults to JAMI_WEBHOOK_SECRET; any string works for a local test). - data: optional fields to merge over the realistic sample payload. - livemode: default false (sandbox). - target_url: optional. When set, the delivery is POSTed there (e.g. "http://localhost:3000/webhooks/jami") and the response status is reported. 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.

NameTypeReqDescription
dataobject––
livemodeboolean––
secretstring––
target_urlstring––
typestringyes–
NameTypeReqDescription
curlstringyes–
delivery_errorstring––
delivery_statusinteger––
headersobjectyes–
payloadstringyes–
signaturestringyes–

No examples provided.

jami_get_balance ~132

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.

NameTypeReqDescription
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
NameTypeReqDescription
balancestringyes–
balance_minorintegeryes–
currencystringyes–
eligiblebooleanyes–

No examples provided.

jami_get_checkout_status ~201

Check a checkout session once. The server reconciles with the payment provider on every call, so this resolves even when webhooks are late. Args: - session_id: from jami_create_checkout. 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.

NameTypeReqDescription
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
session_idstringyesCheckout session id returned by jami_create_checkout, e.g. "6710c2e8b1a2f0012ab34cd9"
NameTypeReqDescription
amountstringyesHuman-readable amount, e.g. "150.00 ETB"
amount_minor–yesInteger santim (100 = 1.00 ETB)
expires_atstringyes–
failure–yesWhy the session ended without an order; null unless status is "expired"
order_idstring|nullyes–
order_status–yes–
session_idstringyes–
statusstringyes–

No examples provided.

jami_get_product ~127

Fetch one product by its p_… token or id: price, status, its public page url, and for a subscription plan its billing interval. Args: - product_id: p_… token or 24-character id. Returns: { product_id, token, url, title, status, pricing_model, product_type, billing_interval, interval_count, price }.

NameTypeReqDescription
product_idstringyesProduct p_… token or id
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
NameTypeReqDescription
amount_minor–yes–
billing_interval–yes–
interval_count–yes–
minimum_amount_minor–yes–
pricestringyes–
pricing_modelstringyes–
product_idstringyes–
product_typestringyes'recurring' = a wallet subscription plan
statusstringyes–
titlestringyes–
tokenstringyesUse as product_id in jami_create_checkout
urlstring|nullyesPublic Jami page where anyone can buy it (published only)

No examples provided.

jami_get_subscription ~194

Fetch one wallet subscription with its newest 24 charges (one per billing period) — use it to see why a renewal failed or when the next one runs. Args: - subscription_id: the sub_… id. Returns: { subscription: { subscription_id, status, amount_minor, cadence, current_period_end, next_charge_at, cancel_at_period_end, cancellation_reason, last_failure, … }, charges: [{ charge_id, sequence, status, amount_minor, failure, order_id, paid_at }] }. Failure codes: insufficient_funds, kyc_required, payer_unavailable, simulated_failure, internal_error.

NameTypeReqDescription
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
subscription_idstringyesSubscription id, e.g. "sub_9f2kQ…" from jami_list_subscriptions or a subscription.* webhook
NameTypeReqDescription
chargesarrayyes–
subscriptionobjectyes–

No examples provided.

jami_get_withdrawal ~84

Fetch one withdrawal by id to track it from pending → processing → completed (or rejected). Args: - withdrawal_id: from jami_create_withdrawal or jami_list_withdrawals.

NameTypeReqDescription
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
withdrawal_idstringyes–
NameTypeReqDescription
accountstringyes–
amountstringyes–
amount_minorintegeryesGross santim debited
created_atstring|nullyes–
fee_minorintegeryes–
gatewaystringyes–
idempotency_keystring––
netstringyes–
net_minorintegeryesSantim that reaches the destination
notestring––
statusstringyes–
tax_minorintegeryes–
withdrawal_idstringyes–

No examples provided.

jami_list_orders ~223

List the organization's orders, newest first, one page at a time. Args: - status: 'paid' | 'pending' | 'failed' (optional filter). - page: 1-based page (default 1). - limit: 1–100 per page (default 20). 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.

NameTypeReqDescription
limitinteger––
pageinteger––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
NameTypeReqDescription
countintegeryesRecords in this page
has_morebooleanyes–
limitintegeryes–
next_pageinteger–Pass as `page` to fetch the next page
ordersarrayyes–
pageintegeryes–
totalintegeryesTotal matching records

No examples provided.

jami_list_products ~136

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 }.

NameTypeReqDescription
limitinteger––
pageinteger––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
NameTypeReqDescription
countintegeryesRecords in this page
has_morebooleanyes–
limitintegeryes–
next_pageinteger–Pass as `page` to fetch the next page
pageintegeryes–
productsarrayyes–
totalintegeryesTotal matching records

No examples provided.

jami_list_subscriptions ~224

List the organization's wallet subscriptions, newest first. Args: - status: 'active' | 'past_due' | 'canceled' (optional). past_due = a renewal failed and is being retried. - product_id: optional p_… token or id of the plan. - customer_external_id: optional, your own user id passed when the link was created. - page (default 1), limit 1–100 (default 20). Returns: { subscriptions: [{ subscription_id, status, product_title, amount_minor, cadence, next_charge_at, customer_email, … }], total, page, limit, count, has_more, next_page }.

NameTypeReqDescription
customer_external_idstring––
limitinteger––
pageinteger––
product_idstring–Recurring product p_… token or id
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
NameTypeReqDescription
countintegeryesRecords in this page
has_morebooleanyes–
limitintegeryes–
next_pageinteger–Pass as `page` to fetch the next page
pageintegeryes–
subscriptionsarrayyes–
totalintegeryesTotal matching records

No examples provided.

jami_list_withdrawals ~141

List the organization's withdrawals, newest first. Args: - status: 'pending' | 'reviewing' | 'approved' | 'rejected' | 'processing' | 'completed' (optional). - page (default 1), limit 1–100 (default 20). Returns: { withdrawals: [...], total, page, limit, count, has_more, next_page }.

NameTypeReqDescription
limitinteger––
pageinteger––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
NameTypeReqDescription
countintegeryesRecords in this page
has_morebooleanyes–
limitintegeryes–
next_pageinteger–Pass as `page` to fetch the next page
pageintegeryes–
totalintegeryesTotal matching records
withdrawalsarrayyes–

No examples provided.

jami_quote_withdrawal ~259

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: - amount_minor: gross santim (min 10000 = 100.00 ETB). - fee_rate / tax_rate: optional overrides (0–1) if you know the account's real rates. 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.

NameTypeReqDescription
amount_minorintegeryesGross amount in integer santim — the fee is cut from this. 10000 = 100.00 ETB (the minimum).
fee_ratenumber––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
tax_ratenumber––
NameTypeReqDescription
amount_minorintegeryes–
auto_payoutbooleanyestrue when ≤ 10,000 ETB — paid out without manual review
fee_minorintegeryes–
fee_ratenumberyes–
meets_minimumbooleanyes–
net_minorintegeryes–
tax_minorintegeryes–
tax_ratenumberyes–
within_daily_capbooleanyes–

No examples provided.

jami_read_doc ~116

Read one JamiDev docs page as markdown, with every code sample intact. Args: - path: a docs path from jami_search_docs, e.g. "/docs/webhooks", "api/checkout", or a full URL. Use "/docs" for the overview. - offset: character offset for long pages (default 0); the result says where to continue. Returns: { title, url, markdown, offset, next_offset? }.

NameTypeReqDescription
offsetinteger––
pathstringyes–
NameTypeReqDescription
markdownstringyes–
next_offsetinteger––
offsetintegeryes–
titlestringyes–
urlstringyes–

No examples provided.

jami_resume_subscription ~198

Undo a cancel that YOU scheduled (jami_cancel_subscription with at_period_end true), so the subscription keeps renewing at next_charge_at. Only works on a cancel the organization scheduled and while the subscription hasn't ended yet. A cancel the customer made can't be undone by the organization (the payer has to subscribe again), and an ended subscription can't be resumed — both return 409 not_allowed. Args: - subscription_id: the sub_… id. Returns the updated subscription: { subscription_id, status, cancel_at_period_end: false, next_charge_at, … }. Idempotent: resuming an already-renewing subscription changes nothing.

NameTypeReqDescription
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
subscription_idstringyesSubscription id, e.g. "sub_9f2kQ…" from jami_list_subscriptions or a subscription.* webhook
NameTypeReqDescription
amountstringyes–
amount_minorintegeryesCharged every period, integer santim (locked at approval)
cadencestringyese.g. "monthly", "every 3 months"
cancel_at_period_endbooleanyes–
canceled_atstring|nullyes–
cancellation_reasonstring|nullyes–
created_atstring|nullyes–
current_period_endstring|nullyes–
current_period_startstring|nullyes–
customer_emailstring|nullyes–
customer_external_idstring|nullyes–
customer_idstringyes–
ended_atstring|nullyes–
failed_attemptsintegeryes–
intervalstringyes–
interval_countintegeryes–
last_failure–yes–
livemodebooleanyes–
metadataobjectyes–
next_charge_atstring|nullyesNext renewal or retry; null once canceled or set to end
product_idstringyes–
product_titlestringyes–
statusstringyes–
subscription_idstringyes–

No examples provided.

jami_search_docs ~172

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: - query: what you need, e.g. "verify webhook signature express", "pay what you want amount", "withdrawal fee". - limit: 1–10 results (default 5). Returns: { results: [{ title, path, url, snippet }] }. Read a full page with jami_read_doc(path).

NameTypeReqDescription
limitinteger––
querystringyes–
NameTypeReqDescription
resultsarrayyes–

No examples provided.

jami_simulate_subscription_renewal ~238

Sandbox only: run a subscription's next renewal right now, succeeding or failing, to test subscription.renewed / subscription.payment_failed / subscription.canceled handling without waiting a billing period. No money moves. Refused with a live (jamidev_live_) token — live renewals only run on schedule. Args: - subscription_id: the sub_… id of a sandbox subscription. - outcome: 'success' (default) or 'failure'. Failures follow the real dunning schedule: retries at 1, 3 and 7 days, then the subscription is canceled with cancellation_reason payment_failed. Returns: { result: 'renewed' | 'retry_scheduled' | 'canceled' | 'skipped' | 'deferred', subscription }.

NameTypeReqDescription
outcomestring––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
subscription_idstringyesSubscription id, e.g. "sub_9f2kQ…" from jami_list_subscriptions or a subscription.* webhook
NameTypeReqDescription
resultstringyes–
subscription–yes–

No examples provided.

jami_update_product ~162

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).

NameTypeReqDescription
amount_minorinteger––
descriptionstring––
minimum_amount_minorinteger––
product_idstringyesProduct p_… token or id
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
statusstring––
titlestring––
NameTypeReqDescription
amount_minor–yes–
billing_interval–yes–
interval_count–yes–
minimum_amount_minor–yes–
pricestringyes–
pricing_modelstringyes–
product_idstringyes–
product_typestringyes'recurring' = a wallet subscription plan
statusstringyes–
titlestringyes–
tokenstringyesUse as product_id in jami_create_checkout
urlstring|nullyesPublic Jami page where anyone can buy it (published only)

No examples provided.

jami_verify_webhook ~208

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: - payload: the RAW request body exactly as received (not re-serialized JSON — whitespace matters). - signature: the X-JamiDev-Signature header, "t=<unix>,v1=<hex>". - secret: the subscription's webhook secret (defaults to JAMI_WEBHOOK_SECRET). - tolerance_seconds: max age of the timestamp (default 300). Raise it to check an old captured delivery. Returns: { valid, reason, event_type, event_id, livemode }. An invalid signature is a normal result (valid: false), not an error.

NameTypeReqDescription
payloadstringyesRaw request body
secretstring––
signaturestringyesX-JamiDev-Signature header value
tolerance_secondsinteger––
NameTypeReqDescription
event_idstring|nullyes–
event_typestring|nullyes–
livemodeboolean|nullyes–
reasonstring|nullyes–
validbooleanyes–

No examples provided.

jami_wait_for_checkout ~201

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: - session_id: from jami_create_checkout. - timeout_seconds: 5–300 (default 90). - interval_seconds: 2–30 between polls (default 3). Returns the same shape as jami_get_checkout_status.

NameTypeReqDescription
interval_secondsinteger––
response_formatstring–'markdown' (default) for a readable summary, 'json' for the full structured payload
session_idstringyesCheckout session id returned by jami_create_checkout, e.g. "6710c2e8b1a2f0012ab34cd9"
timeout_secondsinteger––
NameTypeReqDescription
amountstringyesHuman-readable amount, e.g. "150.00 ETB"
amount_minor–yesInteger santim (100 = 1.00 ETB)
expires_atstringyes–
failure–yesWhy the session ended without an order; null unless status is "expired"
order_idstring|nullyes–
order_status–yes–
session_idstringyes–
statusstringyes–

No examples provided.

Install

How do I install the Jami MCP server?

Jami runs locally as an npm package, launched with npx -y jami-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · jami-mcp

# add to Claude Code
claude mcp add kenawak-jami-mcp -- npx -y jami-mcp
Common questions

What is the Jami MCP server?

Jami is an MCP server listed in the public MCP registry as io.github.kenawak/jami-mcp. Jami creator payouts for your agent: ETB checkouts, orders, payouts, webhooks. Powered by ArifPay. This page covers its npm package (jami-mcp).

Is the Jami MCP server safe to use?

Jami scores 73 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the Jami MCP server expose?

Jami exposes 22 tools: jami_create_checkout, jami_get_checkout_status, jami_wait_for_checkout, jami_create_product, jami_update_product, and 17 more. Their descriptions and schemas cost roughly 5,098 tokens of context every time the server is loaded.

Is the Jami MCP server still maintained?

Jami is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the Jami MCP server under?

Jami declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.