Skip to main content
Glama

roamflat Flat configurator

Server Details

Unlimited travel eSIMs at 5–50 Mbps: live quotes by country, speed and days, plus a buy link.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
29.8% over 48 days
Last Tested
Transport
Streamable HTTP · MCP 2025-06-18
URL

TDQS

A4.1/5.0

Scored across 8 tools

Disambiguation4/5

The tools divide mostly cleanly by customer intent and scope: discovery (list_destinations/get_flats), shop FAQ (get_shop_facts), pricing/quoting (quote_flat/price_grid), recommendation (recommend_config), multi-country planning (plan_trip), and checkout (start_checkout). Several tools return prices, so quote_flat, price_grid, and get_flats have some overlap, but the descriptions explicitly route between them.

Naming Consistency5/5

All tool names are lowercase snake_case and generally follow an action_object pattern such as get_flats, list_destinations, quote_flat, recommend_config, and start_checkout. The convention is predictable and readable throughout.

Tool Count5/5

Eight tools are well scoped for a Flat configurator: enough to cover discovery, pricing, recommendation, trip planning, and checkout without becoming bloated. Each tool appears to earn its place.

Completeness5/5

The surface covers the full purchase-decision lifecycle: destination discovery, detailed network/Flat information, pricing, device-based recommendation, multi-country planning, shop policies, and checkout handoff. Post-purchase order tracking is explicitly out of scope, so it is not a meaningful gap here.

Available Tools

8 tools
get_flatsFlats of a countryB
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysNoDays of mobile data (1–30).
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
destinationYesCountry in ANY language or its ISO code, e.g. "Japan", "Japon", "jp". Map a city to its country first. One country per Flat.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds a genuine domain detail (null price means that speed requires a 5G network) but nothing about ordering, coverage, or limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences that front-load what is returned and then state the use case. Dense but no filler; the parenthetical null rule is the only slightly tucked-away detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the weight of explaining the return shape, which it does partially (networks, Flats, per-speed prices, null convention). The undefined concept of a 'Flat' and its relationship to a network remains ambiguous for a closed-world read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all five parameters are self-documented and the baseline is 3. The description only loosely ties to parameters ('price for every speed for the given days') without adding syntax or format detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the resource (networks of one country plus the Flats built from them) and what each Flat carries (included networks, price per speed). It is clear what the tool returns, though it never differentiates itself from siblings like quote_flat or price_grid, and the jargon 'Flat' is left undefined.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It offers one usage hint — 'Use to explain the choice between networks and speeds' — which implies a comparison/explanation context. There is no when-not guidance and no named alternative among siblings (quote_flat, price_grid), leaving the agent to infer selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_shop_factsShop factsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed-world scope, so safety is covered. The description adds useful framing that the content is 'in the shop's own words' (verbatim/authoritative vendor copy), but says nothing about return shape or coverage limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence stating what the resource is, followed by a compact topic enumeration and one routing clause. No filler; every clause tells the agent what content is reachable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-argument, read-only knowledge tool with no output schema, the topic enumeration is enough for an agent to know it can answer policy/spec questions from here. Return formatting is not covered, but the annotations and coverage topics make the definition largely self-sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both bucket and language are fully documented in the schema, so the description does not need to repeat them. It adds no extra meaning about how these affect the returned facts, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the exact knowledge domain it retrieves (speeds, networks, day start, delivery, payment, refund policy, app, devices, support) and explicitly distinguishes itself from price-related siblings via 'Use for any question that is not a price.' The retrieval verb itself is only implicit, but the resource and scope are unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear routing rule: use it for any non-price question, which implicitly excludes price queries handled by price_grid/quote_flat/start_checkout. It does not name those siblings explicitly, so the agent must infer which price tool to fall back to.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_destinationsList destinationsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the full safety profile (readOnlyHint, idempotentHint, destructiveHint=false, closed-world), so the description need not restate it. What the description adds is mostly return-content detail (which fields appear) rather than behavioural traits — no mention of pagination, result size, or whether all countries are always returned, though 'Every country' does imply a complete, unpaginated set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler: the first front-loads what the list contains, the second states the use case. The parenthetical clarifications (5 Mbps, cheapest network) are dense but earn their place by defining the price basis.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description usefully enumerates the returned fields and the pricing baseline, which is the main thing an agent needs. It omits pagination/volume expectations and does not relate the optional locale parameters to the returned link locales, but nothing critical for a read-only list call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so bucket, currency, and language are all fully documented in the schema itself. The description mentions none of them and adds no syntax or interaction detail (e.g. how bucket overrides language), so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (every country roamflat builds a Flat for) and enumerates the returned fields (network count, 5G/25-50 Mbps availability, starting price per day at 5 Mbps on the cheapest network), so the agent knows exactly what this list contains. It does not explicitly distinguish itself from potentially overlapping siblings like price_grid, which is the only gap.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use to check coverage or compare countries' gives a clear positive usage context that maps directly to the tool's content. It does not name a when-not condition or point at an alternative sibling (e.g. price_grid for deeper pricing comparison), so routing between overlapping tools is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_tripPlan a multi-country tripA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysNoDays 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.
mbpsNoMaximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network.
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
per_countryNoOptional 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.
destinationsYesCountries of the trip (2–5), any language or ISO codes, in travel order.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds non-obvious behavior beyond that: the return shape ('one line per country with price and buy_url, plus the total'), the max-5 cap, and the critical rule that 'days is PER COUNTRY, never the whole trip' with a worked 7+5 example. Only pricing/auth edge cases are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trip scope and the max-5 constraint, then the per-country days rule and example, then the return shape, then routing to siblings. Dense but every clause carries decision-relevant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no output schema, the description covers inputs, defaults, return structure (per-country lines plus total), cardinality limits, and sibling routing. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so 3 is the floor. The description still adds value beyond the schema by stating the cross-parameter default rule ('each quoted at the same speed and days unless given per country') and reinforcing the per-country days split with the 12-day Japan/Thailand example, which clarifies how `days` and `per_country` interact.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('a trip through several countries', one Flat per country, max 5) and explicitly differentiates from siblings: 'for one country call quote_flat; use recommend_config when they describe devices or usage instead.' An agent can pick this tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use criteria ('customer names two or more countries and a speed, 2–5 destinations') and names both alternative tools with the conditions that select them. No exclusions are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

