Koskamo

esimker MCP

An official MCP server for esimker that enables AI agents to browse prepaid travel eSIM destinations, create checkout orders for human payment, and autonomously manage a prepaid crypto wallet to purchase and activate eSIMs without user accounts.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

esimker MCP logo, by esimkerVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by esimker
MCP endpoint (Streamable HTTP)
https://esimker.com/api/mcp
Vendor documentation

What its tools do

12 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

12 of 12 have a description · 12 of 12 declare behavior hints · 0 of 10 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to esimker.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for available eSIM destinations and plans
  • Create a checkout link for a human to pay
  • Mint a prepaid wallet and fund it with crypto
  • Purchase an eSIM using wallet balance and retrieve activation code

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
esimker 2
MCP protocol negotiated in check
2025-11-25
Tools
12 advertised
Resources
0 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  },
  "experimental": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

esimker sells prepaid travel data eSIMs: data only, no phone numbers, no SMS, no voice. Prices are USD strings, from $1.00. No account is needed: an order is addressed by a secret token, a wallet by a secret code. Two ways to buy: 1. For a person who pays: search_destinations → get_plans → create_checkout → hand checkout_url to the person → get_order(token) until status is ready. 2. Autonomously from a prepaid wallet: create_wallet once and save its code → send it as `Authorization: Bearer <code>` on every wallet call → create_deposit and pay the address it returns → get_deposit until paid → purchase_esim(plan_id, client_ref) → get_order(token) until ready. Rules: - Confirm the destination, the plan and the price with the person before create_checkout or purchase_esim. An installed eSIM cannot be refunded; a wallet balance is spent on eSIMs and never paid back out. - The wallet code, the order token and the activation code are secrets: keep the code where you keep credentials, show order_url to the buyer only, never log or repeat them elsewhere. A lost wallet code cannot be recovered. - Reuse client_ref when retrying purchase_esim; never create a second checkout while one is open. - daily_unlimited plans are priced per day: pass period_num (1–365, default 7), the amount is price × days. - Regional plans list the countries they cover in location_codes. - A 403 means the caller's jurisdiction is embargoed: tell the person, do not retry.

Tools

12 advertised

search_destinations
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

search_destinations input schema
{
  "type": "object",
  "title": "search_destinationsArguments",
  "properties": {
    "query": {
      "type": "string",
      "title": "Query",
      "default": ""
    }
  }
}
search_destinations output schema
{
  "type": "object",
  "title": "search_destinationsOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
search_destinations annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_plans
Advertised by the server during the last successful anonymous check.
Advertised read-only

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_plans input schema
{
  "type": "object",
  "title": "get_plansArguments",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "title": "Slug"
    }
  }
}
get_plans output schema
{
  "type": "object",
  "title": "get_plansDictOutput",
  "additionalProperties": true
}
get_plans annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_payment_methods
Advertised by the server during the last successful anonymous check.
Advertised read-only

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_payment_methods input schema
{
  "type": "object",
  "title": "get_payment_methodsArguments",
  "properties": {}
}
get_payment_methods output schema
{
  "type": "object",
  "title": "get_payment_methodsDictOutput",
  "additionalProperties": true
}
get_payment_methods annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
create_checkout
Advertised by the server during the last successful anonymous check.

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_checkout input schema
{
  "type": "object",
  "title": "create_checkoutArguments",
  "required": [
    "plan_id"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "title": "Lang",
      "default": "en"
    },
    "email": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Email",
      "default": null
    },
    "plan_id": {
      "type": "integer",
      "title": "Plan Id",
      "maximum": 2147483647,
      "minimum": 1
    },
    "period_num": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Period Num",
      "default": null
    },
    "topup_iccid": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Topup Iccid",
      "default": null
    },
    "payment_method": {
      "enum": [
        "crypto",
        "card"
      ],
      "type": "string",
      "title": "Payment Method",
      "default": "crypto"
    }
  }
}
create_checkout output schema
{
  "type": "object",
  "title": "create_checkoutDictOutput",
  "additionalProperties": true
}
create_checkout annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_order
Advertised by the server during the last successful anonymous check.
Advertised read-only

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_order input schema
{
  "type": "object",
  "title": "get_orderArguments",
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "title": "Token"
    }
  }
}
get_order output schema
{
  "type": "object",
  "title": "get_orderDictOutput",
  "additionalProperties": true
}
get_order annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
list_topups
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_topups input schema
{
  "type": "object",
  "title": "list_topupsArguments",
  "required": [
    "iccid"
  ],
  "properties": {
    "iccid": {
      "type": "string",
      "title": "Iccid"
    }
  }
}
list_topups output schema
{
  "type": "object",
  "title": "list_topupsOutput",
  "required": [
    "result"
  ],
  "properties": {
    "result": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "title": "Result"
    }
  }
}
list_topups annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
get_usage
Advertised by the server during the last successful anonymous check.
Advertised read-only

