Roamflat MCP
An official Model Context Protocol server provided by Roamflat that allows AI agents to query travel eSIM availability, get live pricing quotes for unlimited data plans, and retrieve direct purchase links for specific destinations, speeds, and durations without requiring user authentication.
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.
https://roamflat.com/wp-json/roamflat/mcpWhat its tools do
8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
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 roamflat.com ·
- Passed Endpoint is on the registry namespace domain ·
- Warning Advertises resources/templates/list but does not implement it
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Query available countries and eSIM network details
- Get live price quotes for specific eSIM configurations
- Retrieve direct purchase links for eSIMs
- Recommend optimal eSIM speeds based on device usage
Source and maintenance
Protocol and capabilities
- Server
- roamflat 2.0.4
- MCP protocol negotiated in check
- 2025-06-18
- Tools
- 8 advertised
- Resources
- 3 advertised
- Resource templates
- Not advertised
- Prompts
- 3 advertised
{
"tools": {},
"prompts": {},
"resources": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
8 advertised
get_shop_facts — Shop facts
What roamflat is and how the Flat works, in the shop's own words: speeds, networks, when the days start, delivery, payment, refund policy, adding days, My Flat, e-mails, app, devices, support. Use for any question that is not a price.
{
"type": "object",
"properties": {
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_destinations — List destinations
Every country roamflat builds a Flat for, with the number of networks, whether 5G (and so 25/50 Mbps) is available, and the starting price per day (5 Mbps, cheapest network). Use to check coverage or compare countries.
{
"type": "object",
"properties": {
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_flats — Flats of a country
The networks of one country (operator, 5G) and the Flats built from them — each Flat with the networks it includes and the price for every speed for the given days (null = that speed needs a 5G network). Use to explain the choice between networks and speeds.
{
"type": "object",
"required": [
"destination"
],
"properties": {
"days": {
"type": "integer",
"default": 7,
"maximum": 30,
"minimum": 1,
"description": "Days of mobile data (1–30)."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"destination": {
"type": "string",
"description": "Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}quote_flat — Quote one Flat
Use while the customer is still deciding — "how much is …?": the exact price of one configuration (country, speed, days and optionally which Flat / networks), the server price the customer would pay. Quote it as returned, never compute or scale it yourself. The result carries a buy_url for reference; when the customer says they want to buy, call start_checkout instead.
{
"type": "object",
"required": [
"destination",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Days of mobile data (1–30)."
},
"flat": {
"type": "integer",
"minimum": 1,
"description": "Optional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed."
},
"mbps": {
"enum": [
5,
10,
25,
50
],
"type": "integer",
"description": "Maximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given."
},
"destination": {
"type": "string",
"description": "Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat."
}
}
}{
"type": "object",
"properties": {
"iso": {
"type": "string",
"description": "ISO 3166-1 alpha-2, lower case."
},
"data": {
"type": "string"
},
"days": {
"type": "integer",
"description": "Days booked, counted from the first connection in the destination country."
},
"flat": {
"type": "integer",
"description": "Which Flat of the country (1 = cheapest network only; higher numbers include more networks). Pass it back to quote the same Flat."
},
"name": {
"type": "string",
"description": "The Flat's name as the shop shows it: \"Flat · Vodafone + O2\" or \"Flat · all 4 networks\"."
},
"note": {
"type": "string",
"description": "Present when something about the request had to be adjusted (a step up for the speed, an unknown network) — read it to the customer."
},
"price": {
"type": "number",
"description": "FULL price of this configuration in currency — the amount paid. Not per day."
},
"topup": {
"type": "object",
"properties": {
"how": {
"type": "string"
},
"kind": {
"enum": [
"days"
],
"type": "string"
}
},
"description": "How the customer adds days to this Flat later (not through the tools).",
"additionalProperties": true
},
"has_5g": {
"type": "boolean",
"description": "A 5G network is included."
},
"starts": {
"type": "string"
},
"buy_url": {
"type": "string",
"description": "The roamflat card preset to exactly this configuration. Use verbatim."
},
"hotspot": {
"type": "boolean"
},
"currency": {
"type": "string"
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Operator names included, as the shop states them."
},
"speed_mbps": {
"type": "integer",
"description": "The chosen maximum speed. Data is unlimited at this speed."
},
"destination": {
"type": "string",
"description": "Resolved country name (localized)."
},
"price_basis": {
"enum": [
"total"
],
"type": "string"
},
"all_networks": {
"type": "boolean"
},
"price_per_day": {
"type": "number",
"description": "For comparison only. Never multiply it yourself."
},
"price_is_final": {
"type": "boolean"
},
"networks_unmatched": {
"type": "array",
"items": {
"type": "string"
},
"description": "Present when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks."
}
},
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}price_grid — Price grid
Prices for several speed × days combinations of one Flat in one call (up to 8 day values; speeds default to all), e.g. to compare with other providers or to find the best fit. Same server prices as quote_flat.
{
"type": "object",
"required": [
"destination",
"days"
],
"properties": {
"days": {
"type": "array",
"items": {
"type": "integer",
"maximum": 30,
"minimum": 1
},
"maxItems": 8,
"minItems": 1,
"description": "Up to 8 day values, e.g. [3,7,14,30]."
},
"flat": {
"type": "integer",
"minimum": 1,
"description": "Optional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed."
},
"mbps": {
"type": "array",
"items": {
"enum": [
5,
10,
25,
50
],
"type": "integer"
},
"maxItems": 4,
"description": "Speeds to include (default all: 5, 10, 25, 50)."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given."
},
"destination": {
"type": "string",
"description": "Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}recommend_config — Recommend a Flat
Use when the customer describes the trip instead of a speed: country (or up to 5), days and what will be connected (devices: phone, phone_laptop, small_group, family, creator_posting, creator_live, creator_hd_live, creator_pro). Picks the speed from the roamflat speed guide and returns it server-quoted together with the step below and the step above (where offered), each with price, networks, a one-line reason and its buy_url, plus trip totals and an optional budget check. A speed that needs 5G in a country without 5G falls back to the highest speed there and says so. Prices are the same as quote_flat. Give destination (one country) or destinations (several) — one of the two is required; a call without a country fails with invalid_argument.
{
"type": "object",
"required": [
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Days of mobile data (1–30)."
},
"flat": {
"type": "integer",
"minimum": 1,
"description": "Optional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"budget": {
"type": "number",
"description": "Optional budget for the whole trip in the quoted currency; options above it are marked."
},
"devices": {
"enum": [
"phone",
"phone_laptop",
"small_group",
"family",
"creator_posting",
"creator_live",
"creator_hd_live",
"creator_pro"
],
"type": "string",
"description": "phone = one phone (5 Mbps); phone_laptop = phone + laptop; small_group = a travel router for two or three devices; family = one travel router for the whole family; creator_posting = stories, reels, TikToks; creator_live = going live from the phone; creator_hd_live = Full HD live streams; creator_pro = multi-camera live and 4K uploads. Default phone."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given."
},
"destination": {
"type": "string",
"description": "Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat. Required unless destinations is given."
},
"per_country": {
"type": "array",
"items": {
"type": "object",
"properties": {
"days": {
"type": "integer"
},
"destination": {
"type": "string"
}
}
},
"description": "Optional days per country for a multi-country trip."
},
"destinations": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Several countries (max 5), any language or ISO codes. Use instead of destination for a multi-country trip. Required unless destination is given."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}plan_trip — Plan a multi-country trip
A trip through several countries (max 5): one Flat per country, each quoted at the same speed and days unless given per country. days is PER COUNTRY, never the whole trip: for a 12-day trip through Japan and Thailand pass per_country days that add up to 12 (e.g. 7 + 5). Returns one line per country with price and buy_url, plus the total. Use when the customer names two or more countries and a speed (2–5 destinations); for one country call quote_flat; use recommend_config when they describe devices or usage instead.
{
"type": "object",
"required": [
"destinations"
],
"properties": {
"days": {
"type": "integer",
"default": 7,
"maximum": 30,
"minimum": 1,
"description": "Days in EACH country (1–30, default 7) — NOT the length of the whole trip. A 12-day trip through 3 countries is about 4 days per country: split the trip with per_country days that add up to the trip length."
},
"mbps": {
"enum": [
5,
10,
25,
50
],
"type": "integer",
"description": "Maximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"per_country": {
"type": "array",
"items": {
"type": "object",
"properties": {
"days": {
"type": "integer"
},
"mbps": {
"type": "integer"
},
"destination": {
"type": "string"
}
}
},
"description": "Optional overrides per country (days and/or mbps). Use it to split the trip: the days of all countries together should add up to the trip length."
},
"destinations": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"minItems": 2,
"description": "Countries of the trip (2–5), any language or ISO codes, in travel order."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}start_checkout — Start secure checkout
Use only once the customer has decided to buy ("I'll take it", "how do I buy?"): the checkout handoff. Returns the buy_url to give the customer, the final price and a ready-to-send checkout block (next_step, payment_methods, delivery) — on the page they press the buy button (buy_button, e.g. "Get your Flat" in English) and pay securely. No account needed; the eSIM is delivered on screen and by email within seconds of payment. No in-chat order tracking, no discount codes. For prices while the customer is still comparing, use quote_flat.
{
"type": "object",
"required": [
"destination",
"days"
],
"properties": {
"days": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "Days of mobile data (1–30)."
},
"flat": {
"type": "integer",
"minimum": 1,
"description": "Optional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed."
},
"mbps": {
"enum": [
5,
10,
25,
50
],
"type": "integer",
"description": "Maximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network."
},
"bucket": {
"type": "string",
"description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
},
"currency": {
"type": "string",
"description": "Optional ISO 4217 override for prices."
},
"language": {
"type": "string",
"description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given."
},
"destination": {
"type": "string",
"description": "Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat."
}
}
}{
"type": "object",
"required": [
"buy_url",
"price",
"currency",
"next_step"
],
"properties": {
"iso": {
"type": "string",
"description": "ISO 3166-1 alpha-2, lower case."
},
"data": {
"type": "string"
},
"days": {
"type": "integer",
"description": "Days booked, counted from the first connection in the destination country."
},
"flat": {
"type": "integer",
"description": "Which Flat of the country (1 = cheapest network only; higher numbers include more networks). Pass it back to quote the same Flat."
},
"name": {
"type": "string",
"description": "The Flat's name as the shop shows it: \"Flat · Vodafone + O2\" or \"Flat · all 4 networks\"."
},
"note": {
"type": "string",
"description": "Present when something about the request had to be adjusted (a step up for the speed, an unknown network) — read it to the customer."
},
"price": {
"type": "number",
"description": "FULL price of this configuration in currency — the amount paid. Not per day."
},
"topup": {
"type": "object",
"properties": {
"how": {
"type": "string"
},
"kind": {
"enum": [
"days"
],
"type": "string"
}
},
"description": "How the customer adds days to this Flat later (not through the tools).",
"additionalProperties": true
},
"has_5g": {
"type": "boolean",
"description": "A 5G network is included."
},
"starts": {
"type": "string"
},
"buy_url": {
"type": "string",
"description": "The roamflat card preset to exactly this configuration. Use verbatim."
},
"hotspot": {
"type": "boolean"
},
"message": {
"type": "string",
"description": "A ready-to-send line for the customer."
},
"currency": {
"type": "string"
},
"delivery": {
"type": "string",
"description": "How and when the eSIM arrives."
},
"networks": {
"type": "array",
"items": {
"type": "string"
},
"description": "Operator names included, as the shop states them."
},
"next_step": {
"type": "string",
"description": "What the customer does now: open buy_url, press \"Get your Flat\", pay."
},
"buy_button": {
"type": "string",
"description": "The label of the buy button on the page, in the language of the customer: name it exactly so."
},
"speed_mbps": {
"type": "integer",
"description": "The chosen maximum speed. Data is unlimited at this speed."
},
"destination": {
"type": "string",
"description": "Resolved country name (localized)."
},
"price_basis": {
"enum": [
"total"
],
"type": "string"
},
"all_networks": {
"type": "boolean"
},
"price_per_day": {
"type": "number",
"description": "For comparison only. Never multiply it yourself."
},
"price_is_final": {
"type": "boolean"
},
"payment_methods": {
"type": "array",
"items": {
"type": "string"
}
},
"networks_unmatched": {
"type": "array",
"items": {
"type": "string"
},
"description": "Present when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks."
}
},
"additionalProperties": true
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}Prompts
3 advertised
quote_my_trip — Price a Flat for my trip
Quote a roamflat Flat for one or more countries, a number of days and the devices to connect.
- countries
- Countries of the trip, comma-separated, any language (required)
- days
- Days of mobile data needed (required)
- devices
- What will be connected or done, e.g. "one phone", "two phones and a laptop", "family with a travel router", "live streaming to TikTok"
recommend_my_flat — Which Flat for my trip?
Pick and price the right speed from the trip: country, days and what will be connected.
- destination
- Country, any language (required)
- days
- Days of the trip (required)
- devices
- phone, phone_laptop, small_group, family, creator_posting, creator_live, creator_hd_live or creator_pro
compare_options — Compare speeds and networks
Show the Flats of one country — networks, 5G, and the price of every speed — so the customer can pick.
- destination
- Country, any language (required)
- days
- Days
Resources
3 advertised
shop-facts — roamflat shop facts
The Flat, speeds, networks, delivery, devices, payment, refund policy, My Flat, app, support, company — the same data get_shop_facts returns.
roamflat://shop-factsllms.txt — roamflat llms.txt
The shop's guide for AI assistants: the Flat, policies, locales, links.
roamflat://llms.txtsetup-guide — eSIM installation guide
How a customer installs a roamflat eSIM on iPhone and Android and when the Flat starts.
roamflat://setup-guide30-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
- 2436 ms
- 95th percentile latency
- 2436 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 2436 ms · metadata changed · 8 tool(s), 3 resource(s), 3 prompt(s); warnings: Advertises resources/templates/list but does not implement it
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http roamflat-mcp https://roamflat.com/wp-json/roamflat/mcpCodex
codex mcp add roamflat-mcp --url https://roamflat.com/wp-json/roamflat/mcpCursor
{
"mcpServers": {
"roamflat-mcp": {
"url": "https://roamflat.com/wp-json/roamflat/mcp"
}
}
}Cline
{
"mcpServers": {
"roamflat-mcp": {
"type": "streamableHttp",
"url": "https://roamflat.com/wp-json/roamflat/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"roamflat-mcp": {
"type": "http",
"url": "https://roamflat.com/wp-json/roamflat/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http roamflat-mcp https://roamflat.com/wp-json/roamflat/mcpClaude Desktop
https://roamflat.com/wp-json/roamflat/mcpWindsurf
{
"mcpServers": {
"roamflat-mcp": {
"serverUrl": "https://roamflat.com/wp-json/roamflat/mcp"
}
}
}Let your agent find its tools
Find servers like Roamflat MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other commerce servers
Do you run Roamflat 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.