price_gridPrice gridA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysYesUp to 8 day values, e.g. [3,7,14,30].
flatNoOptional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed.
mbpsNoSpeeds to include (default all: 5, 10, 25, 50).
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
networksNoOptional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given.
destinationYesCountry in ANY language or its ISO code, e.g. "Japan", "Japon", "jp". Map a city to its country first. One country per Flat.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is fully covered without the description. The description adds one genuinely new behavioral guarantee — that prices match quote_flat's server prices, useful for cross-tool consistency — but repeats schema-level facts ('up to 8 day values; speeds default to all') and says nothing about rate limits, caching, or the shape of the returned price matrix.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the core output and its multi-combination scope, followed by usage examples and a cross-tool consistency note. Every clause contributes; nothing is padding, and the most important constraint (the grid nature and 8-value cap) appears first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter read tool with full schema coverage and clear safety annotations, the description covers purpose, scope limits, usage context, and cross-tool consistency. The one omission is the return shape of the price grid — with no output schema, an agent must infer the matrix structure — but that is a minor gap given how self-evident a price grid is.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented in the schema. The description's parameter mentions (day-value cap, speed defaults) merely duplicate the schema, adding no new meaning about defaults, interaction between flat/networks/bucket, or currency precedence. Baseline 3 applies when the schema carries the parameter burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific output (prices for several speed × days combinations of one Flat in one call) and a concrete constraint (up to 8 day values, speeds default to all), so the resource is unambiguous. It gestures at its relationship to quote_flat via 'Same server prices as quote_flat', which hints at the single-combination vs grid distinction, but it never explicitly frames quote_flat as the sibling for a single quote, so the differentiation stays implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage contexts — comparing with other providers or finding the best fit — which tells an agent why it would reach for this tool over a plain price lookup. However, it stops short of explicit when-not guidance (e.g. 'use quote_flat instead when you need a single combination'), so the routing rule against the closest sibling is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

quote_flatQuote one FlatA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysYesDays of mobile data (1–30).
flatNoOptional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed.
mbpsNoMaximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network.
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
networksNoOptional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given.
destinationYesCountry in ANY language or its ISO code, e.g. "Japan", "Japon", "jp". Map a city to its country first. One country per Flat.

Output Schema

