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. Changed4 schema fields changed
    • addedOutput schema / properties / plans / items / properties / hotspot_usage_policy
      Added value: +{
      +  "description": "What the plan lets you do with a hotspot. Null when the terms were never established, which is different from being allowed.",
      +  "properties": {
      +    "allowed": {
      +      "description": "Whether the plan may be shared as a hotspot at all.",
      +      "type": "boolean"
      +    },
      +    "high_speed_data_mb": {
      +      "description": "A separate tethering allowance in megabytes per reset period. Null means tethering draws on the plan data with no allowance of its own.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "max_speed_kbps": {
      +      "description": "Speed ceiling in kbit/s while tethering. Null means no ceiling.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "max_total_mb": {
      +      "description": "A hard cap on tethered data across the whole plan, in megabytes. Null means no such cap.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "reduced_speed_kbps": {
      +      "description": "Speed in kbit/s once the tethering allowance is used. Null means tethering stops.",
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "reset_period": {
      +      "description": "How often the tethering allowance resets. Null when it covers the whole plan.",
      +      "enum": [
      +        "daily",
      +        "weekly",
      +        "monthly",
      +        null
      +      ],
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "allowed",
      +    "high_speed_data_mb",
      +    "reset_period",
      +    "max_speed_kbps",
      +    "reduced_speed_kbps",
      +    "max_total_mb"
      +  ],
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / plans / items / properties / network_generation
      Added value: +{
      +  "description": "The network generation the plan is sold as, exactly as stated for it. Null means not stated, which is not the same as any generation; say \"not stated\" rather than assuming.",
      +  "enum": [
      +    "3G",
      +    "4G",
      +    "5G",
      +    null
      +  ],
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / plans / items / properties / network_type / description
      Previous value: -"Fastest network generation the plan is sold as."New value: +"Deprecated two-valued form: \"5G\" for a 5G plan, \"LTE\" for everything else including plans whose generation was never stated. Read network_generation."
    • changedOutput schema / properties / plans / items / required
      Previous value: -[
      -  "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"
      -]New value: +[
      +  "id",
      +  "name",
      +  "carrier",
      +  "network",
      +  "operators",
      +  "data_amount_mb",
      +  "data_usage_policy",
      +  "hotspot_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",
      +  "network_generation",
      +  "country",
      +  "links"
      +]
  2. 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"
      +}
  3. First observed

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond annotations: it states that prices are live retail prices in the requested currency, that it answers from the SimFuse catalog alone, and that unknown currency codes fall back to EUR. This is meaningful added transparency.

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?

The description is three sentences with zero waste. It front-loads the core function, then gives usage guidance, then routes to siblings. Every sentence earns its place.

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 read-only list/search tool with 100% schema coverage, an output schema, and strong annotations, the description is complete. It covers what the tool does, when to use it, what data it draws from, and how to chain it with siblings. Nothing an agent needs to call it correctly 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 the schema already documents all 9 parameters thoroughly. The description adds a little context (e.g., 'prices are live retail prices in the currency you ask for' and 'narrowing by data allowance, validity and price'), but it doesn't add significant meaning beyond the schema. Baseline 3 is appropriate.

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?

The description states a specific verb ('Show'/'search') and resource ('eSIM plans on sale'), and clearly distinguishes two modes: filtering by destination or searching the whole catalog with filters. It also names sibling tools (plan-trip, get-plan, get-plan-coverage, create-checkout-session) to differentiate its role, so an agent can tell it apart from siblings 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?

The description explicitly says when to use this tool: when the destination is already known and the traveller wants to compare options, or to find a plan within a budget. It also gives an explicit alternative: for multi-country trips, use plan-trip first. This is strong when-to-use guidance with a named alternative.

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