Skip to main content
Glama

List eSIM plans

list-plans
Read-onlyIdempotent

Show the eSIM plans on sale for one destination, or search the whole catalog, narrowing by data allowance, validity and price. Use it when the destination is already known and the traveller wants to compare what is available, or to find a plan inside a budget. Prices are live retail prices in the currency you ask for. For a trip covering two or more countries, use plan-trip first: it compares one plan for the whole route against one plan per country and picks the cheapest complete answer. Pass a plan id from here to get-plan, get-plan-coverage or create-checkout-session. Read-only, and it answers from the SimFuse catalog alone.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoOptional. Maximum plans to return, 1 to 100. Defaults to 25.
currencyNoOptional. ISO 4217 three-letter code prices are quoted and filtered in, e.g. "USD", "EUR", "GBP". Defaults to EUR. An unknown code falls back to EUR rather than failing.
destinationNoOptional. ISO 3166-1 alpha-2 destination country code, e.g. "US", "GB", "DE". Look it up with list-destinations rather than guessing. Omit to search the whole catalog, including regional and worldwide plans.
max_price_centsNoOptional. Only plans at or below this retail price, in minor units (cents) of `currency`: 2500 is 25.00.
min_price_centsNoOptional. Only plans at or above this retail price, in minor units (cents) of `currency`: 500 is 5.00.
max_validity_daysNoOptional. Only plans valid for at most this many days.
min_validity_daysNoOptional. Only plans valid for at least this many days, e.g. 14 for a two-week trip.
max_data_amount_mbNoOptional. Only plans with at most this much data, in megabytes.
min_data_amount_mbNoOptional. Only plans with at least this much data, in MEGABYTES: 1 GB is 1024, 10 GB is 10240.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
plansYesThe matching plans. Empty when nothing matched.
matchedYesHow many plans matched the filters, before `limit` was applied.
currencyYesISO 4217 code every price below is quoted in, e.g. "EUR".
returnedYesHow many plans are in this response.
truncated_by_candidate_capYesTrue when a catalog-wide search hit its internal candidate cap, so there are further matches this call could not see. Narrow it with a destination or a tighter data or validity filter rather than assuming you have seen everything.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed20 schema fields changed
    • changedInput schema / properties / currency / description
      Previous value: -"Three-letter currency code for prices (e.g. \"USD\", \"EUR\"). Defaults to EUR."New value: +"Optional. ISO 4217 three-letter code prices are quoted and filtered in, e.g. \"USD\", \"EUR\", \"GBP\". Defaults to EUR. An unknown code falls back to EUR rather than failing."
    • addedInput schema / properties / currency / maxLength
      Added value: +3
    • addedInput schema / properties / currency / minLength
      Added value: +3
    • changedInput schema / properties / destination / description
      Previous value: -"Optional. Two-letter destination country code (e.g. \"US\", \"GB\", \"DE\"). Omit to search the whole catalog, including regional and worldwide plans."New value: +"Optional. ISO 3166-1 alpha-2 destination country code, e.g. \"US\", \"GB\", \"DE\". Look it up with list-destinations rather than guessing. Omit to search the whole catalog, including regional and worldwide plans."
    • addedInput schema / properties / destination / maxLength
      Added value: +2
    • addedInput schema / properties / destination / minLength
      Added value: +2
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum plans to return, 1-100. Defaults to 25."New value: +"Optional. Maximum plans to return, 1 to 100. Defaults to 25."
    • addedInput schema / properties / limit / maximum
      Added value: +100
    • addedInput schema / properties / limit / minimum
      Added value: +1
    • addedInput schema / properties / max_data_amount_mb / minimum
      Added value: +0
    • changedInput schema / properties / max_price_cents / description
      Previous value: -"Optional. Only plans at or below this retail price, in minor units of the requested currency."New value: +"Optional. Only plans at or below this retail price, in minor units (cents) of `currency`: 2500 is 25.00."
    • addedInput schema / properties / max_price_cents / minimum
      Added value: +0
    • addedInput schema / properties / max_validity_days / minimum
      Added value: +0
    • changedInput schema / properties / min_data_amount_mb / description
      Previous value: -"Optional. Only plans with at least this much data, in megabytes (1 GB = 1024 MB)."New value: +"Optional. Only plans with at least this much data, in MEGABYTES: 1 GB is 1024, 10 GB is 10240."
    • addedInput schema / properties / min_data_amount_mb / minimum
      Added value: +0
    • changedInput schema / properties / min_price_cents / description
      Previous value: -"Optional. Only plans at or above this retail price, in minor units of the requested currency (e.g. 500 = 5.00)."New value: +"Optional. Only plans at or above this retail price, in minor units (cents) of `currency`: 500 is 5.00."
    • addedInput schema / properties / min_price_cents / minimum
      Added value: +0
    • changedInput schema / properties / min_validity_days / description
      Previous value: -"Optional. Only plans valid for at least this many days."New value: +"Optional. Only plans valid for at least this many days, e.g. 14 for a two-week trip."
    • addedInput schema / properties / min_validity_days / minimum
      Added value: +0
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "currency": {
      +      "description": "ISO 4217 code every price below is quoted in, e.g. \"EUR\".",
      +      "type": "string"
      +    },
      +    "matched": {
      +      "description": "How many plans matched the filters, before `limit` was applied.",
      +      "type": "integer"
      +    },
      +    "plans": {
      +      "description": "The matching plans. Empty when nothing matched.",
      +      "items": {
      +        "properties": {
      +          "carrier": {
      +            "description": "The mobile network this plan runs on, when we can name it. Null when we cannot.",
      +            "properties": {
      +              "logo_url": {
      +                "description": "Carrier logo image URL.",
      +                "type": "string"
      +              },
      +              "name": {
      +                "description": "Carrier name, e.g. \"KPN\".",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "logo_url"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "country": {
      +            "description": "The one country this plan is filed under. Null for a regional or worldwide plan.",
      +            "properties": {
      +              "currency": {
      +                "description": "ISO 4217 code the from_price_cents beside it is expressed in, which is the currency you asked for, e.g. \"EUR\". Null exactly when from_price_cents is null, which is what a country nested on a plan answers: nothing priced it there.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "from_price_cents": {
      +                "description": "Cheapest plan for this destination, in minor units (cents) of the response currency, so 1250 is 12.50. Null when this response did not price the destination.",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "iso2": {
      +                "description": "ISO 3166-1 alpha-2 code, e.g. \"ES\". This is the code list-plans and plan-trip take.",
      +                "type": "string"
      +              },
      +              "iso3": {
      +                "description": "ISO 3166-1 alpha-3 code, e.g. \"ESP\".",
      +                "type": "string"
      +              },
      +              "links": {
      +                "properties": {
      +                  "country": {
      +                    "properties": {
      +                      "path": {
      +                        "description": "Path on the storefront, e.g. \"/esim/es\".",
      +                        "type": "string"
      +                      },
      +                      "query": {
      +                        "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +                        "type": "object"
      +                      },
      +                      "url": {
      +                        "description": "The full storefront URL for this country's storefront page. Safe to show to a person.",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "path",
      +                      "query",
      +                      "url"
      +                    ],
      +                    "type": "object"
      +                  }
      +                },
      +                "required": [
      +                  "country"
      +                ],
      +                "type": "object"
      +              },
      +              "name": {
      +                "description": "English country name, e.g. \"Spain\".",
      +                "type": "string"
      +              },
      +              "region": {
      +                "description": "The region this country is filed under, e.g. \"Europe\". Null when it is filed under none.",
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "name",
      +              "iso2",
      +              "iso3",
      +              "region",
      +              "from_price_cents",
      +              "currency",
      +              "links"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "coverage_count": {
      +            "description": "How many countries coverage_countries holds.",
      +            "type": "integer"
      +          },
      +          "coverage_countries": {
      +            "description": "Every country the plan works in.",
      +            "items": {
      +              "properties": {
      +                "iso2": {
      +                  "description": "ISO 3166-1 alpha-2 code, or null for a country we could not match to a code.",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "name": {
      +                  "description": "English country name.",
      +                  "type": "string"
      +                },
      +                "operators": {
      +                  "description": "Networks in that country, when the country could be attributed. Empty means not attributed, never \"no coverage\".",
      +                  "items": {
      +                    "type": "string"
      +                  },
      +                  "type": "array"
      +                }
      +              },
      +              "required": [
      +                "name",
      +                "iso2",
      +                "operators"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "coverage_type": {
      +            "description": "Scope of the plan: one country, a region, or worldwide.",
      +            "enum": [
      +              "country",
      +              "region",
      +              "global"
      +            ],
      +            "type": "string"
      +          },
      +          "currency": {
      +            "description": "ISO 4217 code retail_price_cents is quoted in, e.g. \"EUR\".",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "data_amount_mb": {
      +            "description": "Data allowance in megabytes (1 GB is 1024 MB). 0 on an unlimited plan, where data_usage_policy carries the real terms.",
      +            "type": "integer"
      +          },
      +          "data_restriction_type": {
      +            "description": "Whether the allowance is capped (\"limited\") or unmetered (\"unlimited\").",
      +            "enum": [
      +              "limited",
      +              "unlimited"
      +            ],
      +            "type": "string"
      +          },
      +          "data_usage_policy": {
      +            "description": "What the plan really gives you. Null when the supplier has never published its terms, which is different from having no limits.",
      +            "properties": {
      +              "high_speed_data_mb": {
      +                "description": "Full-speed allowance in megabytes PER RESET PERIOD, so 1 GB a day for 30 days is 1024, not 30720. 0 means genuinely uncapped.",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "max_speed_kbps": {
      +                "description": "Speed ceiling in kbit/s from the first megabyte. Null means no ceiling.",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "reduced_speed_kbps": {
      +                "description": "Speed in kbit/s after the full-speed allowance is used. Null means the data STOPS rather than slowing down.",
      +                "type": [
      +                  "integer",
      +                  "null"
      +                ]
      +              },
      +              "reset_period": {
      +                "description": "How often the full-speed allowance resets. Null means it covers the whole plan.",
      +                "enum": [
      +                  "daily",
      +                  "weekly",
      +                  "monthly",
      +                  null
      +                ],
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "high_speed_data_mb",
      +              "reset_period",
      +              "max_speed_kbps",
      +              "reduced_speed_kbps"
      +            ],
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "excluded_count": {
      +            "description": "How many countries excluded_countries holds.",
      +            "type": "integer"
      +          },
      +          "excluded_countries": {
      +            "description": "Countries in this plan's own region that it does NOT cover. Always empty for a country plan and for a worldwide one.",
      +            "items": {
      +              "properties": {
      +                "iso2": {
      +                  "description": "ISO 3166-1 alpha-2 code.",
      +                  "type": [
      +                    "string",
      +                    "null"
      +                  ]
      +                },
      +                "name": {
      +                  "description": "English country name.",
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "name",
      +                "iso2"
      +              ],
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "id": {
      +            "description": "The plan id (a 26-character ULID). Pass it to get-plan, get-plan-coverage or create-checkout-session. Never invent one.",
      +            "type": "string"
      +          },
      +          "is_worldwide": {
      +            "description": "True when the plan is sold as a worldwide bundle.",
      +            "type": "boolean"
      +          },
      +          "links": {
      +            "description": "Where a person buys this plan on simfuse.app.",
      +            "properties": {
      +              "country": {
      +                "description": "The country page on its own, or null when the plan has no single country.",
      +                "properties": {
      +                  "path": {
      +                    "description": "Path on the storefront, e.g. \"/esim/es\".",
      +                    "type": "string"
      +                  },
      +                  "query": {
      +                    "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +                    "type": "object"
      +                  },
      +                  "url": {
      +                    "description": "The full storefront URL for the plan's country page. Safe to show to a person.",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "path",
      +                  "query",
      +                  "url"
      +                ],
      +                "type": [
      +                  "object",
      +                  "null"
      +                ]
      +              },
      +              "plan": {
      +                "properties": {
      +                  "path": {
      +                    "description": "Path on the storefront, e.g. \"/esim/es\".",
      +                    "type": "string"
      +                  },
      +                  "query": {
      +                    "description": "Query parameters that belong on the path, as an object. Empty when there are none.",
      +                    "type": "object"
      +                  },
      +                  "url": {
      +                    "description": "The full storefront URL for the page this plan is bought on, with the plan preselected. Safe to show to a person.",
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "path",
      +                  "query",
      +                  "url"
      +                ],
      +                "type": "object"
      +              }
      +            },
      +            "required": [
      +              "plan",
      +              "country"
      +            ],
      +            "type": "object"
      +          },
      +          "name": {
      +            "description": "Plan name as a traveller sees it, e.g. \"Spain 5GB\".",
      +            "type": "string"
      +          },
      +          "network": {
      +            "description": "The network name as plain text, or null when unknown.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "network_type": {
      +            "description": "Fastest network generation the plan is sold as.",
      +            "enum": [
      +              "5G",
      +              "LTE"
      +            ],
      +            "type": "string"
      +          },
      +          "operators": {
      +            "description": "Network operators the plan roams on, as a list. Empty when none are published.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "region": {
      +            "description": "Raw region value for a regional plan, e.g. \"Europe\". Null for a country plan.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "region_label": {
      +            "description": "The region formatted for a person to read. Null for a country plan.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "retail_price_cents": {
      +            "description": "Retail price in minor units (cents) of `currency`, so 1250 in EUR is 12.50 EUR. This is what a buyer pays for one eSIM.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "retail_prices_cents": {
      +            "description": "Prices in other currencies, keyed by ISO 4217 code, in minor units. Only the multi-currency surfaces (the catalog export) carry one, so it is absent here: read retail_price_cents and currency instead.",
      +            "type": "object"
      +          },
      +          "supports_tethering": {
      +            "description": "Whether hotspot or tethering is allowed. Null means no supplier has declared it, which is not the same as \"no\".",
      +            "type": [
      +              "boolean",
      +              "null"
      +            ]
      +          },
      +          "supports_topup": {
      +            "description": "Whether more data can be bought for the same eSIM once it runs low.",
      +            "type": "boolean"
      +          },
      +          "type": {
      +            "description": "What the plan sells: data only, or data plus a bundled voice and SMS allowance.",
      +            "enum": [
      +              "data",
      +              "data_voice_sms"
      +            ],
      +            "type": "string"
      +          },
      +          "validity_days": {
      +            "description": "How many days the plan stays valid once it activates.",
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "id",
      +          "name",
      +          "carrier",
      +          "network",
      +          "operators",
      +          "data_amount_mb",
      +          "data_usage_policy",
      +          "validity_days",
      +          "type",
      +          "data_restriction_type",
      +          "coverage_type",
      +          "region",
      +          "region_label",
      +          "is_worldwide",
      +          "coverage_countries",
      +          "coverage_count",
      +          "excluded_countries",
      +          "excluded_count",
      +          "retail_price_cents",
      +          "currency",
      +          "supports_topup",
      +          "supports_tethering",
      +          "network_type",
      +          "country",
      +          "links"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "returned": {
      +      "description": "How many plans are in this response.",
      +      "type": "integer"
      +    },
      +    "truncated_by_candidate_cap": {
      +      "description": "True when a catalog-wide search hit its internal candidate cap, so there are further matches this call could not see. Narrow it with a destination or a tighter data or validity filter rather than assuming you have seen everything.",
      +      "type": "boolean"
      +    }
      +  },
      +  "required": [
      +    "matched",
      +    "returned",
      +    "currency",
      +    "truncated_by_candidate_cap",
      +    "plans"
      +  ],
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description still adds real context beyond them: prices are live retail figures in the requested currency, and results come from the SimFuse catalog alone rather than live supplier inventory. It does not mention pagination behaviour or rate limits, which keeps it 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?

Five sentences, all load-bearing, with the core capability and the destination-vs-catalog scope front-loaded before the routing advice. It is slightly dense for a listing tool, but nothing is redundant with the schema or annotations, and the ordering is logical: what it does, when to use, how to use it, what to do next.

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?

An output schema exists, so return shape need not be explained, and all nine parameters are fully described in the schema. Combined with annotations covering safety and the description covering scope, alternatives and downstream chaining, an agent has everything needed to call this correctly or route elsewhere.

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 all nine parameters (including cents-based price bounds, validity days, data MB and currency) are self-documenting and the baseline is 3. The description adds a genuinely useful framing the schema does not: filtering happens against live retail prices in the currency you request, and the filter axes are enumerated as data allowance, validity and price.

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 ('Show the eSIM plans on sale') plus an explicit scope split: one destination versus the whole catalog. It distinguishes itself from siblings by naming plan-trip for multi-country trips and get-plan/get-plan-coverage/create-checkout-session as downstream consumers of the returned plan ids.

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 concrete when-to-use conditions (destination already known, traveller comparing, or budget hunting) and an explicit when-not/alternative: two or more countries should go through plan-trip first, with the reason (it compares one plan for the route against one per country). That is routing-level guidance, not inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources