Skip to main content
Glama

Get World Bank Indicator Data

worldbank_get_data
Read-onlyIdempotent

Query World Bank indicator values for one or more countries across a time range — the primary data-access tool; find indicator_id values with worldbank_search_indicators. Observations carry a null value where data is not available for a country×year cell, which is common for sparse series. Set at most one of date_range (a time window), mrv (the latest N periods across the requested countries), or mrnev (each country's own latest N values). Some series, such as Global Economic Monitor's, publish quarterly or monthly values beside annual ones: frequency picks the form mrv and mrnev select from (annual by default), and a date_range's own form (2024, 2024Q1, 2024M01) picks it for a window. lastUpdated gives the serving source's last update date, the data vintage to cite. For "all" countries, page through the results at up to 200 per page, since the API returns several hundred entries per indicator. Indicators the standard data endpoint does not serve — WDI Database Archives, PEFA, ICP, GDLD, International Debt Statistics: DSSI, Food Prices for Nutrition — are answered from their own dataset instead; the response then carries sourceScoped, naming that dataset and the release, classification, sector, or counterpart area applied (see dimension_value), because those values can be archived or superseded figures rather than current ones.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
mrvNoReturn the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values; mrnev returns each country's own latest values instead. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range and mrnev.
pageNoPagination page number (1-based).
mrnevNoReturn each requested country's own N most recent periods (1–100) holding a value — its latest non-null observations, however far back they sit. A country with fewer values in the series returns the ones it has, and a country with none returns no rows. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Mutually exclusive with date_range and mrv.
per_pageNoResults per page (default: server default, max: 1000). One page holds at most 200 observations, which keeps a response within about 50 KB; a larger value is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size, so page + 1 continues where a page ends; notice discloses the reduction whenever the result runs past one page.
countriesYesCountry codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or "all" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas, semicolons, or pipes (US,JP · US;JP · US|JP). At least one code is required — an empty value, or one made only of separators, is rejected rather than treated as "all".
frequencyNoThe period form to return, for series such as Global Economic Monitor's that publish quarterly or monthly values beside annual ones: annual (the default), quarterly, or monthly. With mrv or mrnev it picks the form they select from — frequency "monthly" with mrv 3 returns the three latest months, where mrv 3 alone returns the three latest years. With neither, it returns the whole series at that form. A series that does not publish the form returns an empty result with a notice saying so, except that with neither mrv nor mrnev a source that null-fills the form (Global Economic Monitor) returns null rows, and a page of them carries a notice. Mutually exclusive with date_range, whose own form (2024, 2024Q1, 2024M01) picks the periods of a window.
date_rangeNoTime window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. On a series publishing more than one period form, the window's form picks which: `2024` returns the annual value, `2024Q1:2024Q4` the quarters, `2024M01:2024M12` the months, and a quarter or month window is null-filled where the series has none (a notice then names the other forms). On a series with one form, a window at another form keeps the periods it overlaps (`2019:2021` on a quarterly series returns its twelve quarters). A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv, mrnev, and frequency.
indicator_idYesOne indicator code to query (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL) — not "all" or a list of codes. Use worldbank_search_indicators to find valid IDs.
dimension_valueNoFor indicators answered from their own dataset (the response carries sourceScoped), the id of the value of that dataset's extra dimension to query, matched case-insensitively: a WDI Database Archives release ("202503"), an ICP or Food Prices for Nutrition classification ("PPPGlob", "FPN 5.0"), a GDLD sector ("WHT"), or an International Debt Statistics counterpart area ("265"). Omit it for the default, which sourceScoped.dimension reports: the only value when the dataset has one, "WLD" (World) for counterpart areas, the newest WDI Database Archives release holding data for the requested countries and periods (the newest release when none does), or otherwise every value with each row labelled. A value the dataset does not list is rejected with the valid ids, and a value for an indicator the standard data endpoint serves is rejected too.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataNoIndicator observations for this page. Null values are common for sparse series.
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery hint for an empty result set — how to broaden the query when nothing matched, whether the series publishes the requested frequency, or the page range that exists when the requested page is past the end — a quarter or month date_range whose observations are all null, with the same span at the other period forms, a frequency page whose observations are all null, a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for.
indicatorNoIndicator metadata echoed from the response.
nullCountNoCount of null values on this page — indicates data sparsity for the requested filter.
totalCountNoTotal observations before pagination.
totalPagesNoTotal number of pages.
currentPageNoPage number requested — past totalPages when the request ran off the end.
lastUpdatedNoLast update date of the World Bank source that served these values (YYYY-MM-DD) — the data vintage to cite with them. Omitted when upstream reports none, as for an empty result.
sourceScopedNoPresent only when the standard data endpoint does not serve the indicator and its catalog source served the values instead. Absent for indicators the standard endpoint serves.
appliedFiltersNoThe effective parameters sent to the World Bank API — confirms country code normalization and which filters were in force for these observations.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • changedInput schema / properties / date_range / description
      Previous value: -"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. On a series publishing more than one period form, the window's form picks which: `2024` returns the annual value, `2024Q1:2024Q4` the quarters, `2024M01:2024M12` the months, and a quarter or month window is null-filled where the series has none (a notice then names the other forms). On a series with one form, a window at another form keeps the periods it overlaps (`2019:2021` on a quarterly series returns its twelve quarters). A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv, mrnev, and frequency."
    • addedInput schema / properties / frequency
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": "",
      +      "type": "string"
      +    },
      +    {
      +      "description": "annual (2025), quarterly (2025Q4), or monthly (2025M12) periods.",
      +      "enum": [
      +        "annual",
      +        "quarterly",
      +        "monthly"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "The period form to return, for series such as Global Economic Monitor's that publish quarterly or monthly values beside annual ones: annual (the default), quarterly, or monthly. With mrv or mrnev it picks the form they select from — frequency \"monthly\" with mrv 3 returns the three latest months, where mrv 3 alone returns the three latest years. With neither, it returns the whole series at that form. A series that does not publish the form returns an empty result with a notice saying so, except that with neither mrv nor mrnev a source that null-fills the form (Global Economic Monitor) returns null rows, and a page of them carries a notice. Mutually exclusive with date_range, whose own form (2024, 2024Q1, 2024M01) picks the periods of a window."
      +}
    • addedInput schema / properties / mrnev
      Added value: +{
      +  "description": "Return each requested country's own N most recent periods (1–100) holding a value — its latest non-null observations, however far back they sit. A country with fewer values in the series returns the ones it has, and a country with none returns no rows. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Mutually exclusive with date_range and mrv.",
      +  "maximum": 100,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / mrv / description
      Previous value: -"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."New value: +"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values; mrnev returns each country's own latest values instead. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range and mrnev."
    • addedOutput schema / properties / appliedFilters / properties / frequency
      Added value: +{
      +  "description": "Period form applied (annual, quarterly, monthly), omitted when none was requested.",
      +  "enum": [
      +    "annual",
      +    "quarterly",
      +    "monthly"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / appliedFilters / properties / mrnev
      Added value: +{
      +  "description": "Most-recent-non-empty-values count applied, omitted when none was requested.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: More than one of date_range, mrv, and mrnev is provided, or frequency is provided with date_range. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. `upstream_inconsistent`: The World Bank API answered a data read, and its one re-read, with rows that do not fit the request — its response cache served another query's result — so nothing was served. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_params",
      -  "mixed_all_selector",
      -  "reversed_date_range",
      -  "multiple_indicators",
      -  "indicator_not_found",
      -  "indicator_not_queryable",
      -  "unknown_dimension_value",
      -  "dimension_not_applicable",
      -  "source_scope_too_large",
      -  "country_not_found",
      -  "indicator_and_country_not_found"
      -]New value: +[
      +  "invalid_params",
      +  "mixed_all_selector",
      +  "reversed_date_range",
      +  "multiple_indicators",
      +  "indicator_not_found",
      +  "indicator_not_queryable",
      +  "unknown_dimension_value",
      +  "dimension_not_applicable",
      +  "source_scope_too_large",
      +  "country_not_found",
      +  "indicator_and_country_not_found",
      +  "upstream_inconsistent"
      +]
    • addedOutput schema / properties / lastUpdated
      Added value: +{
      +  "description": "Last update date of the World Bank source that served these values (YYYY-MM-DD) — the data vintage to cite with them. Omitted when upstream reports none, as for an empty result.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, whether the series publishes the requested frequency, or the page range that exists when the requested page is past the end — a quarter or month date_range whose observations are all null, with the same span at the other period forms, a frequency page whose observations are all null, a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
  2. Changed10 schema fields changed
    • changedInput schema / properties / countries / anyOf
      Previous value: -[
      -  {
      -    "description": "A single country code, a comma- or semicolon-separated list, or \"all\".",
      -    "pattern": "[^\\s;,]",
      -    "type": "string"
      -  },
      -  {
      -    "description": "An array of country codes.",
      -    "items": {
      -      "description": "A country code.",
      -      "type": "string"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "description": "A single country code, a list separated by commas, semicolons, or pipes, or \"all\".",
      +    "pattern": "[^\\s;,|]",
      +    "type": "string"
      +  },
      +  {
      +    "description": "An array of country codes; an element holding several codes separated by commas, semicolons, or pipes is split too.",
      +    "items": {
      +      "description": "A country code.",
      +      "type": "string"
      +    },
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / countries / description
      Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas or semicolons. At least one code is required — an empty value is rejected rather than treated as \"all\"."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas, semicolons, or pipes (US,JP · US;JP · US|JP). At least one code is required — an empty value, or one made only of separators, is rejected rather than treated as \"all\"."
    • changedInput schema / properties / per_page / description
      Previous value: -"Results per page (default: server default, max: 1000). Use higher values for \"all\" country queries."New value: +"Results per page (default: server default, max: 1000). One page holds at most 200 observations, which keeps a response within about 50 KB; a larger value is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size, so page + 1 continues where a page ends; notice discloses the reduction whenever the result runs past one page."
    • changedOutput schema / properties / appliedFilters / properties / countries / description
      Previous value: -"Country codes as sent to the API — array elements and comma- or semicolon-separated strings are split and rejoined with semicolons, so this shows the normalized value."New value: +"Country codes as requested, normalized — array elements and strings separated by commas, semicolons, or pipes are split and rejoined with semicolons, the separator the API takes."
    • changedOutput schema / properties / appliedFilters / properties / perPage / description
      Previous value: -"Results per page used, including the server default."New value: +"Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size."
    • addedOutput schema / properties / appliedFilters / properties / requestedPerPage
      Added value: +{
      +  "description": "Page size asked for, present only when it exceeded the page cap and perPage was reduced.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / data / items / properties / countryCode / description
      Previous value: -"ISO2 country code (or aggregate code)."New value: +"ISO2 code of the country or aggregate (US, XD for High income)."
    • changedOutput schema / properties / data / items / properties / countryIso3 / description
      Previous value: -"ISO3 country code (empty for some aggregates)."New value: +"Three-character code of the country or aggregate (USA, HIC) — the form the countries input takes. Empty only for an entity the World Bank country listing does not carry."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
  3. Changed10 schema fields changed
    • addedInput schema / properties / dimension_value
      Added value: +{
      +  "description": "For indicators answered from their own dataset (the response carries sourceScoped), the id of the value of that dataset's extra dimension to query, matched case-insensitively: a WDI Database Archives release (\"202503\"), an ICP or Food Prices for Nutrition classification (\"PPPGlob\", \"FPN 5.0\"), a GDLD sector (\"WHT\"), or an International Debt Statistics counterpart area (\"265\"). Omit it for the default, which sourceScoped.dimension reports: the only value when the dataset has one, \"WLD\" (World) for counterpart areas, the newest WDI Database Archives release holding data for the requested countries and periods (the newest release when none does), or otherwise every value with each row labelled. A value the dataset does not list is rejected with the valid ids, and a value for an indicator the standard data endpoint serves is rejected too.",
      +  "type": "string"
      +}
    • changedInput schema / properties / mrv / description
      Previous value: -"Return the N most recent available values per country (1–100), clamped upstream to the length of the series. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."New value: +"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."
    • addedOutput schema / properties / appliedFilters / properties / dimensionValue
      Added value: +{
      +  "description": "dimension_value as requested, omitted when none was given.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / data / items / description
      Previous value: -"A single country×year observation."New value: +"A single country×period observation."
    • changedOutput schema / properties / data / items / properties / date / description
      Previous value: -"Year of observation (YYYY format)."New value: +"Period of observation: a year (2020), quarter (2020Q1), or month (2020M03)."
    • addedOutput schema / properties / data / items / properties / dimension
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The value of the dataset's extra dimension (sourceScoped.dimension.concept) this row belongs to. Present on source-scoped rows from a dataset that has one.",
      +  "properties": {
      +    "id": {
      +      "description": "Dimension value id, e.g. \"202503\".",
      +      "type": "string"
      +    },
      +    "label": {
      +      "description": "Dimension value label, e.g. \"2025 Mar\".",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "id",
      +    "label"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_params",
      -  "mixed_all_selector",
      -  "reversed_date_range",
      -  "multiple_indicators",
      -  "indicator_not_found",
      -  "indicator_not_queryable",
      -  "country_not_found",
      -  "indicator_and_country_not_found"
      -]New value: +[
      +  "invalid_params",
      +  "mixed_all_selector",
      +  "reversed_date_range",
      +  "multiple_indicators",
      +  "indicator_not_found",
      +  "indicator_not_queryable",
      +  "unknown_dimension_value",
      +  "dimension_not_applicable",
      +  "source_scope_too_large",
      +  "country_not_found",
      +  "indicator_and_country_not_found"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
    • addedOutput schema / properties / sourceScoped
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Present only when the standard data endpoint does not serve the indicator and its catalog source served the values instead. Absent for indicators the standard endpoint serves.",
      +  "properties": {
      +    "dimension": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "concept": {
      +              "description": "The extra dimension: Version, Classification, Sector, or Counterpart-Area.",
      +              "type": "string"
      +            },
      +            "id": {
      +              "description": "Applied value id; null for every_value.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "label": {
      +              "description": "Applied value label; null for every_value.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "selection": {
      +              "description": "How the value was chosen: requested (dimension_value), only_value (the only one the dataset lists), world_total (WLD, all counterpart areas), newest_with_data (newest release holding a value for the requested countries and periods), newest (newest release; none holds a value in that scope), or every_value (no single value; each row carries its own).",
      +              "enum": [
      +                "requested",
      +                "only_value",
      +                "world_total",
      +                "newest_with_data",
      +                "newest",
      +                "every_value"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "concept",
      +            "selection",
      +            "id",
      +            "label"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The dimension value applied; null when the dataset has no extra dimension."
      +    },
      +    "note": {
      +      "description": "States that the values came from the source-scoped data API rather than the standard World Bank data endpoint, and may be archived or superseded figures.",
      +      "type": "string"
      +    },
      +    "sourceId": {
      +      "description": "ID of the World Bank data source that served the values.",
      +      "type": "string"
      +    },
      +    "sourceName": {
      +      "description": "Name of that data source, e.g. \"WDI Database Archives\".",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "sourceId",
      +    "sourceName",
      +    "dimension",
      +    "note"
      +  ],
      +  "type": "object"
      +}
  4. Changed5 schema fields changed
    • changedInput schema / properties / date_range / description
      Previous value: -"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`). A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."
    • changedOutput schema / properties / currentPage / description
      Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_params",
      -  "multiple_indicators",
      -  "indicator_not_found",
      -  "indicator_not_queryable",
      -  "country_not_found",
      -  "indicator_and_country_not_found"
      -]New value: +[
      +  "invalid_params",
      +  "mixed_all_selector",
      +  "reversed_date_range",
      +  "multiple_indicators",
      +  "indicator_not_found",
      +  "indicator_not_queryable",
      +  "country_not_found",
      +  "indicator_and_country_not_found"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Recovery hint for sparse or empty result sets — suggests how to broaden the query."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end."
  5. Changed5 schema fields changed
    • changedInput schema / properties / indicator_id / description
      Previous value: -"Indicator code to query (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL). Use worldbank_search_indicators to find valid IDs."New value: +"One indicator code to query (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL) — not \"all\" or a list of codes. Use worldbank_search_indicators to find valid IDs."
    • removedInput schema / properties / indicator_id / minLength
      Removed value: -1
    • addedInput schema / properties / indicator_id / pattern
      Added value: +"^[A-Za-z0-9._-]+$"
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_params",
      -  "indicator_not_found",
      -  "indicator_not_queryable",
      -  "country_not_found",
      -  "indicator_and_country_not_found"
      -]New value: +[
      +  "invalid_params",
      +  "multiple_indicators",
      +  "indicator_not_found",
      +  "indicator_not_queryable",
      +  "country_not_found",
      +  "indicator_and_country_not_found"
      +]
  6. Changed7 schema fields changed
    • changedInput schema / properties / countries / anyOf
      Previous value: -[
      -  {
      -    "description": "A single country code or \"all\".",
      -    "pattern": "[^\\s;]",
      -    "type": "string"
      -  },
      -  {
      -    "description": "An array of country codes.",
      -    "items": {
      -      "description": "A country code.",
      -      "type": "string"
      -    },
      -    "minItems": 1,
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "description": "A single country code, a comma- or semicolon-separated list, or \"all\".",
      +    "pattern": "[^\\s;,]",
      +    "type": "string"
      +  },
      +  {
      +    "description": "An array of country codes.",
      +    "items": {
      +      "description": "A country code.",
      +      "type": "string"
      +    },
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / countries / description
      Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for every entry (use pagination). Pass a single string or an array of codes for multi-country queries. At least one code is required — an empty value is rejected rather than treated as \"all\"."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas or semicolons. At least one code is required — an empty value is rejected rather than treated as \"all\"."
    • changedOutput schema / properties / appliedFilters / properties / countries / description
      Previous value: -"Country codes as sent to the API — an array input is joined with semicolons, so this shows the normalized value."New value: +"Country codes as sent to the API — array elements and comma- or semicolon-separated strings are split and rejoined with semicolons, so this shows the normalized value."
    • removedOutput schema / properties / data / items / properties / value / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / data / items / properties / value / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "invalid_params",
      -  "indicator_not_found",
      -  "country_not_found",
      -  "indicator_and_country_not_found"
      -]New value: +[
      +  "invalid_params",
      +  "indicator_not_found",
      +  "indicator_not_queryable",
      +  "country_not_found",
      +  "indicator_and_country_not_found"
      +]
  7. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "data",
      +      "indicator",
      +      "nullCount",
      +      "appliedFilters",
      +      "totalCount",
      +      "currentPage",
      +      "totalPages"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "invalid_params",
      +            "indicator_not_found",
      +            "country_not_found",
      +            "indicator_and_country_not_found"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "data",
      -  "indicator",
      -  "nullCount",
      -  "appliedFilters",
      -  "totalCount",
      -  "currentPage",
      -  "totalPages"
      -]
  8. Changed2 schema fields changed
    • addedOutput schema / properties / appliedFilters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "The effective parameters sent to the World Bank API — confirms country code normalization and which filters were in force for these observations.",
      +  "properties": {
      +    "countries": {
      +      "description": "Country codes as sent to the API — an array input is joined with semicolons, so this shows the normalized value.",
      +      "type": "string"
      +    },
      +    "dateRange": {
      +      "description": "Date window applied, omitted when none was requested.",
      +      "type": "string"
      +    },
      +    "indicatorId": {
      +      "description": "Indicator ID queried.",
      +      "type": "string"
      +    },
      +    "mrv": {
      +      "description": "Most-recent-values count applied, omitted when none was requested.",
      +      "type": "number"
      +    },
      +    "page": {
      +      "description": "Page number requested.",
      +      "type": "number"
      +    },
      +    "perPage": {
      +      "description": "Results per page used, including the server default.",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "indicatorId",
      +    "countries",
      +    "page",
      +    "perPage"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "data",
      -  "indicator",
      -  "nullCount",
      -  "totalCount",
      -  "currentPage",
      -  "totalPages"
      -]New value: +[
      +  "data",
      +  "indicator",
      +  "nullCount",
      +  "appliedFilters",
      +  "totalCount",
      +  "currentPage",
      +  "totalPages"
      +]
  9. Changed6 schema fields changed
    • changedInput schema / properties / countries / anyOf
      Previous value: -[
      -  {
      -    "description": "A single country code or \"all\".",
      -    "type": "string"
      -  },
      -  {
      -    "description": "An array of country codes.",
      -    "items": {
      -      "description": "A country code.",
      -      "type": "string"
      -    },
      -    "type": "array"
      -  }
      -]New value: +[
      +  {
      +    "description": "A single country code or \"all\".",
      +    "pattern": "[^\\s;]",
      +    "type": "string"
      +  },
      +  {
      +    "description": "An array of country codes.",
      +    "items": {
      +      "description": "A country code.",
      +      "type": "string"
      +    },
      +    "minItems": 1,
      +    "type": "array"
      +  }
      +]
    • changedInput schema / properties / countries / description
      Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for all 266 entries (use pagination). Pass a single string or an array of codes for multi-country queries."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for every entry (use pagination). Pass a single string or an array of codes for multi-country queries. At least one code is required — an empty value is rejected rather than treated as \"all\"."
    • changedInput schema / properties / date_range / description
      Previous value: -"Year or year range in YYYY or YYYY:YYYY format (e.g. \"2020\" or \"2010:2023\"). Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`). A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."
    • addedInput schema / properties / date_range / pattern
      Added value: +"^\\s*(?:\\d{4}(?::\\d{4})?|\\d{4}[Qq][1-4](?::\\d{4}[Qq][1-4])?|\\d{4}[Mm](?:0[1-9]|1[0-2])(?::\\d{4}[Mm](?:0[1-9]|1[0-2]))?)?\\s*$"
    • changedInput schema / properties / mrv / description
      Previous value: -"Return the N most recent available values (1–10). Mutually exclusive with date_range."New value: +"Return the N most recent available values per country (1–100), clamped upstream to the length of the series. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."
    • changedInput schema / properties / mrv / maximum
      Previous value: -10New value: +100
  10. Changed8 schema fields changed
    • addedOutput schema / properties / currentPage
      Added value: +{
      +  "description": "Current page number.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Recovery hint for sparse or empty result sets — suggests how to broaden the query.",
      +  "type": "string"
      +}
    • removedOutput schema / properties / page
      Removed value: -{
      -  "description": "Current page number.",
      -  "type": "number"
      -}
    • removedOutput schema / properties / pages
      Removed value: -{
      -  "description": "Total number of pages.",
      -  "type": "number"
      -}
    • removedOutput schema / properties / total
      Removed value: -{
      -  "description": "Total observations before pagination.",
      -  "type": "number"
      -}
    • addedOutput schema / properties / totalCount
      Added value: +{
      +  "description": "Total observations before pagination.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / totalPages
      Added value: +{
      +  "description": "Total number of pages.",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "data",
      -  "indicator",
      -  "total",
      -  "page",
      -  "pages",
      -  "nullCount"
      -]New value: +[
      +  "data",
      +  "indicator",
      +  "nullCount",
      +  "totalCount",
      +  "currentPage",
      +  "totalPages"
      +]
  11. First observed

TDQS

A5/5.0
Behavior5/5

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

The description goes far beyond the readOnly/openWorld/idempotent annotations by disclosing null-value behavior for sparse series, the exact semantics and mutual exclusivity of mrv/mrnev/date_range, frequency selection for quarterly/monthly series, the lastUpdated vintage, pagination consequences, and the sourceScoped mechanism for specially served datasets. These details are not derivable from the annotations or schema alone.

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 front-loads the core purpose and primary sibling in the first sentence, then moves through behavior, parameter selection, frequency, vintage, pagination, and special datasets in a logical order. Despite its length, each clause adds necessary operational detail for a complex 9-parameter tool, so the density is justified rather than padded.

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?

Given the tool's complexity, the presence of an output schema, and rich schema/annotation coverage, the description covers all relevant operational concerns: sparse data, parameter mutual exclusivity, frequency handling, pagination caps, dataset-scoped responses, and how to find valid indicator IDs. No critical calling context is missing.

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

Parameters5/5

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

Although the schema already documents every parameter at 100% coverage, the description adds a layer of meaning: it summarizes the core selection mode ('Set at most one of date_range, mrv, or mrnev'), explains what each mode means for the returned rows, and ties frequency and pagination behavior to real API semantics. This materially helps an agent choose the correct argument combination without reading the full 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?

The description opens with 'Query World Bank indicator values for one or more countries across a time range — the primary data-access tool', which names a specific verb and resource, and immediately distinguishes the tool from worldbank_search_indicators by telling the agent to use that sibling for finding indicator_id values. The purpose is unmistakable even among eight sibling tools.

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 positions the tool as 'the primary data-access tool' and directs the agent to 'find indicator_id values with worldbank_search_indicators', establishing when to use it and when to use a sibling instead. It also gives concrete usage guidance for pagination on 'all' countries and mutual exclusivity among date_range, mrv, and mrnev.

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.