NameRequiredDescription
isoNoISO 3166-1 alpha-2, lower case.
dataNo
daysNoDays booked, counted from the first connection in the destination country.
flatNoWhich Flat of the country (1 = cheapest network only; higher numbers include more networks). Pass it back to quote the same Flat.
nameNoThe Flat's name as the shop shows it: "Flat · Vodafone + O2" or "Flat · all 4 networks".
noteNoPresent when something about the request had to be adjusted (a step up for the speed, an unknown network) — read it to the customer.
priceNoFULL price of this configuration in currency — the amount paid. Not per day.
topupNoHow the customer adds days to this Flat later (not through the tools).
has_5gNoA 5G network is included.
startsNo
buy_urlNoThe roamflat card preset to exactly this configuration. Use verbatim.
hotspotNo
currencyNo
networksNoOperator names included, as the shop states them.
speed_mbpsNoThe chosen maximum speed. Data is unlimited at this speed.
destinationNoResolved country name (localized).
price_basisNo
all_networksNo
price_per_dayNoFor comparison only. Never multiply it yourself.
price_is_finalNo
networks_unmatchedNoPresent when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe, idempotent read. The description adds non-obvious behavior: the price must be quoted as returned and never computed or scaled, and the result carries a buy_url for reference. It stops short of saying anything about price validity/expiry or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the usage scenario before the mechanics, and the routing to start_checkout is placed last where it matters. Reasonably tight, though the quoted customer phrase and the parenthetical field list are slightly redundant with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be enumerated, yet the description still flags the buy_url. Combined with usage routing, price semantics and the no-computation rule, an agent has everything needed to call this correctly alongside its seven siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter including days, flat, mbps, networks and destination is already fully documented. The description only restates the field list ('country, speed, days and optionally which Flat / networks') without adding format or edge-case meaning. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action on a specific resource: the exact price of one configuration. It distinguishes itself from price_grid (grid of many), recommend_config (recommendation) and start_checkout (purchase) by scoping to a single quote the customer pays.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the trigger ('Use while the customer is still deciding - how much is …?') and an explicit exclusion with the alternative to use instead ('when the customer says they want to buy, call start_checkout instead'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_configRecommend a FlatA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysYesDays of mobile data (1–30).
flatNoOptional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed.
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
budgetNoOptional budget for the whole trip in the quoted currency; options above it are marked.
devicesNophone = 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.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
networksNoOptional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given.
destinationNoCountry 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_countryNoOptional days per country for a multi-country trip.
destinationsNoSeveral countries (max 5), any language or ISO codes. Use instead of destination for a multi-country trip. Required unless destination is given.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantive behavior beyond them: the 5G fallback rule and that it says so, the return shape (chosen speed plus the step below and above with reason and buy_url, trip totals, optional budget check), and budget marking. Slightly short of 5 only because handling of edge cases like per_country vs destinations interaction is left implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the trigger and inputs, then the return shape and pricing note. Dense but each sentence carries information; the long second sentence bundles several facts but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter read-only recommendation tool with no output schema, the description covers inputs, selection logic, return payload, fallback behavior, and error conditions — enough for correct invocation and interpretation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter meaning: destination XOR destinations with max 5, budget marking options above it, and the driver for speed selection (days, devices, networks). It reinforces rather than merely repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (recommend a Flat/speed for a described trip) and immediately scopes it against the sibling case ('when the customer describes the trip instead of a speed'). It also clarifies its relationship to quote_flat ('Prices are the same as quote_flat'), so the agent can distinguish it without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the trigger condition (trip described rather than a speed), the required input form (destination OR destinations, max 5), the failure mode of omitting both ('fails with invalid_argument'), and points to quote_flat for its pricing. When/when-not and the alternative are both present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_checkoutStart secure checkoutA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
daysYesDays of mobile data (1–30).
flatNoOptional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed.
mbpsNoMaximum speed in Mbps (5, 10, 25, 50; default 5). Data is unlimited at that speed. 25 Mbps and up need a 5G network.
bucketNoOptional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.
currencyNoOptional ISO 4217 override for prices.
languageNoISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.
networksNoOptional: operator names from get_flats that must be included (the cheapest Flat holding all of them is used). Ignored when flat is given.
destinationYesCountry in ANY language or its ISO code, e.g. "Japan", "Japon", "jp". Map a city to its country first. One country per Flat.

Output Schema

NameRequiredDescription
isoNoISO 3166-1 alpha-2, lower case.
dataNo
daysNoDays booked, counted from the first connection in the destination country.
flatNoWhich Flat of the country (1 = cheapest network only; higher numbers include more networks). Pass it back to quote the same Flat.
nameNoThe Flat's name as the shop shows it: "Flat · Vodafone + O2" or "Flat · all 4 networks".
noteNoPresent when something about the request had to be adjusted (a step up for the speed, an unknown network) — read it to the customer.
priceYesFULL price of this configuration in currency — the amount paid. Not per day.
topupNoHow the customer adds days to this Flat later (not through the tools).
has_5gNoA 5G network is included.
startsNo
buy_urlYesThe roamflat card preset to exactly this configuration. Use verbatim.
hotspotNo
messageNoA ready-to-send line for the customer.
currencyYes
deliveryNoHow and when the eSIM arrives.
networksNoOperator names included, as the shop states them.
next_stepYesWhat the customer does now: open buy_url, press "Get your Flat", pay.
buy_buttonNoThe label of the buy button on the page, in the language of the customer: name it exactly so.
speed_mbpsNoThe chosen maximum speed. Data is unlimited at this speed.
destinationNoResolved country name (localized).
price_basisNo
all_networksNo
price_per_dayNoFor comparison only. Never multiply it yourself.
price_is_finalNo
payment_methodsNo
networks_unmatchedNoPresent when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description explains WHY that is coherent: the purchase happens on the hosted page the customer is handed to, with no account required. It also discloses post-payment behavior (eSIM delivered on screen and by email within seconds) and explicit non-capabilities. Some of that surfaces return-value detail that the output schema already encodes, keeping it just short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the gating condition, then the return payload, then scope exclusions. Dense but each clause earns its place; the parenthetical enumeration of output fields (next_step, payment_methods, delivery) is mild redundancy against the existing output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters at full schema coverage, rich annotations, and an output schema, the description supplies exactly the missing layer: the conversational moment to invoke, the alternative for pre-decision pricing, and what the agent should do with the result (hand the customer the URL). Nothing needed to call it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including enums, ranges, defaults and cross-references to get_flats, so the schema carries parameter meaning fully. The description itself names no parameters or formats (currency, bucket, flat selection), contributing nothing beyond the structured fields — baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource: 'the checkout handoff' that 'Returns the buy_url to give the customer, the final price and a ready-to-send checkout block'. It also explicitly separates itself from the pricing sibling by naming quote_flat, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both the trigger condition and concrete customer utterances ('I'll take it', 'how do I buy?') and the negative condition ('For prices while the customer is still comparing, use quote_flat'). It adds further exclusions — no in-chat order tracking, no discount codes — so the boundary is unambiguous.

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.

  1. 2 tool updates
    • Changedplan_trip2 fields changed
      • changedInput schema / properties / days / description
        Previous value: -"Days of mobile data (1–30)."New value: +"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."
      • changedInput schema / properties / per_country / description
        Previous value: -"Optional overrides per country (days and/or mbps)."New value: +"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."
    • Changedstart_checkout1 field changed
      • addedOutput schema / properties / buy_button
        Added value: +{
        +  "description": "The label of the buy button on the page, in the language of the customer: name it exactly so.",
        +  "type": "string"
        +}
  2. 2 tool updates
    • Changedplan_trip2 fields changed
      • changedInput schema / properties / destinations / description
        Previous value: -"Countries of the trip, any language or ISO codes, in travel order."New value: +"Countries of the trip (2–5), any language or ISO codes, in travel order."
      • addedInput schema / properties / destinations / minItems
        Added value: +2
    • Changedrecommend_config2 fields changed
      • changedInput schema / properties / destination / description
        Previous value: -"Country in ANY language or its ISO code, e.g. \"Japan\", \"Japon\", \"jp\". Map a city to its country first. One country per Flat."New value: +"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."
      • changedInput schema / properties / destinations / description
        Previous value: -"Several countries (max 5), any language or ISO codes. Use instead of destination for a multi-country trip."New value: +"Several countries (max 5), any language or ISO codes. Use instead of destination for a multi-country trip. Required unless destination is given."
  3. 3 tool updates
    • Changedquote_flat3 fields changed
      • addedOutput schema / properties / networks_unmatched
        Added value: +{
        +  "description": "Present when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / topup
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "How the customer adds days to this Flat later (not through the tools).",
        +  "properties": {
        +    "how": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "days"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedrecommend_config
    • Changedstart_checkout3 fields changed
      • addedOutput schema / properties / networks_unmatched
        Added value: +{
        +  "description": "Present when a requested network does not exist in this country: those names. The quote then uses the Flat listed in networks.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / note
        Added value: +{
        +  "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.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / topup
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "How the customer adds days to this Flat later (not through the tools).",
        +  "properties": {
        +    "how": {
        +      "type": "string"
        +    },
        +    "kind": {
        +      "enum": [
        +        "days"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
  4. 2 tool updates
    • Changedprice_grid6 fields changed
      • addedInput schema / properties / days / items / maximum
        Added value: +30
      • addedInput schema / properties / days / items / minimum
        Added value: +1
      • addedInput schema / properties / days / maxItems
        Added value: +8
      • addedInput schema / properties / days / minItems
        Added value: +1
      • addedInput schema / properties / mbps / items / enum
        Added value: +[
        +  5,
        +  10,
        +  25,
        +  50
        +]
      • addedInput schema / properties / mbps / maxItems
        Added value: +4
    • Changedstart_checkout5 fields changed
      • addedOutput schema / properties / delivery
        Added value: +{
        +  "description": "How and when the eSIM arrives.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / message
        Added value: +{
        +  "description": "A ready-to-send line for the customer.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / next_step
        Added value: +{
        +  "description": "What the customer does now: open buy_url, press \"Get your Flat\", pay.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / payment_methods
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / required
        Added value: +[
        +  "buy_url",
        +  "price",
        +  "currency",
        +  "next_step"
        +]
  5. 10 tool updates
    • Addedget_flats
    • Removedget_plan_details
    • Changedget_shop_facts3 fields changed
      • addedInput schema / properties / bucket
        Added value: +{
        +  "description": "Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language.",
        +  "type": "string"
        +}
      • addedInput schema / properties / language
        Added value: +{
        +  "description": "ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices.",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}New value: +null
    • Addedlist_destinations
    • Addedplan_trip
    • Addedprice_grid
    • Addedquote_flat
    • Removedrecommend_plan
    • Removedsearch_esim_plans
    • Changedstart_checkout34 fields changed
      • changedInput schema / properties / bucket / description
        Previous value: -"Optional language-region bucket the customer shops in, e.g. \"en-gb\", \"de-de\". Wins over language; prices and links are quoted in it."New value: +"Optional language-region bucket the customer shops in, e.g. en-gb, de-de (sets currency and link locale). Defaults from language."
      • changedInput schema / properties / currency / description
        Previous value: -"Optional ISO 4217 code. Every price in the result is quoted in it."New value: +"Optional ISO 4217 override for prices."
      • changedInput schema / properties / days / description
        Previous value: -"Number of days to buy. Must be one of the Flat's durations; omit to buy the duration product_id stands for. When the exact count is not offered, the next longer duration is chosen and reported in days."New value: +"Days of mobile data (1–30)."
      • addedInput schema / properties / days / maximum
        Added value: +30
      • addedInput schema / properties / destination
        Added value: +{
        +  "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": "string"
        +}
      • addedInput schema / properties / flat
        Added value: +{
        +  "description": "Optional: which Flat of the country, as get_flats numbers them. Omit = the cheapest Flat that allows the speed.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"ISO language of the conversation, e.g. en, de, ja. Titles, labels and country names come back in it when available. Bare \"en\" is quoted in en-us / USD."New value: +"ISO language of the conversation, e.g. en, de, ja. Localizes country names and sets the language/currency of links and prices."
      • addedInput schema / properties / mbps
        Added value: +{
        +  "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.",
        +  "enum": [
        +    5,
        +    10,
        +    25,
        +    50
        +  ],
        +  "type": "integer"
        +}
      • addedInput schema / properties / networks
        Added value: +{
        +  "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.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedInput schema / properties / product_id
        Removed value: -{
        -  "description": "Product id of the Flat (any of its durations).",
        -  "type": "integer"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "product_id"
        -]New value: +[
        +  "destination",
        +  "days"
        +]
      • addedOutput schema / properties / all_networks
        Added value: +{
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / app_links
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Store links of the free roamflat app (android, ios) — the Flat works without it.",
        -  "type": "object"
        -}
      • changedOutput schema / properties / buy_url / description
        Previous value: -"The exact product page to send the customer to. Use verbatim."New value: +"The roamflat card preset to exactly this configuration. Use verbatim."
      • addedOutput schema / properties / data
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / days / description
        Added value: +"Days booked, counted from the first connection in the destination country."
      • addedOutput schema / properties / destination
        Added value: +{
        +  "description": "Resolved country name (localized).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / flat
        Added value: +{
        +  "description": "Which Flat of the country (1 = cheapest network only; higher numbers include more networks). Pass it back to quote the same Flat.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / has_5g
        Added value: +{
        +  "description": "A 5G network is included.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / hotspot
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / iso
        Added value: +{
        +  "description": "ISO 3166-1 alpha-2, lower case.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / message
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / name
        Added value: +{
        +  "description": "The Flat's name as the shop shows it: \"Flat · Vodafone + O2\" or \"Flat · all 4 networks\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / networks
        Added value: +{
        +  "description": "Operator names included, as the shop states them.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / per_day
        Removed value: -{
        -  "type": "number"
        -}
      • removedOutput schema / properties / presentation
        Removed value: -{
        -  "type": "string"
        -}
      • changedOutput schema / properties / price / description
        Previous value: -"Same as total."New value: +"FULL price of this configuration in currency — the amount paid. Not per day."
      • addedOutput schema / properties / price_per_day
        Added value: +{
        +  "description": "For comparison only. Never multiply it yourself.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / pricing_bucket
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / product
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / product_id
        Removed value: -{
        -  "description": "The product id of the chosen duration.",
        -  "type": "integer"
        -}
      • addedOutput schema / properties / speed_mbps
        Added value: +{
        +  "description": "The chosen maximum speed. Data is unlimited at this speed.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / starts
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / total
        Removed value: -{
        -  "description": "TOTAL price for the chosen days — the amount paid.",
        -  "type": "number"
        -}
  6. 3 tool updates
    • Changedget_plan_details1 field changed
      • addedOutput schema / properties / speed_note
        Added value: +{
        +  "description": "Present together with the speed: \"up to\" is the maximum — the actual speed depends on the local network, the location and how busy the network is. Never promise a constant 10 Mbps.",
        +  "type": "string"
        +}
    • Changedrecommend_plan1 field changed
      • addedOutput schema / properties / recommendations / items / properties / plan / properties / speed_note
        Added value: +{
        +  "description": "Present together with the speed: \"up to\" is the maximum — the actual speed depends on the local network, the location and how busy the network is. Never promise a constant 10 Mbps.",
        +  "type": "string"
        +}
    • Changedsearch_esim_plans2 fields changed
      • addedOutput schema / properties / per_destination / items / properties / plans / items / properties / speed_note
        Added value: +{
        +  "description": "Present together with the speed: \"up to\" is the maximum — the actual speed depends on the local network, the location and how busy the network is. Never promise a constant 10 Mbps.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / speed_note
        Added value: +{
        +  "description": "Present together with the speed: \"up to\" is the maximum — the actual speed depends on the local network, the location and how busy the network is. Never promise a constant 10 Mbps.",
        +  "type": "string"
        +}
  7. 5 tool updates
    • Changedget_plan_details62 fields changed
      • addedInput schema / properties / bucket
        Added value: +{
        +  "description": "Optional language-region bucket the customer shops in, e.g. \"en-gb\", \"de-de\". Wins over language; prices and links are quoted in it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / currency
        Added value: +{
        +  "description": "Optional ISO 4217 code. Every price in the result is quoted in it.",
        +  "type": "string"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"ISO language of the conversation. Localizes names/labels and sets the landing-page language/currency of the link."New value: +"ISO language of the conversation, e.g. en, de, ja. Titles, labels and country names come back in it when available. Bare \"en\" is quoted in en-us / USD."
      • changedInput schema / properties / product_id / description
        Previous value: -"WooCommerce product id from search_esim_plans."New value: +"Product id from search_esim_plans, recommend_plan or a durations entry."
      • addedOutput schema / description
        Added value: +"One Flat (a family of bookable durations for one country and one set of networks). Every field is present only when the catalogue holds a value for it; an absent field is unknown, never \"no\"."
      • addedOutput schema / properties / activation_trigger
        Added value: +{
        +  "description": "Always first_connection.",
        +  "enum": [
        +    "first_connection"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / all_networks
        Added value: +{
        +  "description": "True when this is the top Flat of the country: every network the shop offers there.",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / carrier
        Removed value: -{
        -  "description": "Local network operator, when specified. NEVER invent one if empty.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / coverage
        Removed value: -{
        -  "description": "Human-readable coverage label (localized).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / coverage_count
        Added value: +{
        +  "description": "Number of countries in coverage_countries.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / coverage_countries / description
        Previous value: -"Localized country names covered (details tool only, multi-country plans)."New value: +"Every country the Flat works in."
      • addedOutput schema / properties / coverage_countries / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / coverage_countries / items / properties
        Added value: +{
        +  "iso": {
        +    "description": "ISO 3166-1 alpha-2, lowercase.",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "Country name in the requested language.",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / properties / coverage_countries / items / type
        Previous value: -"string"New value: +"object"
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "Human-readable coverage label as the shop shows it (localized).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / currency / description
        Added value: +"ISO 4217 currency of every price in this object."
      • addedOutput schema / properties / data
        Added value: +{
        +  "description": "Always \"unlimited\": no data allowance on a Flat.",
        +  "enum": [
        +    "unlimited"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / data_gb
        Removed value: -{
        -  "description": "High-speed data in GB. PER DAY when data_period is per_day (Daily Surf); TOTAL for the whole validity when data_period is total (Trip Surf). 0 = no fixed high-speed cap stated.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / data_period
        Removed value: -{
        -  "description": "per_day or total — how data_gb applies.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / data_reset
        Removed value: -{
        -  "description": "When the daily allowance refreshes (per_day plans only). Empty when unknown.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / days
        Removed value: -{
        -  "description": "Validity in days.",
        -  "type": "integer"
        -}
      • addedOutput schema / properties / days_max
        Added value: +{
        +  "description": "Longest bookable duration in days.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / days_min
        Added value: +{
        +  "description": "Shortest bookable duration in days.",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / description
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / durations
        Added value: +{
        +  "description": "Every bookable duration of this Flat, shortest first. Each is bought on its own product page.",
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "days": {
        +        "description": "Number of days.",
        +        "type": "integer"
        +      },
        +      "per_day": {
        +        "description": "price / days.",
        +        "type": "number"
        +      },
        +      "price": {
        +        "description": "TOTAL price of this duration in currency — the amount paid.",
        +        "type": "number"
        +      },
        +      "product_id": {
        +        "description": "Product id to pass to start_checkout for this duration.",
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / fair_use
        Added value: +{
        +  "description": "The official wording to present as returned: \"Unlimited data up to 10 Mbps. Enough for everything — maps, video, calls, hotspot.\" No daily allowance, no reduced speed.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / family_id / description
        Previous value: -"Plans sharing a family_id are day-length variants of the same package."New value: +"Id shared by every duration of this Flat."
      • removedOutput schema / properties / fup
        Removed value: -{
        -  "description": "All You Can Surf fair-use policy in plain words (daily full-speed allowance and the still-unlimited reduced speed afterwards, or no limit at all). Present it as returned; empty for non-AYCS plans.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / grade
        Removed value: -{
        -  "description": "All You Can Surf tier qualifier (empty for standard). Present only the returned value.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / hotspot
        Added value: +{
        +  "description": "True: hotspot / tethering is included in every Flat.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / last_updated
        Added value: +{
        +  "description": "Date the Flat was last updated in the catalogue (YYYY-MM-DD).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / name / description
        Previous value: -"Plan name, localized to the requested language where a translation exists."New value: +"Short name: \"<Country> Flat · <networks label>\"."
      • removedOutput schema / properties / network
        Removed value: -{
        -  "description": "Network generation, e.g. 5G/4G. NEVER invent one if empty.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / network_generation
        Added value: +{
        +  "description": "Network generation, e.g. \"5G/4G\". Never an operator name.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / networks
        Added value: +{
        +  "description": "The mobile networks the Flat runs on, as the shop states them. The phone picks the strongest included network.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / networks_count
        Added value: +{
        +  "description": "Number of networks included.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / networks_label
        Added value: +{
        +  "description": "The shop's own label for the networks, localized: \"Vodafone + O2 + EE\" or \"all 4 networks\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / networks_total
        Added value: +{
        +  "description": "Number of networks the shop offers in this country. all_networks is true when the Flat includes them all.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plan_note
        Added value: +{
        +  "description": "Customer-facing caveat for this Flat in plain words. Present it as returned whenever present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / price / description
        Previous value: -"FULL fixed price in currency; not per-day or per-GB."New value: +"Price of ONE DAY in currency (price_basis per_day) — the cheapest per-day rate of this Flat. NOT the price of the plan: quote the matching total from durations."
      • addedOutput schema / properties / price_basis
        Added value: +{
        +  "description": "Always \"per_day\".",
        +  "enum": [
        +    "per_day"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / price_is_final
        Added value: +{
        +  "description": "Always true: no tax or fee is added at checkout.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / price_max
        Added value: +{
        +  "description": "Total price of the longest duration (days_max).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / pricing_bucket
        Added value: +{
        +  "description": "language-region bucket the prices and links are quoted in, e.g. \"en-us\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / product_id / description
        Added value: +"Product id of the Flat (its shortest duration). Use it for get_plan_details and start_checkout (with days)."
      • addedOutput schema / properties / rating / description
        Added value: +"Average customer rating (1-5). Present only when reviews exist."
      • addedOutput schema / properties / review_count / description
        Added value: +"Number of reviews. Present only when > 0."
      • addedOutput schema / properties / selected_days
        Added value: +{
        +  "description": "Present when the requested product_id is one specific duration: its day count.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / selected_price
        Added value: +{
        +  "description": "Present with selected_days: the total price of that duration.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / sku
        Added value: +{
        +  "description": "Catalogue SKU of that product.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / speed_cap
        Added value: +{
        +  "description": "The same in words: \"up to 10 Mbps\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / speed_cap_mbps
        Added value: +{
        +  "description": "Constant speed cap in Mbps (10): the Flat runs at up to this speed for the whole validity.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / starts
        Added value: +{
        +  "description": "When the days begin: at the first connection in the destination country — not at purchase, not at installation.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "description": "Short description in the requested language, from the product page.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / throttle_kbps
        Removed value: -{
        -  "description": "Speed in kbps after the high-speed allowance is used (for that day on per_day plans; for the rest of the trip on total plans). 0 = no throttle stated in this plan's specification.",
        -  "type": "integer"
        -}
      • addedOutput schema / properties / title
        Added value: +{
        +  "description": "Product title in the requested language.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / topup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "kind": {
        +      "description": "Always \"none\": a Flat ends when its days are over; the next trip is a new Flat.",
        +      "enum": [
        +        "none"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / type / description
        Previous value: -"Daily Surf, Trip Surf or All You Can Surf. Brand names — keep in English."New value: +"Always \"Flat\" — the brand name of the plan, keep in English."
      • addedOutput schema / properties / type / enum
        Added value: +[
        +  "Flat"
        +]
      • addedOutput schema / properties / url / description
        Added value: +"Product page in pricing_bucket. Use verbatim."
      • addedOutput schema / properties / validity_clock
        Added value: +{
        +  "description": "How the days run: 24-hour periods from the first connection.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / voice_sms
        Added value: +{
        +  "description": "Always \"none\": data only, no telephone number, no SMS.",
        +  "type": "string"
        +}
    • Addedget_shop_facts
    • Addedrecommend_plan
    • Changedsearch_esim_plans80 fields changed
      • addedInput schema / properties / bucket
        Added value: +{
        +  "description": "Optional language-region bucket the customer shops in, e.g. \"en-gb\", \"de-de\". Wins over language; prices and links are quoted in it.",
        +  "type": "string"
        +}
      • changedInput schema / properties / currency / description
        Previous value: -"Optional ISO 4217 override for quoted prices. Normally derived from language."New value: +"Optional ISO 4217 code. Every price in the result is quoted in it."
      • changedInput schema / properties / destination / description
        Previous value: -"Country or region in ANY language, e.g. \"Thailand\", \"Japon\", \"Europa\". City names are mapped to their country by you first."New value: +"Country in any language, e.g. \"Spain\", \"Japon\", \"Türkei\", or a 2-letter ISO code. For a city, pass its country."
      • addedInput schema / properties / destinations
        Added value: +{
        +  "description": "Several countries for one trip. roamflat sells one Flat per country, so the result lists the Flats of each country (grouped under per_destination) unless a single Flat covers them all. Overrides destination.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "maxItems": 5,
        +  "type": "array"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"ISO language of the conversation, e.g. en, de, ja, th. Localizes names/labels and sets the landing-page language and currency."New value: +"ISO language of the conversation, e.g. en, de, ja. Titles, labels and country names come back in it when available. Bare \"en\" is quoted in en-us / USD."
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Flats to return. Default 10; all_plans_url lists everything.",
        +  "maximum": 50,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / min_days
        Added value: +{
        +  "description": "Only Flats that offer a duration of at least this many days.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "price = cheapest per day first (default); networks = most networks first.",
        +  "enum": [
        +    "price",
        +    "networks"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / type
        Removed value: -{
        -  "description": "Plan type filter. daily_surf = fresh allowance each day; trip_surf = one pool for the trip; all_you_can_surf = unlimited-style. Default any.",
        -  "enum": [
        -    "daily_surf",
        -    "trip_surf",
        -    "all_you_can_surf",
        -    "any"
        -  ],
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "destination"
        -]New value: +[]
      • removedOutput schema / properties / destination / description
        Removed value: -"Resolved destination label (localized)."
      • addedOutput schema / properties / destinations
        Added value: +{
        +  "description": "How each requested destination was understood.",
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "iso": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "query": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / from_price / description
        Previous value: -"Lowest full plan price in currency."New value: +"Lowest per-day price in this result set, shop-formatted."
      • changedOutput schema / properties / from_price / type
        Previous value: -"number"New value: +"string"
      • addedOutput schema / properties / iso
        Added value: +{
        +  "description": "Resolved ISO code of the (first) destination.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / message / description
        Added value: +"Present when nothing matched: says why and what to try."
      • addedOutput schema / properties / note
        Added value: +{
        +  "description": "Present when part of the request could not be honoured.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / per_destination
        Added value: +{
        +  "description": "Present for several destinations: the Flats of each country, one group per destination.",
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "all_plans_url": {
        +        "type": "string"
        +      },
        +      "iso": {
        +        "type": "string"
        +      },
        +      "name": {
        +        "type": "string"
        +      },
        +      "plans": {
        +        "items": {
        +          "additionalProperties": true,
        +          "description": "One Flat (a family of bookable durations for one country and one set of networks). Every field is present only when the catalogue holds a value for it; an absent field is unknown, never \"no\".",
        +          "properties": {
        +            "activation_trigger": {
        +              "description": "Always first_connection.",
        +              "enum": [
        +                "first_connection"
        +              ],
        +              "type": "string"
        +            },
        +            "all_networks": {
        +              "description": "True when this is the top Flat of the country: every network the shop offers there.",
        +              "type": "boolean"
        +            },
        +            "coverage_count": {
        +              "description": "Number of countries in coverage_countries.",
        +              "type": "integer"
        +            },
        +            "coverage_countries": {
        +              "description": "Every country the Flat works in.",
        +              "items": {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "iso": {
        +                    "description": "ISO 3166-1 alpha-2, lowercase.",
        +                    "type": "string"
        +                  },
        +                  "name": {
        +                    "description": "Country name in the requested language.",
        +                    "type": "string"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "coverage_label": {
        +              "description": "Human-readable coverage label as the shop shows it (localized).",
        +              "type": "string"
        +            },
        +            "currency": {
        +              "description": "ISO 4217 currency of every price in this object.",
        +              "type": "string"
        +            },
        +            "data": {
        +              "description": "Always \"unlimited\": no data allowance on a Flat.",
        +              "enum": [
        +                "unlimited"
        +              ],
        +              "type": "string"
        +            },
        +            "days_max": {
        +              "description": "Longest bookable duration in days.",
        +              "type": "integer"
        +            },
        +            "days_min": {
        +              "description": "Shortest bookable duration in days.",
        +              "type": "integer"
        +            },
        +            "durations": {
        +              "description": "Every bookable duration of this Flat, shortest first. Each is bought on its own product page.",
        +              "items": {
        +                "additionalProperties": true,
        +                "properties": {
        +                  "days": {
        +                    "description": "Number of days.",
        +                    "type": "integer"
        +                  },
        +                  "per_day": {
        +                    "description": "price / days.",
        +                    "type": "number"
        +                  },
        +                  "price": {
        +                    "description": "TOTAL price of this duration in currency — the amount paid.",
        +                    "type": "number"
        +                  },
        +                  "product_id": {
        +                    "description": "Product id to pass to start_checkout for this duration.",
        +                    "type": "integer"
        +                  }
        +                },
        +                "type": "object"
        +              },
        +              "type": "array"
        +            },
        +            "fair_use": {
        +              "description": "The official wording to present as returned: \"Unlimited data up to 10 Mbps. Enough for everything — maps, video, calls, hotspot.\" No daily allowance, no reduced speed.",
        +              "type": "string"
        +            },
        +            "family_id": {
        +              "description": "Id shared by every duration of this Flat.",
        +              "type": "string"
        +            },
        +            "hotspot": {
        +              "description": "True: hotspot / tethering is included in every Flat.",
        +              "type": "boolean"
        +            },
        +            "last_updated": {
        +              "description": "Date the Flat was last updated in the catalogue (YYYY-MM-DD).",
        +              "type": "string"
        +            },
        +            "name": {
        +              "description": "Short name: \"<Country> Flat · <networks label>\".",
        +              "type": "string"
        +            },
        +            "network_generation": {
        +              "description": "Network generation, e.g. \"5G/4G\". Never an operator name.",
        +              "type": "string"
        +            },
        +            "networks": {
        +              "description": "The mobile networks the Flat runs on, as the shop states them. The phone picks the strongest included network.",
        +              "items": {
        +                "type": "string"
        +              },
        +              "type": "array"
        +            },
        +            "networks_count": {
        +              "description": "Number of networks included.",
        +              "type": "integer"
        +            },
        +            "networks_label": {
        +              "description": "The shop's own label for the networks, localized: \"Vodafone + O2 + EE\" or \"all 4 networks\".",
        +              "type": "string"
        +            },
        +            "networks_total": {
        +              "description": "Number of networks the shop offers in this country. all_networks is true when the Flat includes them all.",
        +              "type": "integer"
        +            },
        +            "plan_note": {
        +              "description": "Customer-facing caveat for this Flat in plain words. Present it as returned whenever present.",
        +              "type": "string"
        +            },
        +            "price": {
        +              "description": "Price of ONE DAY in currency (price_basis per_day) — the cheapest per-day rate of this Flat. NOT the price of the plan: quote the matching total from durations.",
        +              "type": "number"
        +            },
        +            "price_basis": {
        +              "description": "Always \"per_day\".",
        +              "enum": [
        +                "per_day"
        +              ],
        +              "type": "string"
        +            },
        +            "price_is_final": {
        +              "description": "Always true: no tax or fee is added at checkout.",
        +              "type": "boolean"
        +            },
        +            "price_max": {
        +              "description": "Total price of the longest duration (days_max).",
        +              "type": "number"
        +            },
        +            "pricing_bucket": {
        +              "description": "language-region bucket the prices and links are quoted in, e.g. \"en-us\".",
        +              "type": "string"
        +            },
        +            "product_id": {
        +              "description": "Product id of the Flat (its shortest duration). Use it for get_plan_details and start_checkout (with days).",
        +              "type": "integer"
        +            },
        +            "rating": {
        +              "description": "Average customer rating (1-5). Present only when reviews exist.",
        +              "type": "number"
        +            },
        +            "review_count": {
        +              "description": "Number of reviews. Present only when > 0.",
        +              "type": "integer"
        +            },
        +            "selected_days": {
        +              "description": "Present when the requested product_id is one specific duration: its day count.",
        +              "type": "integer"
        +            },
        +            "selected_price": {
        +              "description": "Present with selected_days: the total price of that duration.",
        +              "type": "number"
        +            },
        +            "sku": {
        +              "description": "Catalogue SKU of that product.",
        +              "type": "string"
        +            },
        +            "speed_cap": {
        +              "description": "The same in words: \"up to 10 Mbps\".",
        +              "type": "string"
        +            },
        +            "speed_cap_mbps": {
        +              "description": "Constant speed cap in Mbps (10): the Flat runs at up to this speed for the whole validity.",
        +              "type": "integer"
        +            },
        +            "starts": {
        +              "description": "When the days begin: at the first connection in the destination country — not at purchase, not at installation.",
        +              "type": "string"
        +            },
        +            "summary": {
        +              "description": "Short description in the requested language, from the product page.",
        +              "type": "string"
        +            },
        +            "title": {
        +              "description": "Product title in the requested language.",
        +              "type": "string"
        +            },
        +            "topup": {
        +              "additionalProperties": true,
        +              "properties": {
        +                "kind": {
        +                  "description": "Always \"none\": a Flat ends when its days are over; the next trip is a new Flat.",
        +                  "enum": [
        +                    "none"
        +                  ],
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": {
        +              "description": "Always \"Flat\" — the brand name of the plan, keep in English.",
        +              "enum": [
        +                "Flat"
        +              ],
        +              "type": "string"
        +            },
        +            "url": {
        +              "description": "Product page in pricing_bucket. Use verbatim.",
        +              "type": "string"
        +            },
        +            "validity_clock": {
        +              "description": "How the days run: 24-hour periods from the first connection.",
        +              "type": "string"
        +            },
        +            "voice_sms": {
        +              "description": "Always \"none\": data only, no telephone number, no SMS.",
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / plans / items / description
        Added value: +"One Flat (a family of bookable durations for one country and one set of networks). Every field is present only when the catalogue holds a value for it; an absent field is unknown, never \"no\"."
      • addedOutput schema / properties / plans / items / properties / activation_trigger
        Added value: +{
        +  "description": "Always first_connection.",
        +  "enum": [
        +    "first_connection"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / all_networks
        Added value: +{
        +  "description": "True when this is the top Flat of the country: every network the shop offers there.",
        +  "type": "boolean"
        +}
      • removedOutput schema / properties / plans / items / properties / carrier
        Removed value: -{
        -  "description": "Local network operator, when specified. NEVER invent one if empty.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / plans / items / properties / coverage
        Removed value: -{
        -  "description": "Human-readable coverage label (localized).",
        -  "type": "string"
        -}
      • addedOutput schema / properties / plans / items / properties / coverage_count
        Added value: +{
        +  "description": "Number of countries in coverage_countries.",
        +  "type": "integer"
        +}
      • changedOutput schema / properties / plans / items / properties / coverage_countries / description
        Previous value: -"Localized country names covered (details tool only, multi-country plans)."New value: +"Every country the Flat works in."
      • addedOutput schema / properties / plans / items / properties / coverage_countries / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / plans / items / properties / coverage_countries / items / properties
        Added value: +{
        +  "iso": {
        +    "description": "ISO 3166-1 alpha-2, lowercase.",
        +    "type": "string"
        +  },
        +  "name": {
        +    "description": "Country name in the requested language.",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / properties / plans / items / properties / coverage_countries / items / type
        Previous value: -"string"New value: +"object"
      • addedOutput schema / properties / plans / items / properties / coverage_label
        Added value: +{
        +  "description": "Human-readable coverage label as the shop shows it (localized).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / currency / description
        Added value: +"ISO 4217 currency of every price in this object."
      • addedOutput schema / properties / plans / items / properties / data
        Added value: +{
        +  "description": "Always \"unlimited\": no data allowance on a Flat.",
        +  "enum": [
        +    "unlimited"
        +  ],
        +  "type": "string"
        +}
      • removedOutput schema / properties / plans / items / properties / data_gb
        Removed value: -{
        -  "description": "High-speed data in GB. PER DAY when data_period is per_day (Daily Surf); TOTAL for the whole validity when data_period is total (Trip Surf). 0 = no fixed high-speed cap stated.",
        -  "type": "number"
        -}
      • removedOutput schema / properties / plans / items / properties / data_period
        Removed value: -{
        -  "description": "per_day or total — how data_gb applies.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / plans / items / properties / data_reset
        Removed value: -{
        -  "description": "When the daily allowance refreshes (per_day plans only). Empty when unknown.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / plans / items / properties / days
        Removed value: -{
        -  "description": "Validity in days.",
        -  "type": "integer"
        -}
      • addedOutput schema / properties / plans / items / properties / days_max
        Added value: +{
        +  "description": "Longest bookable duration in days.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plans / items / properties / days_min
        Added value: +{
        +  "description": "Shortest bookable duration in days.",
        +  "type": "integer"
        +}
      • removedOutput schema / properties / plans / items / properties / description
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / plans / items / properties / durations
        Added value: +{
        +  "description": "Every bookable duration of this Flat, shortest first. Each is bought on its own product page.",
        +  "items": {
        +    "additionalProperties": true,
        +    "properties": {
        +      "days": {
        +        "description": "Number of days.",
        +        "type": "integer"
        +      },
        +      "per_day": {
        +        "description": "price / days.",
        +        "type": "number"
        +      },
        +      "price": {
        +        "description": "TOTAL price of this duration in currency — the amount paid.",
        +        "type": "number"
        +      },
        +      "product_id": {
        +        "description": "Product id to pass to start_checkout for this duration.",
        +        "type": "integer"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / plans / items / properties / fair_use
        Added value: +{
        +  "description": "The official wording to present as returned: \"Unlimited data up to 10 Mbps. Enough for everything — maps, video, calls, hotspot.\" No daily allowance, no reduced speed.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / plans / items / properties / family_id / description
        Previous value: -"Plans sharing a family_id are day-length variants of the same package."New value: +"Id shared by every duration of this Flat."
      • removedOutput schema / properties / plans / items / properties / fup
        Removed value: -{
        -  "description": "All You Can Surf fair-use policy in plain words (daily full-speed allowance and the still-unlimited reduced speed afterwards, or no limit at all). Present it as returned; empty for non-AYCS plans.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / plans / items / properties / grade
        Removed value: -{
        -  "description": "All You Can Surf tier qualifier (empty for standard). Present only the returned value.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / plans / items / properties / hotspot
        Added value: +{
        +  "description": "True: hotspot / tethering is included in every Flat.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / plans / items / properties / last_updated
        Added value: +{
        +  "description": "Date the Flat was last updated in the catalogue (YYYY-MM-DD).",
        +  "type": "string"
        +}
      • changedOutput schema / properties / plans / items / properties / name / description
        Previous value: -"Plan name, localized to the requested language where a translation exists."New value: +"Short name: \"<Country> Flat · <networks label>\"."
      • removedOutput schema / properties / plans / items / properties / network
        Removed value: -{
        -  "description": "Network generation, e.g. 5G/4G. NEVER invent one if empty.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / plans / items / properties / network_generation
        Added value: +{
        +  "description": "Network generation, e.g. \"5G/4G\". Never an operator name.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / networks
        Added value: +{
        +  "description": "The mobile networks the Flat runs on, as the shop states them. The phone picks the strongest included network.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / plans / items / properties / networks_count
        Added value: +{
        +  "description": "Number of networks included.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plans / items / properties / networks_label
        Added value: +{
        +  "description": "The shop's own label for the networks, localized: \"Vodafone + O2 + EE\" or \"all 4 networks\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / networks_total
        Added value: +{
        +  "description": "Number of networks the shop offers in this country. all_networks is true when the Flat includes them all.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plans / items / properties / plan_note
        Added value: +{
        +  "description": "Customer-facing caveat for this Flat in plain words. Present it as returned whenever present.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / plans / items / properties / price / description
        Previous value: -"FULL fixed price in currency; not per-day or per-GB."New value: +"Price of ONE DAY in currency (price_basis per_day) — the cheapest per-day rate of this Flat. NOT the price of the plan: quote the matching total from durations."
      • addedOutput schema / properties / plans / items / properties / price_basis
        Added value: +{
        +  "description": "Always \"per_day\".",
        +  "enum": [
        +    "per_day"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / price_is_final
        Added value: +{
        +  "description": "Always true: no tax or fee is added at checkout.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / plans / items / properties / price_max
        Added value: +{
        +  "description": "Total price of the longest duration (days_max).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / plans / items / properties / pricing_bucket
        Added value: +{
        +  "description": "language-region bucket the prices and links are quoted in, e.g. \"en-us\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / product_id / description
        Added value: +"Product id of the Flat (its shortest duration). Use it for get_plan_details and start_checkout (with days)."
      • addedOutput schema / properties / plans / items / properties / rating / description
        Added value: +"Average customer rating (1-5). Present only when reviews exist."
      • addedOutput schema / properties / plans / items / properties / review_count / description
        Added value: +"Number of reviews. Present only when > 0."
      • addedOutput schema / properties / plans / items / properties / selected_days
        Added value: +{
        +  "description": "Present when the requested product_id is one specific duration: its day count.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plans / items / properties / selected_price
        Added value: +{
        +  "description": "Present with selected_days: the total price of that duration.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / plans / items / properties / sku
        Added value: +{
        +  "description": "Catalogue SKU of that product.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / speed_cap
        Added value: +{
        +  "description": "The same in words: \"up to 10 Mbps\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / speed_cap_mbps
        Added value: +{
        +  "description": "Constant speed cap in Mbps (10): the Flat runs at up to this speed for the whole validity.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / plans / items / properties / starts
        Added value: +{
        +  "description": "When the days begin: at the first connection in the destination country — not at purchase, not at installation.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / summary
        Added value: +{
        +  "description": "Short description in the requested language, from the product page.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / plans / items / properties / throttle_kbps
        Removed value: -{
        -  "description": "Speed in kbps after the high-speed allowance is used (for that day on per_day plans; for the rest of the trip on total plans). 0 = no throttle stated in this plan's specification.",
        -  "type": "integer"
        -}
      • addedOutput schema / properties / plans / items / properties / title
        Added value: +{
        +  "description": "Product title in the requested language.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / topup
        Added value: +{
        +  "additionalProperties": true,
        +  "properties": {
        +    "kind": {
        +      "description": "Always \"none\": a Flat ends when its days are over; the next trip is a new Flat.",
        +      "enum": [
        +        "none"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / plans / items / properties / type / description
        Previous value: -"Daily Surf, Trip Surf or All You Can Surf. Brand names — keep in English."New value: +"Always \"Flat\" — the brand name of the plan, keep in English."
      • addedOutput schema / properties / plans / items / properties / type / enum
        Added value: +[
        +  "Flat"
        +]
      • addedOutput schema / properties / plans / items / properties / url / description
        Added value: +"Product page in pricing_bucket. Use verbatim."
      • addedOutput schema / properties / plans / items / properties / validity_clock
        Added value: +{
        +  "description": "How the days run: 24-hour periods from the first connection.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / plans / items / properties / voice_sms
        Added value: +{
        +  "description": "Always \"none\": data only, no telephone number, no SMS.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / pricing_bucket
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / returned
        Added value: +{
        +  "type": "integer"
        +}
      • removedOutput schema / properties / slug
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / total_available
        Added value: +{
        +  "description": "Flats matched before limit; the rest are on all_plans_url.",
        +  "type": "integer"
        +}
    • Changedstart_checkout16 fields changed
      • addedInput schema / properties / bucket
        Added value: +{
        +  "description": "Optional language-region bucket the customer shops in, e.g. \"en-gb\", \"de-de\". Wins over language; prices and links are quoted in it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / currency
        Added value: +{
        +  "description": "Optional ISO 4217 code. Every price in the result is quoted in it.",
        +  "type": "string"
        +}
      • addedInput schema / properties / days
        Added value: +{
        +  "description": "Number of days to buy. Must be one of the Flat's durations; omit to buy the duration product_id stands for. When the exact count is not offered, the next longer duration is chosen and reported in days.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / language / description
        Previous value: -"ISO language of the conversation. Sets the language/currency of the payment page."New value: +"ISO language of the conversation, e.g. en, de, ja. Titles, labels and country names come back in it when available. Bare \"en\" is quoted in en-us / USD."
      • changedInput schema / properties / product_id / description
        Previous value: -"WooCommerce product id to buy."New value: +"Product id of the Flat (any of its durations)."
      • addedOutput schema / properties / app_links / additionalProperties
        Added value: +true
      • changedOutput schema / properties / app_links / description
        Previous value: -"Optional links to the free roamflat app (android/ios) for tracking data usage after setup. Mention only when present."New value: +"Store links of the free roamflat app (android, ios) — the Flat works without it."
      • addedOutput schema / properties / days
        Added value: +{
        +  "type": "integer"
        +}
      • addedOutput schema / properties / per_day
        Added value: +{
        +  "type": "number"
        +}
      • addedOutput schema / properties / presentation
        Added value: +{
        +  "type": "string"
        +}
      • changedOutput schema / properties / price / description
        Previous value: -"Full fixed price in currency; not per-day."New value: +"Same as total."
      • addedOutput schema / properties / price_basis
        Added value: +{
        +  "enum": [
        +    "total"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / price_is_final
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / pricing_bucket
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / product_id
        Added value: +{
        +  "description": "The product id of the chosen duration.",
        +  "type": "integer"
        +}
      • addedOutput schema / properties / total
        Added value: +{
        +  "description": "TOTAL price for the chosen days — the amount paid.",
        +  "type": "number"
        +}
  8. 3 tool updates
    • First observedget_plan_details
    • First observedsearch_esim_plans
    • First observedstart_checkout

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to search and compare travel eSIM data plans by destination, trip length, data amount, unlimited/daily type, local phone number, local or roaming network, multi-country coverage, budget, hotspot and 5G, returning plan details plus a link to buy. Read-only with no sign-in or API key required.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables assistants to look up verified daily cheapest travel eSIM and physical SIM sellers and prices for 54 destination countries and 1–30 day trips, compare countries by cost, check recent price trends, and inspect seller price-change and sell-out histories. It is a free, no-auth, read-only remote MCP server whose results include a source citation and as-of date.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources