# esimker eSIM store

> Prepaid travel data eSIMs: checkout links for people, autonomous purchases from a prepaid wallet.

- name: com.esimker/esim
- version: 1.0.0
- connection class: R0 (autonomous)
- trust: 79/100 flags: no-repository
- quality: 92/100 (strong)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.esimker%2Fesim
- tools: https://api.protogrid.dev/v1/servers/com.esimker%2Fesim/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "esim": {
      "type": "http",
      "url": "https://esimker.com/api/mcp",
      "headers": {
        "Authorization": "Bearer ${ESIM_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${ESIM_TOKEN}`.

## Trust

- hygiene: 80
- liveness: 98
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-95% ~updated-46d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 92/100 (strong)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 93 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 12 of 12 tools declare readOnlyHint or destructiveHint
- warn `tools.directory_hints`: 4 of 12 tools declare all four hints; missing: get_payment_methods (destructiveHint); search_destinations (destructiveHint); get_plans (destructiveHint); …
- pass `tools.token_cost`: about 2,248 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 2 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 12, about 2,248 tokens to load them all
- tool set hash: 616e665b8a032bc865483f75832c840c
- tools last changed: 2026-10-07T18:53:32.227Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.esimker/esim.svg)](https://protogrid.dev/servers/com.esimker/esim)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-07 `get_deposit` changed (description)
  - before: One deposit of the wallet by its token: status pending → paid (credited, bonus included) | underpaid (nothing credited yet, the rest can still arrive) | expired. Poll every ~30 s after sending; crypto needs the network's confirmations. Needs the wallet code.
  - after: One deposit of the wallet by its token: status pending → paid (credited, bonus included) | underpaid (nothing credited yet, the rest can still arrive) | payment_held (the payment processor's compliance check stopped the payment and holds it: nothing is credited, do not pay again, the person should write to support) | expired. Poll every ~30 s after sending; crypto needs the network's confirmations. Needs the wallet code.
- 2026-10-07 `get_order` changed (description)
  - before: An order by its token. status goes pending (unpaid) → paid → provisioning → ready; also expired, underpaid, failed_provisioning, gift_waiting. When ready, esim.activation_code is the LPA string (render it as a QR code), with iccid, smdp and matching_id. After payment poll every ~10 s; delivery usually takes under a minute.
  - after: An order by its token. status goes pending (unpaid) → paid → provisioning → ready; also expired, underpaid, failed_provisioning, gift_waiting, and payment_held — the payment processor's compliance check stopped the payment and holds the money: nothing is issued, the person must not pay again and should write to support. When ready, esim.activation_code is the LPA string (render it as a QR code), with iccid, smdp and matching_id. After payment poll every ~10 s; delivery usually takes under a minute.

Full history: https://api.protogrid.dev/v1/servers/com.esimker%2Fesim/changes

## Remotes

- https://esimker.com/api/mcp (streamable-http, auth none, reachable true, uptime30d 0.9464286)

## Packages

_none_

## Tools (12)

- `create_checkout`: Create an order for a person to pay. Returns token, checkout_url (the
        gateway's page: hand it to the person) and order_url (the order page in `lang`,
        with the QR code once paid: show it to the buyer only, the token is a secret).
        Confirm the plan and the price first: every call creates a new unpaid order,
        so do not retry while a checkout is open. `email` (optional) also gets the eSIM
        by mail. `period_num` (1–365) only for daily_unlimited plans. `topup_iccid`
        with a plan_id from list_topups tops up an existing eSIM. A 403 means the
        caller's jurisdiction is embargoed. To pay from a wallet use purchase_esim.
- `create_deposit`: Open a top-up of the wallet and get what is needed to pay it. Floors: $10 for a wallet's first deposit, $1 after that; cap $1000 per deposit. Crypto deposits earn a bonus (+2% from $25, +3% from $50, +5% from $100, capped at $25); every purchase returns 3% cashback. With payment_method "crypto" pass a currency from: BTC, ETH, TRX, USDTTRC, USDTETH, USDTBSC — the answer then carries `pay`: the address, the exact amount in the coin (network fee included) and expires_at (about 15 minutes; after that open a new deposit). Send exactly `pay.amount` to `pay.address` on `pay.network`, then poll get_deposit(token) until status is paid. checkout_url is the hosted pay page for a person; card deposits have only that. Needs the wallet code.
- `create_wallet`: Mint a prepaid wallet with no account behind it and get its secret ONCE:
        `code` (32 hex characters) and the same secret as a 12-word `phrase`. Save the
        code before doing anything else and send it as `Authorization: Bearer <code>`
        on every wallet call; there is no recovery and no identity to prove. The
        balance is spent on eSIMs (retail price, cashback on every purchase) and never
        paid back out. accept_terms must be true (https://esimker.com/terms). Then
        create_deposit to fund it. Rate-limited and geo-blocked like checkout.
- `get_deposit`: One deposit of the wallet by its token: status pending → paid (credited,
        bonus included) | underpaid (nothing credited yet, the rest can still arrive) |
        payment_held (the payment processor's compliance check stopped the payment and
        holds it: nothing is credited, do not pay again, the person should write to
        support) | expired. Poll every ~30 s after sending; crypto needs the network's
        confirmations. Needs the wallet code.
- `get_order`: An order by its token. status goes pending (unpaid) → paid → provisioning →
        ready; also expired, underpaid, failed_provisioning, gift_waiting, and
        payment_held — the payment processor's compliance check stopped the payment and
        holds the money: nothing is issued, the person must not pay again and should
        write to support. When ready,
        esim.activation_code is the LPA string (render it as a QR code), with iccid,
        smdp and matching_id. After payment poll every ~10 s; delivery usually takes
        under a minute.
- `get_payment_methods`: Checkout methods open right now: "crypto" (a hosted invoice: BTC, ETH, TRX,
        USDT), "card", and "wallet" (a prepaid balance, see create_wallet).

        `gateways` names the providers behind each method; a checkout that does not
        ask for one by name goes to the first, which is what these tools do.
- `get_plans`: The plans of one destination (slug from search_destinations). Each plan: id
        (the plan_id for an order), name, gb, days, retail (USD; per day when
        daily_unlimited is true), daily_unlimited, location_codes (the countries it
        covers), networks, speed, supports_topup. Also the published rating.
- `get_usage`: Remaining data and status of an eSIM we issued.
- `get_wallet`: The wallet behind the code: ref (a public handle for support), balance_usd,
        cashback_percent, the deposit rules that apply to it now (min_usd, max_usd,
        first, bonus tiers), the last 50 transactions, orders (with their tokens — the
        wallet is where a buyer's order links are kept) and deposits. Needs the wallet
        code.
- `list_topups`: Top-up plans that fit an eSIM we issued: plan_id, name, gb, days, retail.
        Order one with create_checkout(plan_id, topup_iccid=iccid) or, from a wallet,
        purchase_esim(plan_id, client_ref, topup_iccid=iccid).
- `purchase_esim`: Charge the wallet and issue an eSIM, no checkout. `client_ref` (1–64 chars) is your own reference for this purchase and makes the call idempotent: a retry with the same value returns the existing order without a second charge, so reuse it after a timeout and never invent a new one for the same purchase. `period_num` (1–365, default 7) only for daily_unlimited plans; the charge is price × days. `topup_iccid` with a plan_id from list_topups tops up an eSIM. Returns the order (status paid) with order_url; poll get_order(token) for ready and the activation code. A 402 is a short balance: create_deposit first. A wallet pays for at most 50 orders in 24 hours (429 beyond that; a retry answered from client_ref does not count). Needs the wallet code.
- `search_destinations`: Destinations on sale. `query` matches the name in any of 18 languages, the
        slug or the ISO code; empty lists everything. Each item: dest_code, slug, name,
        min_retail (USD, the cheapest fixed plan), unlimited_from (USD per day of a
        Daily Unlimited pass, or null), plan_count. Continue with get_plans(slug).
