MCP Server

eSIM Tabby

com.esimtabby/esimtabby
Commerce & Retail Travel & Hospitality Public & reachable MCP 2025-11-25

What this MCP does

Searches, purchases, manages, tops up, and cancels travel eSIM data plans, with activation details, usage checks, and card or USDC payment options.

cancel_order
Cancel and refund an order
Cancel an order and refund it. Only possible while the eSIM is uninstalled. Once the profile has been installed on a device the provider refuses to take it back, and this returns an error instead — send the user to support. Card payments refund automatically. A USDC payment has no on-chain refund rail, so the order becomes `refund_pending` and support returns the money by hand.
Destructive Open world
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id of the order to cancel'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
create_checkout
Start a purchase
Start a purchase — the step after the user picks a plan from search_esim_plans. Call it with that plan's plan_id (get_plan_details shows the current price first). Returns an order_id and where to pay, on the rail you asked for: 'card' (the default) returns a checkout_url — a hosted Stripe page for a human to open in a browser; once they say they've paid, call get_order_status to confirm and carry on to the QR code. 'x402' returns an x402_url for a wallet to settle in USDC, with no browser step — only choose it if you actually hold a wallet. Never accepts payment details — a card is entered on the hosted page, and a wallet signs for itself. Calling it again for the same plan reuses the pending order (reused: true) instead of creating a duplicate.
Open world
Input schema
{'type': 'object', 'required': ['plan_id'], 'properties': {'plan_id': {'type': 'string', 'description': 'plan_id from search_esim_plans'}, 'pay_with': {'enum': ['card', 'x402'], 'type': 'string', 'default': 'card', 'description': "How the buyer intends to pay. 'card' returns a hosted checkout link for a human to open in a browser. 'x402' returns an x402_url for a wallet tool to settle in USDC, with no browser step â\x80\x94 only choose it if you have a wallet. An order keeps the rail it was first given: to pay an existing card order in USDC instead, cancel it and start a new one, so there are never two live ways to pay it."}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
create_topup_checkout
Buy more data
Buy more data for an eSIM the user already has — the step after list_topup_options. Call it with the order_id of the fulfilled eSIM and a plan_id chosen from list_topup_options. The top-up lands on the existing eSIM: same QR code, nothing to re-install. Returns a new order_id and where to pay, exactly like create_checkout: 'card' returns a checkout_url for a human to open, confirmed via get_order_status; 'x402' returns an x402_url for a wallet to settle in USDC. Never accepts payment details — a card is entered on the hosted page, and a wallet signs for itself.
Open world
Input schema
{'type': 'object', 'required': ['order_id', 'plan_id'], 'properties': {'plan_id': {'type': 'string', 'description': 'plan_id from list_topup_options'}, 'order_id': {'type': 'string', 'description': 'order_id of the eSIM to add data to'}, 'pay_with': {'enum': ['card', 'x402'], 'type': 'string', 'default': 'card', 'description': "How the buyer intends to pay. 'card' returns a hosted checkout link for a human to open in a browser. 'x402' returns an x402_url for a wallet tool to settle in USDC, with no browser step â\x80\x94 only choose it if you have a wallet. An order keeps the rail it was first given: to pay an existing card order in USDC instead, cancel it and start a new one, so there are never two live ways to pay it."}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
get_esim_activation
Get eSIM activation QR code
Get the QR code and activation details for a purchased eSIM. Not read-only: like get_order_status, an order that is not ready yet is advanced first, so this can change the order's state.
Open world Idempotent
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id of a fulfilled order'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'title': 'Activation', 'required': ['order_id', 'iccid', 'qr_code_url', 'activation_code', 'smdp_address', 'expires_at', 'instructions'], 'properties': {'iccid': {'type': 'string', 'title': 'Iccid', 'description': "The eSIM's ICCID"}, 'order_id': {'type': 'string', 'title': 'Order Id', 'description': 'The order this eSIM belongs to'}, 'expires_at': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Expires At', 'description': "When the plan expires, in the provider's own format"}, 'qr_code_url': {'type': 'string', 'title': 'Qr Code Url', 'description': 'Image URL of the activation QR code'}, 'instructions': {'type': 'string', 'title': 'Instructions', 'description': 'How to install the eSIM'}, 'smdp_address': {'type': 'string', 'title': 'Smdp Address', 'description': 'SM-DP+ server address, for manual install'}, 'activation_code': {'type': 'string', 'title': 'Activation Code', 'description': 'LPA activation string, for manual install'}}, 'description': 'What `get_esim_activation` returns.\n\nThe other tools annotate their return type and FastMCP derives the schema from it.\nThis one hands back a ToolResult â\x80\x94 the QR has to reach the reply body as markdown â\x80\x94\nso the type goes here instead and the schema is derived from it below.'}
get_esim_usage
Check data usage
How much data an active eSIM has used, and how much is left.
Read only
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id of a fulfilled order'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
get_order_status
Check order status
Check an order. Call this after the user says they've paid. Not read-only: an order still in progress is advanced first — payment is confirmed and the provider order placed or collected — so the status can change as a result of calling this.
Open world Idempotent
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id from create_checkout'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
get_plan_details
Get plan details
Full details of one eSIM plan, including current price.
Read only
Input schema
{'type': 'object', 'required': ['plan_id'], 'properties': {'plan_id': {'type': 'string', 'description': 'plan_id from search_esim_plans'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'additionalProperties': True}
list_my_orders
List my eSIM orders
List this account's eSIM orders, newest first.
Read only
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'x-fastmcp-wrap-result': True}
list_topup_options
List data top-ups
Data top-ups that can be added to an eSIM the user already has. A top-up extends the existing eSIM — same QR code, nothing to re-install. Not every plan is reloadable; this returns an empty list when none apply.
Read only
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id of a fulfilled eSIM to add data to'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'x-fastmcp-wrap-result': True}
pay_order
Pay for an order in USDC
Pay for an order in USDC over x402, without opening a browser. Only for an MCP client that signs x402 payments itself: call it once for the payment requirements, then repeat the call carrying the signed payment in _meta['x402/payment'] and it settles and starts the eSIM. If your wallet is a separate tool, make an x402 request to the order's x402_url instead — this tool cannot take a payment on a wallet tool's behalf.
Open world
Input schema
{'type': 'object', 'required': ['order_id'], 'properties': {'order_id': {'type': 'string', 'description': 'order_id from create_checkout'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'properties': {'error': {'type': 'string', 'description': 'How to pay, for the 402 case'}, 'result': {'type': 'string'}, 'status': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}, 'description': 'x402 payment requirements to satisfy'}, 'order_id': {'type': 'string'}, 'next_step': {'type': 'string'}, 'paid_with': {'type': 'string'}, 'transaction': {'type': 'string', 'description': 'On-chain transaction hash'}, 'x402Version': {'type': 'integer'}}, 'description': 'Without a payment: the x402 payment requirements (accepts, error). With one: the settled order (transaction, next_step), or the unchanged order plus `result` when it was no longer awaiting payment.', 'additionalProperties': True}
search_esim_plans
Search eSIM plans
Find travel eSIM data plans available for a destination.
Read only
Input schema
{'type': 'object', 'required': ['country'], 'properties': {'country': {'type': 'string', 'description': 'Country or region name, or ISO 3166-1 alpha-2 code'}, 'min_data_mb': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Only plans with at least this much data'}, 'max_duration_days': {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'default': None, 'description': 'Only plans lasting at most this many days'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'required': ['result'], 'properties': {'result': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}}, 'x-fastmcp-wrap-result': True}
Added
list_my_orders
Sept. 17, 2026, 12:34 p.m.
Added
cancel_order
Sept. 17, 2026, 12:34 p.m.
Added
get_esim_usage
Sept. 17, 2026, 12:34 p.m.
Added
create_topup_checkout
Sept. 17, 2026, 12:34 p.m.
Added
list_topup_options
Sept. 17, 2026, 12:34 p.m.
Added
get_esim_activation
Sept. 17, 2026, 12:34 p.m.
Added
get_order_status
Sept. 17, 2026, 12:34 p.m.
Added
pay_order
Sept. 17, 2026, 12:34 p.m.
Added
create_checkout
Sept. 17, 2026, 12:34 p.m.
Added
get_plan_details
Sept. 17, 2026, 12:34 p.m.
Added
search_esim_plans
Sept. 17, 2026, 12:34 p.m.