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 1000 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

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). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size.
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.
source_idNoSelect this source dataset explicitly, including subnational sources. Use worldbank_list_countries with the same source_id for its canonical entity IDs. Omission preserves the standard dataset and automatic fallback.
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

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.
sourceIdNoServing source ID, present only when established by the selected source or upstream response.
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 when the source-scoped data API served the explicitly selected source or an automatic fallback dataset.
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. Changed9 schema fields changed
    • changedInput schema / properties / per_page / description
      Previous 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."New value: +"Results per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size."
    • changedInput schema / properties / per_page / maximum
      Previous value: -1000New value: +9007199254740991
    • addedInput schema / properties / source_id
      Added value: +{
      +  "description": "Select this source dataset explicitly, including subnational sources. Use worldbank_list_countries with the same source_id for its canonical entity IDs. Omission preserves the standard dataset and automatic fallback.",
      +  "pattern": "^\\s*\\d*\\s*$",
      +  "type": "string"
      +}
    • addedOutput schema / properties / appliedFilters / properties / sourceId
      Added value: +{
      +  "description": "Explicit source_id requested, omitted for automatic routing.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / data / items / properties / countryCode / description
      Previous value: -"ISO2 code of the country or aggregate (US, XD for High income)."New value: +"ISO2 code of the country or aggregate (US, XD for High income), or the canonical opaque entity ID for a source-only entity."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous 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."New value: +"Machine-readable failure mode. Declared by this tool: `source_not_found`: source_id does not name a source. `source_not_queryable`: The selected source has no supported country/series/time layout. `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",
      -  "upstream_inconsistent"
      -]New value: +[
      +  "source_not_found",
      +  "source_not_queryable",
      +  "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 / sourceId
      Added value: +{
      +  "description": "Serving source ID, present only when established by the selected source or upstream response.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / sourceScoped / description
      Previous value: -"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."New value: +"Present when the source-scoped data API served the explicitly selected source or an automatic fallback dataset."
  2. 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."
  3. 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."
  4. 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"
      +}
  5. 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."
  6. 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"
      +]
  7. 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"
      +]
  8. 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"
      -]
  9. 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"
      +]
  10. 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
  11. 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"
      +]
  12. First observed

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, lowering the burden, but the description goes further by disclosing null-valued cells for sparse series, the lastUpdated vintage to cite, and the sourceScoped fallback for datasets the standard endpoint does not serve. These are genuinely useful behavior notes beyond the annotations, though the description stops short of describing output shape or error/notice handling in depth.

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

Conciseness4/5

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

Front-loaded with purpose, primary-tool role, and the sibling cross-reference, then moves to a compact decision rule among the exclusivity group. It is dense and somewhat long, with a parenthetical source list and restated frequency edge cases that could be trimmed, but nearly every sentence carries operational information.

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

Completeness5/5

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

An output schema exists, so return values need not be explained, yet the description still covers the fields that affect interpretation (sourceScoped, dimension_value default, lastUpdated) and pagination behavior. For a 10-parameter tool with distinct dataset fallbacks, an agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents each parameter in depth, so the baseline is 3; the description adds modest value by front-loading the one-of relationship among date_range, mrv, and mrnev and by tying frequency to which form those select from. It largely restates schema detail rather than adding new semantics, so it sits just above baseline.

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

Purpose5/5

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

States a specific verb and resource ('Query World Bank indicator values for one or more countries across a time range') and self-identifies as 'the primary data-access tool', distinguishing it from the list/get/search siblings. It also names the sibling needed to obtain indicator_id, so an agent can route without opening schemas.

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

Usage Guidelines5/5

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

Explicitly routes indicator discovery to worldbank_search_indicators and states the mutual exclusivity of date_range, mrv, and mrnev plus how to choose between them (mrv = shared recent periods, mrnev = each country's own latest). It also gives the condition for paging at up to 1000 per page when querying 'all' countries.

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.