Remaining data and status of an eSIM we issued.

get_usage input schema
{
  "type": "object",
  "title": "get_usageArguments",
  "required": [
    "iccid"
  ],
  "properties": {
    "iccid": {
      "type": "string",
      "title": "Iccid"
    }
  }
}
get_usage output schema
{
  "type": "object",
  "title": "get_usageDictOutput",
  "additionalProperties": true
}
get_usage annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
create_wallet
Advertised by the server during the last successful anonymous check.

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.

create_wallet input schema
{
  "type": "object",
  "title": "create_walletArguments",
  "required": [
    "accept_terms"
  ],
  "properties": {
    "accept_terms": {
      "type": "boolean",
      "title": "Accept Terms"
    }
  }
}
create_wallet output schema
{
  "type": "object",
  "title": "create_walletDictOutput",
  "additionalProperties": true
}
create_wallet annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_wallet
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_wallet input schema
{
  "type": "object",
  "title": "get_walletArguments",
  "properties": {}
}
get_wallet output schema
{
  "type": "object",
  "title": "get_walletDictOutput",
  "additionalProperties": true
}
get_wallet annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
create_deposit
Advertised by the server during the last successful anonymous check.

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_deposit input schema
{
  "type": "object",
  "title": "create_depositArguments",
  "required": [
    "amount_usd"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "title": "Lang",
      "default": "en"
    },
    "currency": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Currency",
      "default": null
    },
    "amount_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "string"
        }
      ],
      "title": "Amount Usd"
    },
    "payment_method": {
      "enum": [
        "crypto",
        "card"
      ],
      "type": "string",
      "title": "Payment Method",
      "default": "crypto"
    }
  }
}
create_deposit output schema
{
  "type": "object",
  "title": "create_depositDictOutput",
  "additionalProperties": true
}
create_deposit annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_deposit
Advertised by the server during the last successful anonymous check.
Advertised read-only

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_deposit input schema
{
  "type": "object",
  "title": "get_depositArguments",
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "title": "Token"
    }
  }
}
get_deposit output schema
{
  "type": "object",
  "title": "get_depositDictOutput",
  "additionalProperties": true
}
get_deposit annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true
}
purchase_esim
Advertised by the server during the last successful anonymous check.

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.

purchase_esim input schema
{
  "type": "object",
  "title": "purchase_esimArguments",
  "required": [
    "plan_id",
    "client_ref"
  ],
  "properties": {
    "lang": {
      "type": "string",
      "title": "Lang",
      "default": "en"
    },
    "email": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Email",
      "default": null
    },
    "plan_id": {
      "type": "integer",
      "title": "Plan Id",
      "maximum": 2147483647,
      "minimum": 1
    },
    "client_ref": {
      "type": "string",
      "title": "Client Ref"
    },
    "period_num": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Period Num",
      "default": null
    },
    "topup_iccid": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Topup Iccid",
      "default": null
    }
  }
}
purchase_esim output schema
{
  "type": "object",
  "title": "purchase_esimDictOutput",
  "additionalProperties": true
}
purchase_esim annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

0 advertised

No prompt definitions available.

Resources

0 advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-07: 2 of 2 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1350 ms
95th percentile latency
1350 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1350 ms · metadata changed · 12 tool(s), 0 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http esimker-mcp https://esimker.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add esimker-mcp --url https://esimker.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable esimker-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "esimker-mcp": {
      "url": "https://esimker.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "esimker-mcp": {
      "type": "streamableHttp",
      "url": "https://esimker.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start esimker-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "esimker-mcp": {
      "type": "http",
      "url": "https://esimker.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http esimker-mcp https://esimker.com/api/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://esimker.com/api/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "esimker-mcp": {
      "serverUrl": "https://esimker.com/api/mcp"
    }
  }
}

Let your agent find its tools

Find servers like esimker MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run esimker MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing