mcp-esim
@worldcitisim/mcp-esim
MCP server that lets Claude and other MCP-compatible agents search and buy WorldCitiSim eSIM plans. Wraps https://shop.worldcitisim.com/wp-json/esim/v1/*.
Install
Claude Desktop / Claude Code
claude mcp add --scope user wcs-esim npx -y @worldcitisim/mcp-esimOr paste into ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"worldcitisim-esim": {
"command": "npx",
"args": ["-y", "@worldcitisim/mcp-esim"]
}
}
}Cursor / Windsurf / other MCP clients
Same shape — command: "npx", args: ["-y", "@worldcitisim/mcp-esim"].
ChatGPT Developer Mode
Settings → Developer Mode → Add MCP server → same npx command.
Related MCP server: PikaSim
Tools exposed
Tool | Purpose |
| Filter catalog by country / region / days / GB. Returns matching plans with their first 5 variations. |
| Fetch one plan by slug with all variations. |
| Create a pending order. |
| Poll an order's status. Returns activation data (ICCID, QR URL) once payment clears. |
Example interaction
User: I'm going to Japan for 10 days, what eSIM should I get?
Claude calls: esim_search_plans({ country: "japan", min_days: 7, max_days: 15 })
→ returns matching plans with variations priced and in stock.
Claude picks the best match, presents 2–3 options to the user.
User: the 10GB one
Claude: "Pay by card or Bitcoin?"
User: card
Claude calls: esim_create_order({ email: "user@example.com", variation_id: 44941 })
→ returns { order_id, order_token, payment_link_url }.
Claude: "Tap this link to pay: <Stripe URL>. You'll get the eSIM QR in your email within ~30 seconds."
User pays. Claude optionally polls esim_check_order until status=completed.For Bitcoin, Claude calls esim_create_order({ ..., payment_method: "btc" }) and gets back a
btc block — { address, sats_amount, btc_amount, qr_data_uri, expires_at } — which it shows
the user to pay from any on-chain wallet. No redirect. If BTC is declined for a small order
during a network-fee spike, the call returns a btc_unavailable error and Claude offers card
instead. Either way, esim_check_order polls until status=completed.
Environment
WCS_ESIM_API_BASE— override the API base URL. Default:https://shop.worldcitisim.com/wp-json/esim/v1.
Runtime
Node 20.11+ (for native fetch + ESM).
No secrets. No Stripe credentials touch this process. Payment happens on Stripe's hosted checkout page; the MCP just hands the agent the URL.
Catalog is client-side cached 5 minutes + ETag-aware; multiple search calls within a minute don't hit the network.
Development
npm install
npm run dev # stdio MCP server on this terminal
npm run build # compile to dist/Point a Claude Code session at the local dev build:
claude mcp add wcs-esim-dev node "$(pwd)/dist/index.js"Related
WorldCitiSim — eSIM travel service for 193 countries.
WorldCitiSim eSIM API — OpenAPI 3.1 spec the server wraps.
License
MIT
Available Tools
4 toolsesim_check_orderA
Poll an order's status. Returns status: pending while waiting for payment, status: processing or completed once paid, with activation data (ICCID, QR URL, install instructions).
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | ||
| order_token | Yes | The opaque token returned by esim_create_order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses return states and activation data but omits error conditions, rate limits, or side effects. Adequate but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with purpose, includes necessary detail on statuses and data. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description adequately explains return values and states. Could mention error handling or non-existent orders for full completeness given complexity is low.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 2 params with 50% coverage (order_id lacks description). The description adds context for order_token's origin but nothing for order_id. Baseline 3 due to partial compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool polls an order's status, specifying verb and resource. It distinguishes from siblings which create, search, or get plans, so an agent can easily differentiate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use after creating an order by mentioning the token from esim_create_order. However, it doesn't explicitly state when not to use or compare to alternatives, though siblings are distinct enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
esim_create_orderA
Create a pending order. With payment_method: "stripe" (default) you get back a payment_link_url — present it to the user to tap and pay on Stripe's hosted page. With payment_method: "btc" you get back a btc block (on-chain address + amount + QR data URI + expiry) — present the address and amount to the user to pay from any Bitcoin wallet; no redirect. If the user hasn't said how they want to pay, ask: card or Bitcoin. The eSIM QR code arrives at email within ~30 seconds of payment clearing. Use esim_check_order to poll status.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Buyer's email address. The eSIM QR code will be delivered here. | ||
| variation_id | Yes | The specific variation ID to buy (from esim_search_plans or esim_get_plan). | |
| payment_method | No | How the buyer pays. 'stripe' (default) → hosted card checkout, returns a payment_link_url. 'btc' → on-chain Bitcoin, returns a btc block (address + sats + QR) to show the user directly. BTC may be declined for small orders during network-fee spikes — the call then returns a btc_unavailable error and you should offer card instead. | stripe |
| agent_source | No | Optional: identifier for the calling agent (e.g. 'claude-code', 'cursor'). Used for our analytics; not seen by the buyer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses behavior: creates pending order, returns different outputs per payment method, mentions possible btc_unavailable error, and states eSIM delivery time (~30 seconds). No hidden traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-structured paragraph: concise yet comprehensive, with each sentence serving a purpose. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description covers return values for both payment methods, error case, and delivery timing. Suggests polling for status. Complete for the tool's role.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds significant value by explaining payment_method behavior in detail (stripe returns payment_link_url, btc returns btc block with elements) and the btc_unavailable error, surpassing the schema's enums and descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Create a pending order' and differentiates between payment methods, distinguishing it from sibling tools like esim_check_order (polling) and esim_search_plans (searching).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use each payment method, instructs to ask user if they haven't specified payment method, and advises using esim_check_order for polling. Also covers the btc_unavailable error fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
esim_get_planA
Fetch the full detail of one plan by slug, including all variations (every days × GB permutation with its price).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Plan slug, e.g. 'spain' or 'europe'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description adds behavioral context about returning 'all variations' and pricing, but omits potential issues like not found errors or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, front-loaded with the main action, no extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity (1 param, no output schema), the description adequately explains what the tool returns, though it lacks error handling notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter 'slug' is well-described in the input schema itself (with examples), and the description adds no further semantic value beyond referencing 'by slug'. Schema coverage is 100%, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description precisely states the verb 'Fetch' and the resource 'full detail of one plan', and effectively distinguishes from sibling tools like esim_search_plans, esim_create_order, and esim_check_order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context (retrieve details for a specific plan) without explicit alternatives or not-to-use conditions, but the context is clear enough for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
esim_search_plansA
Search the WorldCitiSim eSIM catalog. Returns plans matching the given filters (country ISO code, region, desired days, desired GB). Plans have variations — each variation is one specific (days × GB × price) combo. The user picks one variation_id to buy.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | Two-letter ISO 3166-1 alpha-2 country code (e.g. 'JP', 'ES', 'US') OR a plan slug ('spain', 'japan', 'europe', 'global'). Matched case-insensitively against plan slugs and display names. | |
| region | No | Region slug: 'europe' | 'mena' | 'caribbean' | 'balkans' | 'latam' | 'asia' | 'global'. | |
| min_days | No | Minimum plan duration in days. | |
| max_days | No | Maximum plan duration in days. | |
| min_gb | No | Minimum data allowance in GB. Use -1 for 'unlimited'. | |
| limit | No | Max plans to return (default 5, max 20). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It discloses that it returns matching plans and mentions variations, but lacks details on pagination, limit behavior, or what happens on empty results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four concise sentences with no fluff, front-loading the purpose and explaining variations efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters and no output schema, the description adequately explains the search functionality and output structure (plans with variations). Lacks details on response format but sufficient for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds context about variations but doesn't add significant parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Search the WorldCitiSim eSIM catalog' and explains the output (plans with variations) and user action (pick variation_id). It distinguishes from siblings like esim_get_plan.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for searching plans but does not explicitly state when to use vs siblings or when not to use. No alternatives mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.2.1- First observed
esim_check_order - First observed
esim_create_order - First observed
esim_get_plan - First observed
esim_search_plans
TDQS
Scored across 4 tools
Each tool targets a distinct operation: searching plans, fetching plan details, creating orders, and checking order status. No overlap in purpose.
All tools follow a consistent esim_verb_noun pattern (search_plans, get_plan, create_order, check_order).
Four tools cover the eSIM purchase workflow adequately without being excessive or insufficient.
Core lifecycle (search, detail, order, status) is covered. Minor gaps like cancellation or order listing exist, but the main flow is complete.
Maintenance
Related MCP Connectors
Travel eSIMs: unlimited data, pick your days, top up existing eSIMs, card checkout, no API key.
Search & buy travel data eSIMs for 70+ destinations — pay by Stripe link, get the eSIM QR. USD.
Travel eSIMs in 200+ destinations and top-ups in 150+ countries, paid in USDC via x402
Prepaid travel data eSIMs: checkout links for people, autonomous purchases from a prepaid wallet.
Related MCP Servers
- AlicenseAqualityAmaintenanceBuy and manage a global eSIM through chat. One universal eSIM for 192 countries, per-MB billing in USDT or USDC across TRON, Solana, BSC, Polygon, Optimism, Arbitrum, TON. Anonymous-flow by default — no account required.12667 npm3MIT
- AlicenseNot gradedqualityDmaintenanceBrowse, compare, and purchase eSIMs for 190+ countries via AI agents. 12 tools for searching 2,300+ data plans, checking coverage, and buying eSIMs with crypto or card. No account required for browsing.MIT
- -licenseNot gradedqualityBmaintenanceLets AI agents search and buy travel eSIMs from ALT eSIM for 200+ destinations, with Stripe payment links and email delivery of QR codes.-
- AlicenseNot gradedqualityBmaintenanceSearch and buy travel eSIMs for 200+ countries, with specialized China plans that deliver uncensored internet without a VPN. Exposes five read-only tools to search plans, check device eSIM compatibility, get plan details, get help, and generate a secure on-site checkout link.MIT