worldbank-mcp-server
Server Details
Query 29,500+ World Bank development indicators for 200+ countries across 60+ years.
- Status
- Healthy
- Uptime
- 100.0% over 80 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/worldbank-mcp-server
- GitHub Stars
- 3
- Server Listing
- worldbank-mcp-server
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: single-entity metadata (get_country, get_indicator), filtered browsing (list_countries, list_sources, list_topics), catalog search (search_indicators, search_projects), and data retrieval (get_data, get_poverty). The descriptions explicitly cross-reference each other, e.g. get_country points to list_countries for valid codes, and get_data is distinguished from get_poverty as a separate dataset with different semantics. No two tools read as interchangeable.
Every tool follows the same worldbank_ prefix plus a consistent verb_noun pattern (get_country, list_sources, search_indicators). Verbs are used semantically consistently: get for a single identified entity, list for paged enumeration, search for query-driven lookup. No casing or style deviations.
Nine tools is well within the ideal range and each one covers a distinct access pattern (browse the three catalogs, search the two catalogs, fetch three data families). Nothing looks like a redundant wrapper or an internal detail leaked as a tool.
The surface covers the core lifecycle well: discover countries/sources/topics, search indicators, fetch indicator and country metadata, pull indicator series and poverty data, and query the lending portfolio. Minor gaps remain — there is no way to fetch a single project by ID (only search_projects), and no direct listing of indicators within a source/topic without search, but agents can work around both.
Available Tools
9 toolsworldbank_get_countryGet World Bank CountryARead-onlyIdempotentInspect
Fetch metadata for one country or aggregate entity: ISO codes, region, income level, lending type, capital, and coordinates. Accepts an ISO2 code (US, DE), an ISO3 code (USA, DEU), or a World Bank aggregate code (EAS, HIC, WLD); "all" and lists of codes are rejected. Use worldbank_list_countries to browse valid codes.
| Name | Required | Description | Default |
|---|---|---|---|
| country_code | Yes | One country code. Accepts ISO2 (US), ISO3 (USA), or aggregate code (EAS, HIC, WLD) — not "all" or a list of codes. Use worldbank_list_countries to browse valid codes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Country or aggregate ID. |
| iso2 | No | ISO2 country code. |
| name | No | Country or aggregate name. |
| error | No | Present when the call failed. Absent on success. |
| region | No | World Bank region this country belongs to. |
| latitude | No | Capital latitude (empty for aggregates). |
| longitude | No | Capital longitude (empty for aggregates). |
| capitalCity | No | Capital city name (empty for aggregates). |
| incomeLevel | No | World Bank income classification. |
| isAggregate | No | True when this entry is a regional or income-group aggregate. |
| lendingType | No | World Bank lending type classification. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/openWorldHint, so the safety profile is covered. The description adds real behavioral context beyond that: which code shapes succeed and that 'all' or list inputs are rejected, which is a rejection/validation trait not captured by the annotations. It stops short of noting error behavior or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first gives purpose and returned fields, the second gives input formats, the rejection rule, and the alternative. Front-loaded with zero filler, and the sibling pointer is placed last where it belongs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, and the single parameter plus its format constraints are fully specified. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the description's parameter guidance (ISO2/ISO3/aggregate, no 'all', no lists) essentially restates the schema's own description for country_code, adding no new syntax or format detail. Baseline 3 is the correct ceiling when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Fetch metadata for one country or aggregate entity') and enumerates exactly which metadata fields come back (ISO codes, region, income level, lending type, capital, coordinates). It also names the sibling tool (worldbank_list_countries) so the agent can distinguish it from the browse/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the accepted input forms (ISO2, ISO3, aggregate codes) and explicitly rules out invalid ones ('all' and lists of codes are rejected), then routes browsing to worldbank_list_countries. That is an explicit when-to-use and when-not-to-use with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_get_dataGet World Bank Indicator DataARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mrv | No | 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. | |
| page | No | Pagination page number (1-based). | |
| mrnev | No | 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. | |
| per_page | No | 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. | |
| countries | Yes | 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". | |
| frequency | No | 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. | |
| source_id | No | 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. | |
| date_range | No | 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. | |
| indicator_id | Yes | 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. | |
| dimension_value | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Indicator observations for this page. Null values are common for sparse series. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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. |
| sourceId | No | Serving source ID, present only when established by the selected source or upstream response. |
| indicator | No | Indicator metadata echoed from the response. |
| nullCount | No | Count of null values on this page — indicates data sparsity for the requested filter. |
| totalCount | No | Total observations before pagination. |
| totalPages | No | Total number of pages. |
| currentPage | No | Page number requested — past totalPages when the request ran off the end. |
| lastUpdated | No | 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. |
| sourceScoped | No | Present when the source-scoped data API served the explicitly selected source or an automatic fallback dataset. |
| appliedFilters | No | The effective parameters sent to the World Bank API — confirms country code normalization and which filters were in force for these observations. |
TDQS
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.
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.
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.
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.
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.
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.
worldbank_get_indicatorGet World Bank IndicatorARead-onlyIdempotentInspect
Fetch metadata for one World Bank indicator by ID: name, description, unit, source dataset, source organization, and thematic topics. Use worldbank_search_indicators to find the ID when only the concept is known; "all" and lists of IDs are rejected.
| Name | Required | Description | Default |
|---|---|---|---|
| indicator_id | Yes | One indicator code (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL) — not "all" or a list of codes. Use worldbank_search_indicators to find valid IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Indicator ID. |
| name | No | Indicator name. |
| unit | No | Unit of measurement (empty when not specified). |
| error | No | Present when the call failed. Absent on success. |
| topics | No | Thematic topics this indicator belongs to. |
| sourceId | No | Source dataset ID. |
| sourceName | No | Source dataset name. |
| sourceNote | No | Detailed indicator description from the source. |
| sourceOrganization | No | Organization that collects or publishes this data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, so safety is covered. The description adds valuable input-validation behavior — that "all" and ID lists are rejected — which is not in the annotations. It doesn't cover rate limits or error behavior, but that's acceptable given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and followed by the routing rule and constraint. Zero wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only metadata fetcher. An output schema exists, so return values need not be explained, and the description covers purpose, routing, and the input constraint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameter is already fully documented in the schema with pattern and examples. The description reinforces the rejection of "all" and lists but adds no syntax or format details beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Fetch metadata) and resource (one World Bank indicator by ID), and enumerates exactly what metadata is returned. It distinguishes itself from licensing siblings like worldbank_get_data by scoping to metadata rather than time-series values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative (worldbank_search_indicators) and the condition that selects it: when only the concept is known. It also states the exclusions ("all" and lists are rejected), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_get_povertyGet World Bank Poverty and Inequality EstimatesARead-onlyIdempotentInspect
Query poverty and inequality estimates from the World Bank Poverty and Inequality Platform (PIP) for economies and for PIP's own aggregates — World, World Bank regions, income groups, lending groups, and fragility groups. Returns the poverty headcount ratio, poverty gap, and poverty severity at any poverty line, plus mean and median welfare and population. Use it for inequality and distribution questions too — survey-based economy rows carry the Gini coefficient, mean log deviation, polarization, and the ten decile income/consumption shares, because PIP returns poverty and inequality in the same row. PIP is a separate dataset from the WDI series worldbank_get_data reads: it measures welfare in PPP dollars per person per day, at a PPP vintage ppp_version selects, and computes its aggregates at any poverty line, where worldbank_get_data carries only the published lines. Every row reports how it was produced. Nullable estimateType separately identifies actual, nowcast, or projection estimates, while distributionType preserves the source distribution classification (micro, group, or imputed); missing upstream classifications remain null. On an economy, estimationType "survey" rows carry the full inequality block; "interpolation", "extrapolation", and "CMD estimation" rows are gap-filled estimates for years no survey covers, and their gini, mld, polarization, and decileShares are null — a documented gap in the source data, not an error. Aggregate rows (isAggregate true) are "actual", "nowcast", or "projection", add popInPoverty, and carry no distributional block.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination page number (1-based). | |
| year | No | Reporting year to return. A four-digit year (2022), "all" for the full history, or "MRV" for the most recent year. Omitted behaves as "all". MRV follows fill_gaps: with fill_gaps true each economy resolves to PIP's latest estimate year, and with fill_gaps false to its latest survey year; an aggregate resolves to its newest reporting year. PIP coverage starts in 1963 and ends at the last year of the data release in use; a year outside that span fails with the span named. | |
| per_page | No | 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. | |
| countries | Yes | Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); "all" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); the fragility groups FCVY (fragile) and FCVN (not fragile); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. FCS is rejected: use PIP's FCVY for its fragile group, whose membership is not asserted to match WDI's FCS. Other aggregate codes (SSA, EAP, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate. | |
| fill_gaps | No | When true (the default), any year the surveys do not cover falls back to PIP's own estimate for it instead of being left out — so a single-year query still answers, and a full-history query returns a row per year rather than only the survey years. Those fallback rows carry no inequality data. Set false to return survey-derived rows only, accepting an empty result for years no survey covers and for economies PIP publishes only as model estimates. It also decides what "MRV" resolves to, and has no effect on aggregate rows. | |
| ppp_version | No | PPP vintage to express every dollar figure in — the poverty line, mean, and median — as a four-digit year ("2021", "2017"). It must be one of the vintages PIP's current data release is published at; any other value fails with the available vintages named. Omitted uses the newest vintage of that release. The vintage and release applied are echoed as appliedFilters.pppVersion and appliedFilters.releaseVersion. | |
| poverty_line | No | Poverty line in PPP dollars per person per day, at the applied PPP vintage — any threshold, not only the published ones. Omitted uses the international poverty line for that vintage, so the applied value is echoed back on every row as povertyLine rather than assumed here. The poverty line does not affect the inequality fields, which describe the whole distribution. | |
| welfare_type | No | Restrict results to one welfare measure. Surveys measure either income or consumption and the two are not directly comparable, so a cross-country comparison is safer pinned to one. Omitted returns whichever each economy publishes, and both where an economy publishes both — thirty-five do, and those return two rows per year. | |
| reporting_level | No | Restrict results to one reporting level. Most economies publish a national figure only; ten publish a split and return an extra row per year for it, China with all three levels and the rest pairing national with either urban or rural. Every row states its own reportingLevel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Context for an empty result set, for a page past the end of the results, for a page size reduced to the page cap, for a result carrying gap-filled or aggregate rows with no inequality data, and for economies fill_gaps false left out. |
| estimates | No | Poverty and inequality estimates for this page — economies and aggregates in one list, ordered by code, year, reporting level, then welfare type. |
| totalCount | No | Total estimates before pagination. |
| totalPages | No | Total number of pages. |
| currentPage | No | Page number requested — past totalPages when the request ran off the end. |
| appliedFilters | No | The effective parameters sent to PIP — confirms country code normalization and which filters were in force for these estimates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent, so the bar is lower, but the description discloses a great deal more: nullable estimateType and distributionType, that interpolation/extrapolation/CMD rows have null gini, mld, polarization and decileShares as a documented source gap rather than an error, and that aggregate rows are actual/nowcast/projection with popInPoverty and no distributional block. This is exactly the failure-mode context an agent needs to avoid misreading nulls as tool errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded and every sentence carries substantive content about row provenance or nullability. It is nonetheless a dense two-paragraph block, and some material (MRV resolution under fill_gaps, aggregate code rejection) restates what the parameter schema already says, which costs a little economy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description instead covers the interpretive layer: row production method, null semantics, and aggregate vs economy row shape. For a 9-parameter read-only query tool this is enough for an agent to call it and interpret the results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with detailed per-parameter descriptions, so the schema already carries the semantics and a 3 is the baseline. The description reinforces a few interactions (ppp_version selecting the vintage of every dollar figure, poverty_line not affecting inequality fields, welfare_type/reporting_level producing extra rows) but adds no syntax or value information absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb and resource ('Query poverty and inequality estimates from the World Bank Poverty and Inequality Platform') and enumerates the entity types covered (economies plus PIP aggregates). It explicitly contrasts with the sibling worldbank_get_data ('PIP is a separate dataset from the WDI series worldbank_get_data reads'), so an agent can dispatch without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a positive use case beyond the obvious ('Use it for inequality and distribution questions too') and routes WDI-series requests to worldbank_get_data, with the distinguishing criterion being PPP-dollar welfare measurement and computable aggregates at any poverty line. What is missing is an explicit when-not-to-use statement for the other siblings (indicator, country, projects), and the routing sentence sits mid-paragraph rather than up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_list_countriesList World Bank CountriesARead-onlyIdempotentInspect
List countries and regional aggregates with metadata: ISO codes, region, income level, lending type, capital, and coordinates. Filter by region code (e.g. EAS, SSF, NAC), income level (LIC, LMC, UMC, HIC), and lending type (IDX for IDA, IBD for IBRD, IDB for Blend); filters combine by AND. Aggregate entries are excluded by default, leaving individual countries only; set include_aggregates=true to also return region, income group, and world aggregate entities.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination page number (1-based). | |
| region | No | Filter by World Bank region code. A country's region.id is one of EAS (East Asia & Pacific), ECS (Europe & Central Asia), LCN (Latin America & Caribbean), MEA (Middle East, North Africa, Afghanistan & Pakistan), NAC (North America), SAS (South Asia), or SSF (Sub-Saharan Africa). Any other World Bank region or grouping code also filters, by membership: AFE (Africa Eastern and Southern), AFW (Africa Western and Central), ARB (Arab World), EUU (European Union), LDC (Least developed countries), and the rest of the codes the World Bank publishes for regions. | |
| per_page | No | Results per page (default: server default). Positive integers above 300 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size. | |
| source_id | No | Select a source-specific entity listing. Entries carry canonical id, name and sourceId only; global classification filters and include_aggregates=true are unavailable. Default false keeps all source entities. | |
| income_level | No | Filter by income group code: LIC (Low income), LMC (Lower middle income), UMC (Upper middle income), HIC (High income). | |
| lending_type | No | Filter by World Bank lending type code: IDX (IDA), IBD (IBRD), IDB (Blend — eligible for both), or LNX (Not classified). IDX, IBD, and IDB are also the codes worldbank_get_poverty takes for its lending groups; a country's lendingType field reports the name (IDA, IBRD, Blend, Not classified). | |
| include_aggregates | No | When true, includes regional, income-group, and world aggregate entries alongside individual countries. Default false (individual countries only). No aggregate is returned under region or lending_type, whichever code is given, so this changes nothing when either is set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Context for an empty page — which filters matched nothing, or the page range that exists when the requested page is past the end — or for a page size reduced to the page cap. |
| countries | No | Countries (and optionally aggregates) matching the filters. |
| totalCount | No | Total matching entries before pagination (includes aggregates if include_aggregates=true). |
| totalPages | No | Total number of pages. |
| currentPage | No | Page number requested — past totalPages when the request ran off the end. |
| appliedFilters | No | The effective listing parameters — which filters were in force and the page size served. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond that: aggregates are dropped by default, filters combine as AND, and include_aggregates changes scope. It doesn't describe pagination or response shape, but the output schema and per_page parameter cover those.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the resource and metadata, then filters, then the aggregate default. Every clause carries information and nothing is restated from the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 optional parameters, full schema coverage, rich annotations, and an output schema, the description supplies what's needed to call the tool correctly. It could mention pagination behavior or the source_id trade-off, but the schema already documents both, so the gap is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description still earns credit by giving example codes (EAS, SSF, NAC; LIC–HIC; IDX/IBD/IDB) and the AND-combination semantics that the schema documents per-parameter but doesn't state jointly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("List countries and regional aggregates") and enumerates the returned metadata (ISO codes, region, income level, lending type, capital, coordinates). An agent can distinguish this from worldbank_get_country, which returns a single country, without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states how the three filters combine ("filters combine by AND") and clarifies the default exclusion of aggregate entities, which is real selection guidance. It stops short of explicitly naming when to use this instead of worldbank_get_country, leaving that inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_list_sourcesList World Bank Data SourcesARead-onlyIdempotentInspect
List the 70+ World Bank data sources (datasets), such as World Development Indicators, International Debt Statistics, and Doing Business. Returns source IDs and names for use as source_id in worldbank_search_indicators, worldbank_get_data, and worldbank_list_countries, one page at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination page number (1-based). | |
| per_page | No | Results per page (default: server default, max: 100). |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Context for an empty page: the page range that exists when the requested page is past the end. |
| sources | No | World Bank data sources for this page. |
| totalCount | No | Total number of sources. |
| totalPages | No | Total number of pages. |
| currentPage | No | Page number requested — past totalPages when the request ran off the end. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds value beyond them by disclosing pagination behavior ("one page at a time") and the shape of the payload (IDs and names), which an agent needs to plan sequential calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and examples, then the return value and downstream use. No filler, and the most decision-relevant facts come first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-required-parameter read/list tool with an output schema and full annotation coverage, the definition supplies everything needed: what it lists, what it returns, and where the IDs are used. Return-format details are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page and per_page are already fully documented in the schema, including the 1-based and max-100 constraints. The description's "one page at a time" confirms pagination exists but adds no semantics beyond what the schema states, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ("List the 70+ World Bank data sources (datasets)") and anchors it with named examples (World Development Indicators, International Debt Statistics, Doing Business). It also states what the tool returns (source IDs and names), which makes it unambiguously distinguishable from siblings like worldbank_list_topics or worldbank_list_countries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by naming exactly where the returned source IDs are consumed (worldbank_search_indicators, worldbank_get_data, worldbank_list_countries), which implicitly tells an agent to call this before those. It stops short of explicit exclusions, e.g. it doesn't say when to prefer worldbank_list_topics or worldbank_list_countries instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_list_topicsList World Bank TopicsARead-onlyIdempotentInspect
List all 21 World Bank thematic topics (Economy & Growth, Health, Education, and others) with descriptions. Use it to browse the indicator space by theme or to find a topic_id for worldbank_search_indicators.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| topics | No | All 21 World Bank thematic topics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and open-world behavior, so safety is covered. The description adds that the result is a fixed, complete set of 21 topics (implying no pagination or partial results), which is genuinely useful behavioral context not present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with what the tool returns before the usage instruction. Every clause earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value shape need not be explained, and with zero parameters there is no input semantics to cover. Purpose, scope and routing are all stated, so nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. No parameter meaning needs to be conveyed and the description correctly does not invent any.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (World Bank thematic topics), and quantifies scope ('all 21') plus what each entry contains (descriptions). An agent can distinguish this enumeration tool from sibling lookups like worldbank_get_indicator without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names two use cases: browsing the indicator space by theme, and obtaining a topic_id for worldbank_search_indicators. This routes the agent to the correct downstream sibling and states the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_search_indicatorsSearch World Bank IndicatorsARead-onlyIdempotentInspect
Search the 29,500+ World Bank indicator catalog by keyword, topic, or source, returning indicator IDs and metadata for worldbank_get_data. Provide at least one of query, topic_id, or source_id; a topic and a source together narrow to indicators in both. A keyword query matches every term against indicator ID, name, and full description, in any word order, across the whole catalog or the whole selected topic or source; punctuation is ignored, so the query needs at least one letter or digit. Exact ID or name matches rank first, then names starting with the phrase as whole words, then whole-phrase matches, then matches where every term is a whole word of the ID or name, then other ID/name matches, then description-only matches; within each of those, World Development Indicators series come first, then other live sources, then archives, and a series comes ahead of its own breakdowns by sex, area, or age. Each indicator ID appears once, even where the catalog publishes it under two sources. Each result carries the first 150 characters of its description; worldbank_get_indicator returns the whole of it. Find topic IDs with worldbank_list_topics and source IDs with worldbank_list_sources.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination page number (1-based). | |
| query | No | Keyword search terms — an indicator name, ID, or any words from either (e.g. "GDP per capita", "NY.GDP.MKTP.CD", "CO2 emissions"). Every term must match; punctuation is ignored, so the query needs at least one letter or digit. At least one of query, topic_id, or source_id must be provided. | |
| per_page | No | Results per page (default: server default, max: 100). | |
| topic_id | No | Filter by topic ID (e.g. "1" for Agriculture, "3" for Economy & Growth). Use worldbank_list_topics to browse valid IDs. | |
| source_id | No | Filter by data source ID (e.g. "2" for World Development Indicators). Use worldbank_list_sources to browse valid IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Recovery hint for an empty page — how to broaden the search when no indicators matched, or the page range that exists when the requested page is past the end. |
| indicators | No | Matching indicators for this page. |
| totalCount | No | Total matching indicators before pagination. |
| totalPages | No | Total number of pages. |
| currentPage | No | Current page number. |
| appliedFilters | No | The effective search parameters, field by field — confirms which filter combination produced these results without parsing the effectiveQuery string. |
| effectiveQuery | No | Active filters echoed: keyword, topic ID, and/or source ID that were applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already declaring readOnlyHint, openWorldHint, and idempotentHint, the description adds substantial behavioral context: exact ranking order, deduplication across sources, punctuation-ignoring matching rules, and the 150-character description truncation. It discloses the full matching and ordering contract an agent needs without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is notably long and dense, but it is logically structured: purpose first, then parameter requirements, matching, ranking, deduplication, and output format, ending with sibling references. Every sentence carries operational information for a tool with genuinely complex ranking logic, so the length is earned rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't detail return values, and it doesn't. It fully covers filtering rules, ranking order, deduplication, description truncation, and where to find valid IDs via sibling tools. Nothing an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter, establishing a baseline of 3. The description goes beyond this by explaining the 'at least one of' constraint, the topic+source intersection semantics, and the query matching behavior (every term must match, whole-word matching). It adds real meaning beyond the schema, though it doesn't elaborate on page/per_page specifics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Search the 29,500+ World Bank indicator catalog by keyword, topic, or source') and explicitly frames the output as 'indicator IDs and metadata for worldbank_get_data,' tying it into the workflow. This clearly differentiates it from the sibling worldbank_search_projects and the data-retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the requirement 'Provide at least one of query, topic_id, or source_id' and the narrowing semantics of combining topic and source. It also directs agents to worldbank_list_topics and worldbank_list_sources for valid IDs and contrasts itself with worldbank_get_indicator (which returns the full description), giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
worldbank_search_projectsSearch World Bank ProjectsARead-onlyIdempotentInspect
Search the World Bank lending portfolio — the individual loans, credits, and grants the Bank finances — by free text, country, region, status, sector names, financing window (IBRD, IDA, Grants, Other), and board approval date. For classified education commitments use sector: ["Education"], rather than a free-text education query. Returns the project ID, name, borrowing country, region, status, board approval and closing dates, the commitment amount in USD with its IBRD, IDA, and grant parts, financing windows, major sectors, and a link to the project page. This is the operations catalogue, not the statistics catalogue: use it for "what is the World Bank funding in Kenya", "which climate adaptation projects are active", or "how much was committed to education in South Asia since 2020". For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead. Countries take the ISO3 or ISO2 codes the other tools take (BRA or BR), and multi-country operations carry a World Bank regional code such as 3A; WDI aggregates such as SSF or WLD are rejected, since the portfolio lists operations by economy — use region for those. Every filter is an exact match upstream and combines with the others by AND, so a narrow search can legitimately return nothing; when it does, the response says whether the country codes matched anything on their own.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Pagination page number (1-based). | |
| query | No | Free-text search across project names, abstracts, and objectives. Every word must appear, so extra words narrow the result. A balanced quoted phrase and AND or OR between words parse; brackets, braces, an unmatched double quote, a slash between words, a trailing backslash, an AND or OR at either end, a trailing NOT, and # are not. Omit to browse the portfolio by filter alone. Results come newest board approval first either way. | |
| region | No | World Bank operational regions to include, combined as OR. These are the lending regions the portfolio is organized by, not the WDI aggregate codes worldbank_get_data accepts. | |
| sector | No | Exact sector names, such as Education or FY17 - Social Protection, combined as OR across bare and FY17 spellings. Use names copied from the Projects API sector_exact facet, not sector codes. Unknown names return no matches; each name must be nonblank and contain no caret. Combines with other filters by AND. | |
| status | No | Lifecycle stages to include, combined as OR. "Active" is under implementation, "Pipeline" is approved but not yet effective, "Closed" has finished disbursing, and "Dropped" was abandoned before approval. Most of the portfolio is closed, so omitting this returns mostly historical operations. | |
| per_page | No | 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. | |
| countries | No | Borrowing countries: an economy by ISO3 or ISO2 code (BRA or BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes — an array, or one string separated by commas, semicolons, or pipes — are combined as OR: a project matching any of them is returned. A value made only of separators is rejected rather than read as every country. Yemen, DR Congo, West Bank and Gaza, and Timor-Leste are searched under the legacy codes the portfolio files them by (RY, ZR, GZ, TP), which are also accepted as sent. A WDI aggregate (SSF, WLD, SAS) is rejected; use region for a regional search. Omit for every country. | |
| approved_to | No | Latest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day. | |
| approved_from | No | Earliest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day (2024-02-29, not 2023-02-29) and, when approved_to is also set, on or before it. Board approval is the date the Bank committed to the operation; pipeline projects carry a scheduled date in the future. | |
| financial_type | No | Financing windows to include, combined as OR: a project matches when its financialTypes holds any of them. IBRD, IDA, Grants, Other are the complete set, case-sensitive. A project that publishes no financing window — 36% of the portfolio, older and dropped operations mostly — never matches. The Grants window says how an operation is financed; it is not the grantAmount figure. | |
| include_abstract | No | Include each project's complete abstract without changing page size. A project with no abstract reports null; appliedFilters.includeAbstract distinguishes omission from unavailable text. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the maximum. |
| projects | No | Projects on this page, newest board approval date first with or without query, and projects with no board date last. Pagination walks the same order. |
| totalCount | No | Total projects matching the search, before pagination. |
| totalPages | No | Total number of pages. |
| currentPage | No | Page number requested — past totalPages when the request ran off the end. |
| appliedFilters | No | The effective search sent upstream — confirms country-code normalization and which filters were in force for these results. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description still adds substantial behavior: all filters are exact-match AND so narrow searches can legitimately return nothing, the response reports whether country codes matched on their own, and 36% of the portfolio publishes no financing window so financial_type never matches those. It also discloses the legacy country codes (RY, ZR, GZ, TP) and that WDI aggregates are rejected — none of which is in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb, resource, and filter list, then returns, then sibling routing, then parameter caveats — a sensible order. It is dense and long, and the enumerated return fields partly duplicate the output schema, but nearly every sentence carries distinct information, so little is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, zero-required search tool over a large open-world catalogue, the description covers scope, empty-result behavior, code formats, filter interaction, and how it differs from all statistical siblings. An output schema exists, so the brief return listing is extra rather than necessary, and nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes well beyond it: it explains that sector names must come from the sector_exact facet and not codes, that status omission returns mostly historical operations, that the Grants window is not the grantAmount figure, and that pipeline projects carry future scheduled approval dates. It also adds ISO2/ISO3 vs regional-code semantics (3A, 4E) that supplement the schema's terse wording.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search the World Bank lending portfolio — the individual loans, credits, and grants") and immediately scopes it against the sibling statistics catalogue. An agent can tell this apart from worldbank_search_indicators and worldbank_get_data without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples ("what is the World Bank funding in Kenya", "which climate adaptation projects are active"), explicit when-not with named alternatives ("For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead"), plus a specific routing rule to sector: ["Education"] for classified education commitments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
worldbank_get_data9 fields changed- changed
Input schema / properties / per_page / descriptionPrevious 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." - changed
Input schema / properties / per_page / maximumPrevious value: -1000New value: +9007199254740991 - added
Input schema / properties / source_idAdded 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" +} - added
Output schema / properties / appliedFilters / properties / sourceIdAdded value: +{ + "description": "Explicit source_id requested, omitted for automatic routing.", + "type": "string" +} - changed
Output schema / properties / data / items / properties / countryCode / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +] - added
Output schema / properties / sourceIdAdded value: +{ + "description": "Serving source ID, present only when established by the selected source or upstream response.", + "type": "string" +} - changed
Output schema / properties / sourceScoped / descriptionPrevious 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."
- Changed
worldbank_get_poverty5 fields changed- changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to several thousand rows. One page holds at most 70 estimates, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; 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." - changed
Input schema / properties / per_page / maximumPrevious value: -1000New value: +9007199254740991 - added
Output schema / properties / estimates / items / properties / distributionTypeAdded value: +{ + "description": "PIP distribution classification, such as micro, group, or imputed. Null when PIP publishes none.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / estimates / items / properties / estimateTypeAdded value: +{ + "description": "PIP estimate classification: actual, nowcast, or projection. Null when PIP publishes none; independent of estimationType.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / estimates / items / requiredPrevious value: -[ - "countryCode", - "countryName", - "regionCode", - "regionName", - "reportingYear", - "reportingLevel", - "welfareType", - "povertyLine", - "headcount", - "povertyGap", - "povertySeverity", - "watts", - "mean", - "median", - "gini", - "mld", - "polarization", - "decileShares", - "population", - "popInPoverty", - "surveyYear", - "surveyAcronym", - "surveyComparability", - "comparableSpell", - "estimationType", - "isInterpolated", - "isAggregate" -]New value: +[ + "countryCode", + "countryName", + "regionCode", + "regionName", + "reportingYear", + "reportingLevel", + "welfareType", + "povertyLine", + "headcount", + "povertyGap", + "povertySeverity", + "watts", + "mean", + "median", + "gini", + "mld", + "polarization", + "decileShares", + "population", + "popInPoverty", + "surveyYear", + "surveyAcronym", + "surveyComparability", + "comparableSpell", + "estimationType", + "estimateType", + "distributionType", + "isInterpolated", + "isAggregate" +]
- Changed
worldbank_list_countries12 fields changed- changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 300). One page holds at most 150 entries, 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 300 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size." - changed
Input schema / properties / per_page / maximumPrevious value: -300New value: +9007199254740991 - added
Input schema / properties / source_idAdded value: +{ + "description": "Select a source-specific entity listing. Entries carry canonical id, name and sourceId only; global classification filters and include_aggregates=true are unavailable. Default false keeps all source entities.", + "pattern": "^\\s*\\d*\\s*$", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / sourceIdAdded value: +{ + "description": "Source dataset requested, omitted for the global country listing.", + "type": "string" +} - removed
Output schema / properties / countries / items / additionalPropertiesRemoved value: -false - added
Output schema / properties / countries / items / anyOfAdded value: +[ + { + "additionalProperties": false, + "description": "An entity from a selected source.", + "properties": { + "id": { + "description": "Canonical source entity ID, accepted unchanged by worldbank_get_data.", + "type": "string" + }, + "name": { + "description": "Source entity name.", + "type": "string" + }, + "sourceId": { + "description": "Source owning this entity.", + "type": "string" + } + }, + "required": [ + "id", + "name", + "sourceId" + ], + "type": "object" + }, + { + "additionalProperties": false, + "description": "A country or aggregate entry.", + "properties": { + "capitalCity": { + "description": "Capital city name (empty for aggregates).", + "type": "string" + }, + "id": { + "description": "Country or aggregate ID (ISO2 or WB aggregate code).", + "type": "string" + }, + "incomeLevel": { + "additionalProperties": false, + "description": "World Bank income classification.", + "properties": { + "id": { + "description": "Income level code.", + "type": "string" + }, + "name": { + "description": "Income level name.", + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "isAggregate": { + "description": "True when this entry is a regional or income-group aggregate rather than an individual country.", + "type": "boolean" + }, + "iso2": { + "description": "ISO2 country code.", + "type": "string" + }, + "latitude": { + "description": "Capital latitude (empty for aggregates).", + "type": "string" + }, + "lendingType": { + "description": "World Bank lending type name: IDA, IBRD, Blend, or Not classified (lending_type filters by the codes IDX, IBD, IDB, LNX). Aggregates report Aggregates.", + "type": "string" + }, + "longitude": { + "description": "Capital longitude (empty for aggregates).", + "type": "string" + }, + "name": { + "description": "Country or aggregate name.", + "type": "string" + }, + "region": { + "additionalProperties": false, + "description": "World Bank region this country belongs to.", + "properties": { + "id": { + "description": "Region code.", + "type": "string" + }, + "name": { + "description": "Region name.", + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "required": [ + "id", + "iso2", + "name", + "region", + "incomeLevel", + "lendingType", + "capitalCity", + "longitude", + "latitude", + "isAggregate" + ], + "type": "object" + } +] - changed
Output schema / properties / countries / items / descriptionPrevious value: -"A country or aggregate entry."New value: +"A global country or aggregate, or an entity from the selected source." - removed
Output schema / properties / countries / items / propertiesRemoved value: -{ - "capitalCity": { - "description": "Capital city name (empty for aggregates).", - "type": "string" - }, - "id": { - "description": "Country or aggregate ID (ISO2 or WB aggregate code).", - "type": "string" - }, - "incomeLevel": { - "additionalProperties": false, - "description": "World Bank income classification.", - "properties": { - "id": { - "description": "Income level code.", - "type": "string" - }, - "name": { - "description": "Income level name.", - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - }, - "isAggregate": { - "description": "True when this entry is a regional or income-group aggregate rather than an individual country.", - "type": "boolean" - }, - "iso2": { - "description": "ISO2 country code.", - "type": "string" - }, - "latitude": { - "description": "Capital latitude (empty for aggregates).", - "type": "string" - }, - "lendingType": { - "description": "World Bank lending type name: IDA, IBRD, Blend, or Not classified (lending_type filters by the codes IDX, IBD, IDB, LNX). Aggregates report Aggregates.", - "type": "string" - }, - "longitude": { - "description": "Capital longitude (empty for aggregates).", - "type": "string" - }, - "name": { - "description": "Country or aggregate name.", - "type": "string" - }, - "region": { - "additionalProperties": false, - "description": "World Bank region this country belongs to.", - "properties": { - "id": { - "description": "Region code.", - "type": "string" - }, - "name": { - "description": "Region name.", - "type": "string" - } - }, - "required": [ - "id", - "name" - ], - "type": "object" - } -} - removed
Output schema / properties / countries / items / requiredRemoved value: -[ - "id", - "iso2", - "name", - "region", - "incomeLevel", - "lendingType", - "capitalCity", - "longitude", - "latitude", - "isAggregate" -] - removed
Output schema / properties / countries / items / typeRemoved value: -"object" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: An invalid region or income_level code was provided. 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. `unsupported_source_filter`: Global classification filters are combined with source_id. `invalid_filter`: An invalid region or income_level code was provided. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_filter" -]New value: +[ + "source_not_found", + "source_not_queryable", + "unsupported_source_filter", + "invalid_filter" +]
- Changed
worldbank_list_sources1 field changed- changed
Output schema / properties / sources / items / properties / id / descriptionPrevious value: -"Source ID for use in worldbank_search_indicators."New value: +"Source ID for use in worldbank_search_indicators, worldbank_get_data, and worldbank_list_countries."
- Changed
worldbank_search_projects9 fields changed- changed
Input schema / properties / include_abstract / descriptionPrevious value: -"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, and an abstract longer than 5,000 characters (about 2% of them) is cut there and marked with …, with notice naming the projects cut and each project's url leading to the full text; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes."New value: +"Include each project's complete abstract without changing page size. A project with no abstract reports null; appliedFilters.includeAbstract distinguishes omission from unavailable text." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; 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." - changed
Input schema / properties / per_page / maximumPrevious value: -1000New value: +9007199254740991 - added
Input schema / properties / sectorAdded value: +{ + "description": "Exact sector names, such as Education or FY17 - Social Protection, combined as OR across bare and FY17 spellings. Use names copied from the Projects API sector_exact facet, not sector codes. Unknown names return no matches; each name must be nonblank and contain no caret. Combines with other filters by AND.", + "items": { + "description": "A sector name, optionally prefixed FY17 - .", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / appliedFilters / properties / sectorAdded value: +{ + "description": "Sector names applied, deduplicated with the leading FY17 prefix removed; omitted when none.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. Also when countries holds only separators and so names no code at all. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_sector_name`: A sector name is blank after normalization or contains a caret separator. `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. Also when countries holds only separators and so names no code at all. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_country_code", - "invalid_date", - "reversed_date_range", - "invalid_query", - "page_out_of_range", - "upstream_unavailable" -]New value: +[ + "invalid_sector_name", + "invalid_country_code", + "invalid_date", + "reversed_date_range", + "invalid_query", + "page_out_of_range", + "upstream_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, for a page size reduced to the page cap, or naming the projects whose abstracts were cut."New value: +"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the maximum." - changed
Output schema / properties / projects / items / properties / abstract / descriptionPrevious value: -"Project abstract, cut at 5,000 characters and marked with … when longer. Null when include_abstract was not requested and when the project publishes none — appliedFilters.includeAbstract separates the two."New value: +"Complete project abstract. Null when include_abstract was not requested or the project publishes none; appliedFilters.includeAbstract distinguishes them."
1 tool update
- Changed
worldbank_get_poverty3 fields changed- changed
Input schema / properties / countries / descriptionPrevious value: -"Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. Other aggregate codes (SSA, EAP, FCVY, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate."New value: +"Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); the fragility groups FCVY (fragile) and FCVN (not fragile); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. FCS is rejected: use PIP's FCVY for its fragile group, whose membership is not asserted to match WDI's FCS. Other aggregate codes (SSA, EAP, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: an FCV or PovcalNet grouping from PIP's regions table (FCVY, SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, or the World Bank Indicators API country listing that resolves an ISO2 code could not be loaded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: WDI's FCS, a PovcalNet grouping from PIP's regions table (SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, or the World Bank Indicators API country listing that resolves an ISO2 code could not be loaded. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / estimates / items / properties / isAggregate / descriptionPrevious value: -"True on a PIP aggregate — World, a region, an income group, or a lending group — whose median, distributional block, survey fields, welfareType, and reportingLevel are null."New value: +"True on a PIP aggregate — World, a region, an income group, a lending group, or a fragility group — whose median, distributional block, survey fields, welfareType, and reportingLevel are null."
1 tool update
- Changed
worldbank_get_data10 fields changed- changed
Input schema / properties / date_range / descriptionPrevious 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." - added
Input schema / properties / frequencyAdded 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." +} - added
Input schema / properties / mrnevAdded 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" +} - changed
Input schema / properties / mrv / descriptionPrevious 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." - added
Output schema / properties / appliedFilters / properties / frequencyAdded value: +{ + "description": "Period form applied (annual, quarterly, monthly), omitted when none was requested.", + "enum": [ + "annual", + "quarterly", + "monthly" + ], + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / mrnevAdded value: +{ + "description": "Most-recent-non-empty-values count applied, omitted when none was requested.", + "type": "number" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +] - added
Output schema / properties / lastUpdatedAdded 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" +} - changed
Output schema / properties / notice / descriptionPrevious 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."
5 tool updates
- Changed
worldbank_get_data10 fields changed- changed
Input schema / properties / countries / anyOfPrevious 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" + } +] - changed
Input schema / properties / countries / descriptionPrevious 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\"." - changed
Input schema / properties / per_page / descriptionPrevious 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." - changed
Output schema / properties / appliedFilters / properties / countries / descriptionPrevious 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." - changed
Output schema / properties / appliedFilters / properties / perPage / descriptionPrevious 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." - added
Output schema / properties / appliedFilters / properties / requestedPerPageAdded value: +{ + "description": "Page size asked for, present only when it exceeded the page cap and perPage was reduced.", + "type": "number" +} - changed
Output schema / properties / data / items / properties / countryCode / descriptionPrevious value: -"ISO2 country code (or aggregate code)."New value: +"ISO2 code of the country or aggregate (US, XD for High income)." - changed
Output schema / properties / data / items / properties / countryIso3 / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
worldbank_get_poverty3 fields changed- changed
Input schema / properties / countries / anyOfPrevious value: -[ - { - "description": "A single country code, a comma-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" + } +] - changed
Input schema / properties / countries / descriptionPrevious value: -"Country codes: a single code, an array, or one string separated by commas or semicolons. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. Other aggregate codes (SSA, EAP, FCVY, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate."New value: +"Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. Other aggregate codes (SSA, EAP, FCVY, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to several thousand rows. One page holds at most 70 estimates, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap, disclosed in notice, and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size."New value: +"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to several thousand rows. One page holds at most 70 estimates, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; notice discloses the reduction whenever the result runs past one page."
- Changed
worldbank_list_countries4 fields changed- changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 300)."New value: +"Results per page (default: server default, max: 300). One page holds at most 150 entries, 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." - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "countries", - "totalCount", - "currentPage", - "totalPages" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "countries", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "The effective listing parameters — which filters were in force and the page size served.", + "properties": { + "includeAggregates": { + "description": "Whether aggregates were requested, including the default of false.", + "type": "boolean" + }, + "incomeLevel": { + "description": "Income level code applied, omitted when none.", + "type": "string" + }, + "lendingType": { + "description": "Lending type code applied, omitted when none.", + "type": "string" + }, + "page": { + "description": "Page number requested.", + "type": "number" + }, + "perPage": { + "description": "Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size.", + "type": "number" + }, + "region": { + "description": "Region code applied, omitted when none.", + "type": "string" + }, + "requestedPerPage": { + "description": "Page size asked for, present only when it exceeded the page cap and perPage was reduced.", + "type": "number" + } + }, + "required": [ + "includeAggregates", + "page", + "perPage" + ], + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty page: which filters matched nothing, or the page range that exists when the requested page is past the end."New value: +"Context for an empty page — which filters matched nothing, or the page range that exists when the requested page is past the end — or for a page size reduced to the page cap."
- Changed
worldbank_search_indicators2 fields changed- changed
Output schema / properties / indicators / items / properties / sourceNote / descriptionPrevious value: -"Brief indicator description."New value: +"Indicator description, cut to its first 150 characters and marked with … when longer. worldbank_get_indicator returns it whole." - changed
Output schema / properties / notice / descriptionPrevious value: -"Recovery hint when no indicators matched — suggests how to broaden the search."New value: +"Recovery hint for an empty page — how to broaden the search when no indicators matched, or the page range that exists when the requested page is past the end."
- Changed
worldbank_search_projects7 fields changed- changed
Input schema / properties / countries / anyOfPrevious value: -[ - { - "description": "A single country code, or a comma- or semicolon-separated list of them.", - "type": "string" - }, - { - "description": "An array of country codes.", - "items": { - "description": "An ISO3, ISO2, or World Bank regional code.", - "type": "string" - }, - "type": "array" - } -]New value: +[ + { + "description": "A single country code, or a list of them separated by commas, semicolons, or pipes.", + "type": "string" + }, + { + "description": "An array of country codes; an element holding several codes separated by commas, semicolons, or pipes is split too.", + "items": { + "description": "An ISO3, ISO2, or World Bank regional code.", + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / countries / descriptionPrevious value: -"Borrowing countries: an economy by ISO3 or ISO2 code (BRA or BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes are combined as OR — a project matching any of them is returned. Yemen, DR Congo, West Bank and Gaza, and Timor-Leste are searched under the legacy codes the portfolio files them by (RY, ZR, GZ, TP), which are also accepted as sent. A WDI aggregate (SSF, WLD, SAS) is rejected; use region for a regional search. Omit for every country."New value: +"Borrowing countries: an economy by ISO3 or ISO2 code (BRA or BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes — an array, or one string separated by commas, semicolons, or pipes — are combined as OR: a project matching any of them is returned. A value made only of separators is rejected rather than read as every country. Yemen, DR Congo, West Bank and Gaza, and Timor-Leste are searched under the legacy codes the portfolio files them by (RY, ZR, GZ, TP), which are also accepted as sent. A WDI aggregate (SSF, WLD, SAS) is rejected; use region for a regional search. Omit for every country." - changed
Input schema / properties / include_abstract / descriptionPrevious value: -"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, with every abstract returned whole; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes."New value: +"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, and an abstract longer than 5,000 characters (about 2% of them) is cut there and marked with …, with notice naming the projects cut and each project's url leading to the full text; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap, disclosed in notice, and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size."New value: +"Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; notice discloses the reduction whenever the result runs past one page." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. Also when countries holds only separators and so names no code at all. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the page cap."New value: +"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, for a page size reduced to the page cap, or naming the projects whose abstracts were cut." - changed
Output schema / properties / projects / items / properties / abstract / descriptionPrevious value: -"Project abstract. Null when include_abstract was not requested and when the project publishes none — appliedFilters.includeAbstract separates the two."New value: +"Project abstract, cut at 5,000 characters and marked with … when longer. Null when include_abstract was not requested and when the project publishes none — appliedFilters.includeAbstract separates the two."
3 tool updates
- Changed
worldbank_get_poverty1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: an FCV or PovcalNet grouping from PIP's regions table (FCVY, SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: an FCV or PovcalNet grouping from PIP's regions table (FCVY, SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, or the World Bank Indicators API country listing that resolves an ISO2 code could not be loaded. Other values are possible when a failure originates below the handler."
- Changed
worldbank_list_countries4 fields changed- changed
Input schema / properties / include_aggregates / descriptionPrevious value: -"When true, includes regional, income-group, and world aggregate entries alongside individual countries. Default false (individual countries only)."New value: +"When true, includes regional, income-group, and world aggregate entries alongside individual countries. Default false (individual countries only). No aggregate is returned under region or lending_type, whichever code is given, so this changes nothing when either is set." - added
Input schema / properties / lending_typeAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "IDX (IDA), IBD (IBRD), IDB (Blend), or LNX (Not classified).", + "enum": [ + "IBD", + "IDB", + "IDX", + "LNX" + ], + "type": "string" + } + ], + "description": "Filter by World Bank lending type code: IDX (IDA), IBD (IBRD), IDB (Blend — eligible for both), or LNX (Not classified). IDX, IBD, and IDB are also the codes worldbank_get_poverty takes for its lending groups; a country's lendingType field reports the name (IDA, IBRD, Blend, Not classified)." +} - changed
Input schema / properties / region / descriptionPrevious value: -"Filter by World Bank region code. Valid codes: EAS (East Asia & Pacific), ECS (Europe & Central Asia), LCN (Latin America & Caribbean), MEA (Middle East & North Africa), NAC (North America), SAS (South Asia), SSF (Sub-Saharan Africa)."New value: +"Filter by World Bank region code. A country's region.id is one of EAS (East Asia & Pacific), ECS (Europe & Central Asia), LCN (Latin America & Caribbean), MEA (Middle East, North Africa, Afghanistan & Pakistan), NAC (North America), SAS (South Asia), or SSF (Sub-Saharan Africa). Any other World Bank region or grouping code also filters, by membership: AFE (Africa Eastern and Southern), AFW (Africa Western and Central), ARB (Arab World), EUU (European Union), LDC (Least developed countries), and the rest of the codes the World Bank publishes for regions." - changed
Output schema / properties / countries / items / properties / lendingType / descriptionPrevious value: -"World Bank lending type classification."New value: +"World Bank lending type name: IDA, IBRD, Blend, or Not classified (lending_type filters by the codes IDX, IBD, IDB, LNX). Aggregates report Aggregates."
- Changed
worldbank_search_projects16 fields changed- changed
Input schema / properties / countries / anyOfPrevious value: -[ - { - "description": "A single two-character code, or a comma- or semicolon-separated list of them.", - "type": "string" - }, - { - "description": "An array of two-character codes.", - "items": { - "description": "A two-character country code.", - "type": "string" - }, - "type": "array" - } -]New value: +[ + { + "description": "A single country code, or a comma- or semicolon-separated list of them.", + "type": "string" + }, + { + "description": "An array of country codes.", + "items": { + "description": "An ISO3, ISO2, or World Bank regional code.", + "type": "string" + }, + "type": "array" + } +] - changed
Input schema / properties / countries / descriptionPrevious value: -"Borrowing countries, by the two-character code this API keys on: ISO2 for an economy (BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes are combined as OR — a project matching any of them is returned. Omit for every country."New value: +"Borrowing countries: an economy by ISO3 or ISO2 code (BRA or BR), or a World Bank regional code for a multi-country operation (3A for Africa, 4E for East Asia and Pacific). Several codes are combined as OR — a project matching any of them is returned. Yemen, DR Congo, West Bank and Gaza, and Timor-Leste are searched under the legacy codes the portfolio files them by (RY, ZR, GZ, TP), which are also accepted as sent. A WDI aggregate (SSF, WLD, SAS) is rejected; use region for a regional search. Omit for every country." - added
Input schema / properties / financial_typeAdded value: +{ + "description": "Financing windows to include, combined as OR: a project matches when its financialTypes holds any of them. IBRD, IDA, Grants, Other are the complete set, case-sensitive. A project that publishes no financing window — 36% of the portfolio, older and dropped operations mostly — never matches. The Grants window says how an operation is financed; it is not the grantAmount figure.", + "items": { + "enum": [ + "IBRD", + "IDA", + "Grants", + "Other" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search across project names, abstracts, and objectives. Every word must appear, so extra words narrow the result. Omit to browse the portfolio by filter alone, newest board approvals first."New value: +"Free-text search across project names, abstracts, and objectives. Every word must appear, so extra words narrow the result. A balanced quoted phrase and AND or OR between words parse; brackets, braces, an unmatched double quote, a slash between words, a trailing backslash, an AND or OR at either end, a trailing NOT, and # are not. Omit to browse the portfolio by filter alone. Results come newest board approval first either way." - changed
Output schema / properties / appliedFilters / properties / countries / descriptionPrevious value: -"Country codes as sent upstream — uppercased and comma-joined here for readability, though the API itself takes them caret-separated. Omitted when no country filter was applied."New value: +"Country codes as sent upstream — each resolved to the code the portfolio keys on (BRA → BR, YEM or YE → RY), uppercased, deduplicated, and comma-joined here for readability, though the API itself takes them caret-separated. Omitted when no country filter was applied." - added
Output schema / properties / appliedFilters / properties / financialTypeAdded value: +{ + "description": "Financing windows applied, comma-joined, omitted when none.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry is not a two-character code — most often an ISO3 code such as BRA, which the Projects API does not key on. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page: a 4xx when it refuses the query text, a 5xx or an error page when it cannot serve the search. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_country_code", - "invalid_date", - "reversed_date_range", - "page_out_of_range", - "upstream_unavailable" -]New value: +[ + "invalid_country_code", + "invalid_date", + "reversed_date_range", + "invalid_query", + "page_out_of_range", + "upstream_unavailable" +] - changed
Output schema / properties / projects / descriptionPrevious value: -"Projects on this page, newest board approval date first — the order the API returns and the order pagination walks."New value: +"Projects on this page, newest board approval date first with or without query, and projects with no board date last. Pagination walks the same order." - changed
Output schema / properties / projects / items / properties / countryCodes / descriptionPrevious value: -"Two-character code of the borrowing country — ISO2 for an economy, a World Bank regional code such as 3A for a multi-country operation. Upstream publishes it as a list, though every project in the portfolio carries exactly one."New value: +"Two-character code of the borrowing country — the economy's ISO2 code, which chains into the other tools (YE for Yemen, though the portfolio files it under RY), or a World Bank regional code such as 3A for a multi-country operation. Upstream publishes it as a list, though every project in the portfolio carries exactly one." - changed
Output schema / properties / projects / items / properties / financialTypes / descriptionPrevious value: -"Financing windows behind the operation: IBRD, IDA, Grants, or Other. A blended operation lists more than one."New value: +"Financing windows behind the operation: IBRD, IDA, Grants, Other — the values financial_type filters on. A blended operation lists more than one; empty where the project publishes none." - added
Output schema / properties / projects / items / properties / grantAmountAdded value: +{ + "description": "Grant amount in USD: trust-fund grants and, on some operations, other agencies' co-financing recorded on the project, so it is not all World Bank money. Counted in totalCommitment. It is its own figure, unrelated to which financialTypes the project lists.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / projects / items / properties / ibrdCommitmentAdded value: +{ + "description": "IBRD commitment in USD. Null when the project publishes no IBRD or IDA amount, as on a grant-only operation — not a commitment of zero.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / projects / items / properties / idaCommitmentAdded value: +{ + "description": "IDA commitment in USD, IDA grants included. Null when the project publishes no IBRD or IDA amount — not a commitment of zero.", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / projects / items / properties / totalCommitment / descriptionPrevious value: -"Total World Bank commitment in USD. Null on just over half the portfolio, which publishes no amount — dropped and older operations mostly — and that is not the same as a commitment of zero."New value: +"Commitment amount in USD as the project page reports it: ibrdCommitment + idaCommitment + grantAmount. Null on 35.8% of the portfolio (28,153 projects, 2026-09-25), which publishes no amount — dropped and older operations mostly — and that is not the same as a commitment of zero. It can include other agencies' co-financing through grantAmount; World Bank lending alone is ibrdCommitment + idaCommitment." - changed
Output schema / properties / projects / items / requiredPrevious value: -[ - "id", - "name", - "status", - "countryCodes", - "countryName", - "regionName", - "boardApprovalDate", - "closingDate", - "totalCommitment", - "financialTypes", - "majorSectors", - "abstract", - "url" -]New value: +[ + "id", + "name", + "status", + "countryCodes", + "countryName", + "regionName", + "boardApprovalDate", + "closingDate", + "totalCommitment", + "ibrdCommitment", + "idaCommitment", + "grantAmount", + "financialTypes", + "majorSectors", + "abstract", + "url" +]
2 tool updates
- Changed
worldbank_get_poverty26 fields changed- changed
Input schema / properties / countries / descriptionPrevious value: -"Country codes. PIP identifies economies by ISO3 code (IND, USA, BRA); \"all\" returns every economy it covers. Pass a single code, an array, or one string separated by commas or semicolons. Regional, income-group, and world aggregate codes (WLD, SSF, HIC) are not served by this dataset — query the individual economies instead."New value: +"Country codes: a single code, an array, or one string separated by commas or semicolons. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. Other aggregate codes (SSA, EAP, FCVY, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate." - changed
Input schema / properties / fill_gaps / descriptionPrevious value: -"When true (the default), any year the surveys do not cover falls back to PIP's own estimate for it instead of being left out — so a single-year query still answers, and a full-history query returns a row per year rather than only the survey years. Those fallback rows carry no inequality data. Set false to return survey-derived rows only, accepting an empty result for years no survey covers."New value: +"When true (the default), any year the surveys do not cover falls back to PIP's own estimate for it instead of being left out — so a single-year query still answers, and a full-history query returns a row per year rather than only the survey years. Those fallback rows carry no inequality data. Set false to return survey-derived rows only, accepting an empty result for years no survey covers and for economies PIP publishes only as model estimates. It also decides what \"MRV\" resolves to, and has no effect on aggregate rows." - changed
Input schema / properties / year / descriptionPrevious value: -"Reporting year to return. A four-digit year (2022), \"all\" for the full history, or \"MRV\" for the most recent year available. Omitted behaves as \"all\". PIP coverage starts in 1963 and runs to the current year."New value: +"Reporting year to return. A four-digit year (2022), \"all\" for the full history, or \"MRV\" for the most recent year. Omitted behaves as \"all\". MRV follows fill_gaps: with fill_gaps true each economy resolves to PIP's latest estimate year, and with fill_gaps false to its latest survey year; an aggregate resolves to its newest reporting year. PIP coverage starts in 1963 and ends at the last year of the data release in use; a year outside that span fails with the span named." - changed
Output schema / properties / appliedFilters / properties / countries / descriptionPrevious value: -"Country codes as sent to PIP — arrays and semicolon-separated input are normalized to a comma-joined list, so this shows the value actually queried."New value: +"Codes as queried, comma-joined across economies and aggregates: uppercased and deduplicated, two-character codes resolved to their three-character form (NG → NGA), and WDI group spellings read as PIP's (LMC → LMIC, IDB → BLND, IBD → IBRD). PIP's IDA-only group stays IDX, since IDA means IDA total. Every code here can be sent back as countries and asks for the same economy or group." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: PIP does not recognize one or more of the country codes. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, which an aggregate country code also produces. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: an FCV or PovcalNet grouping from PIP's regions table (FCVY, SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "country_not_found", - "invalid_parameter", - "ppp_version_unavailable", - "upstream_unavailable" -]New value: +[ + "country_not_found", + "ambiguous_aggregate", + "unserved_aggregate", + "aggregate_filter_conflict", + "invalid_parameter", + "ppp_version_unavailable", + "upstream_unavailable" +] - changed
Output schema / properties / estimates / descriptionPrevious value: -"Poverty and inequality estimates for this page, ordered by country, year, reporting level, then welfare type."New value: +"Poverty and inequality estimates for this page — economies and aggregates in one list, ordered by code, year, reporting level, then welfare type." - changed
Output schema / properties / estimates / items / descriptionPrevious value: -"One country × year × reporting-level × welfare-type estimate."New value: +"One economy × year × reporting-level × welfare-type estimate, or one aggregate × year." - changed
Output schema / properties / estimates / items / properties / countryCode / descriptionPrevious value: -"ISO3 country code."New value: +"ISO3 code of the economy, or the aggregate code (SSF, LIC, WLD) on an aggregate row — IDX for PIP's IDA-only group. Accepted back as countries." - changed
Output schema / properties / estimates / items / properties / countryName / descriptionPrevious value: -"Economy name."New value: +"Economy or aggregate name — \"IDA only\" for IDX, as WDI names it." - changed
Output schema / properties / estimates / items / properties / estimationType / descriptionPrevious value: -"How the row was produced: \"survey\" carries the full inequality block; \"interpolation\", \"extrapolation\", and \"CMD estimation\" are gap-filled and carry none. The last is what PIP publishes for economies it has no survey for at all."New value: +"How the row was produced. On an economy: \"survey\" carries the full inequality block; \"interpolation\", \"extrapolation\", and \"CMD estimation\" are gap-filled and carry none, the last being what PIP publishes for economies it has no survey for at all. On an aggregate: \"actual\", \"nowcast\", or \"projection\"." - added
Output schema / properties / estimates / items / properties / isAggregateAdded value: +{ + "description": "True on a PIP aggregate — World, a region, an income group, or a lending group — whose median, distributional block, survey fields, welfareType, and reportingLevel are null.", + "type": "boolean" +} - changed
Output schema / properties / estimates / items / properties / isInterpolated / descriptionPrevious value: -"True on the interpolated and extrapolated rows. Read estimationType instead of relying on this alone — a \"CMD estimation\" row is also gap-filled but reports false here."New value: +"True on the interpolated and extrapolated rows. Read estimationType instead of relying on this alone — a \"CMD estimation\" row is also gap-filled but reports false here. Null on aggregate rows." - changed
Output schema / properties / estimates / items / properties / isInterpolated / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / estimates / items / properties / median / descriptionPrevious value: -"Median daily welfare per person in PPP dollars."New value: +"Median daily welfare per person in PPP dollars. Null on aggregate rows, which PIP publishes without one." - added
Output schema / properties / estimates / items / properties / popInPovertyAdded value: +{ + "description": "Number of people below the poverty line, as PIP publishes it on aggregate rows. Null on economy rows, where population × headcount gives it.", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / estimates / items / properties / regionCode / descriptionPrevious value: -"PIP region code (e.g. SAS, NAC, SSA)."New value: +"PIP region code of the economy (e.g. SAS, NAC, SSF); null on an aggregate row." - changed
Output schema / properties / estimates / items / properties / regionCode / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / estimates / items / properties / regionName / descriptionPrevious value: -"PIP region name."New value: +"PIP region name of the economy; null on an aggregate row." - changed
Output schema / properties / estimates / items / properties / regionName / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / estimates / items / properties / reportingLevel / descriptionPrevious value: -"Coverage of this estimate: national, urban, or rural."New value: +"Coverage of this estimate: national, urban, or rural. Null on an aggregate row." - changed
Output schema / properties / estimates / items / properties / reportingLevel / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / estimates / items / properties / welfareType / descriptionPrevious value: -"Whether the underlying survey measures income or consumption. The two are not directly comparable across economies."New value: +"Whether the underlying survey measures income or consumption. The two are not directly comparable across economies. Null on an aggregate row, which spans both." - changed
Output schema / properties / estimates / items / properties / welfareType / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / estimates / items / requiredPrevious value: -[ - "countryCode", - "countryName", - "regionCode", - "regionName", - "reportingYear", - "reportingLevel", - "welfareType", - "povertyLine", - "headcount", - "povertyGap", - "povertySeverity", - "watts", - "mean", - "median", - "gini", - "mld", - "polarization", - "decileShares", - "population", - "surveyYear", - "surveyAcronym", - "surveyComparability", - "comparableSpell", - "estimationType", - "isInterpolated" -]New value: +[ + "countryCode", + "countryName", + "regionCode", + "regionName", + "reportingYear", + "reportingLevel", + "welfareType", + "povertyLine", + "headcount", + "povertyGap", + "povertySeverity", + "watts", + "mean", + "median", + "gini", + "mld", + "polarization", + "decileShares", + "population", + "popInPoverty", + "surveyYear", + "surveyAcronym", + "surveyComparability", + "comparableSpell", + "estimationType", + "isInterpolated", + "isAggregate" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty result set, for a page past the end of the results, for a page size reduced to the page cap, or for a result carrying gap-filled rows with no inequality data."New value: +"Context for an empty result set, for a page past the end of the results, for a page size reduced to the page cap, for a result carrying gap-filled or aggregate rows with no inequality data, and for economies fill_gaps false left out."
- Changed
worldbank_search_projects1 field changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry is not a two-character code — most often an ISO3 code such as BRA, which the Projects API does not key on. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry is not a two-character code — most often an ISO3 code such as BRA, which the Projects API does not key on. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page: a 4xx when it refuses the query text, a 5xx or an error page when it cannot serve the search. Other values are possible when a failure originates below the handler."
1 tool update
- Changed
worldbank_get_data10 fields changed- added
Input schema / properties / dimension_valueAdded 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" +} - changed
Input schema / properties / mrv / descriptionPrevious 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." - added
Output schema / properties / appliedFilters / properties / dimensionValueAdded value: +{ + "description": "dimension_value as requested, omitted when none was given.", + "type": "string" +} - changed
Output schema / properties / data / items / descriptionPrevious value: -"A single country×year observation."New value: +"A single country×period observation." - changed
Output schema / properties / data / items / properties / date / descriptionPrevious value: -"Year of observation (YYYY format)."New value: +"Period of observation: a year (2020), quarter (2020Q1), or month (2020M03)." - added
Output schema / properties / data / items / properties / dimensionAdded 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" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +] - changed
Output schema / properties / notice / descriptionPrevious 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." - added
Output schema / properties / sourceScopedAdded 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 tool updates
- Changed
worldbank_get_data5 fields changed- changed
Input schema / properties / date_range / descriptionPrevious 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." - changed
Output schema / properties / currentPage / descriptionPrevious value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +] - changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
worldbank_get_poverty15 fields changed- changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to a few thousand rows."New value: +"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to several thousand rows. One page holds at most 70 estimates, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap, disclosed in notice, and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size." - changed
Input schema / properties / poverty_line / descriptionPrevious value: -"Poverty line in PPP dollars per person per day — any threshold, not only the published ones. Omitted uses the international poverty line of the PIP release currently served, so the applied value is echoed back on every row as povertyLine rather than assumed here. The poverty line does not affect the inequality fields, which describe the whole distribution."New value: +"Poverty line in PPP dollars per person per day, at the applied PPP vintage — any threshold, not only the published ones. Omitted uses the international poverty line for that vintage, so the applied value is echoed back on every row as povertyLine rather than assumed here. The poverty line does not affect the inequality fields, which describe the whole distribution." - added
Input schema / properties / ppp_versionAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "A PPP vintage year.", + "pattern": "^\\d{4}$", + "type": "string" + } + ], + "description": "PPP vintage to express every dollar figure in — the poverty line, mean, and median — as a four-digit year (\"2021\", \"2017\"). It must be one of the vintages PIP's current data release is published at; any other value fails with the available vintages named. Omitted uses the newest vintage of that release. The vintage and release applied are echoed as appliedFilters.pppVersion and appliedFilters.releaseVersion." +} - changed
Output schema / properties / appliedFilters / properties / perPage / descriptionPrevious 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." - added
Output schema / properties / appliedFilters / properties / pppVersionAdded value: +{ + "description": "PPP vintage every dollar figure in these estimates is expressed in, whether requested or resolved as the newest vintage of the release.", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / releaseVersionAdded value: +{ + "description": "PIP data release the estimates come from, as its YYYYMMDD stamp — the newest release PIP lists. Survey and gap-filled rows share it.", + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / requestedPerPageAdded value: +{ + "description": "Page size asked for, requested or server default, present only when it exceeded the page cap and perPage was reduced.", + "type": "number" +} - changed
Output schema / properties / appliedFilters / requiredPrevious value: -[ - "countries", - "fillGaps", - "page", - "perPage" -]New value: +[ + "countries", + "pppVersion", + "releaseVersion", + "fillGaps", + "page", + "perPage" +] - changed
Output schema / properties / currentPage / descriptionPrevious value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: PIP does not recognize one or more of the country codes. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `upstream_unavailable`: PIP answered with a server error, which an aggregate country code also produces. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: PIP does not recognize one or more of the country codes. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, which an aggregate country code also produces. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "country_not_found", - "invalid_parameter", - "upstream_unavailable" -]New value: +[ + "country_not_found", + "invalid_parameter", + "ppp_version_unavailable", + "upstream_unavailable" +] - added
Output schema / properties / estimates / items / properties / comparableSpellAdded value: +{ + "description": "The span of years the comparable series behind this row covers, as PIP labels it (\"2022\", \"2011 - 2022\"). Null on gap-filled rows.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / estimates / items / properties / surveyComparabilityAdded value: +{ + "description": "PIP's series comparability code within the economy: 0 is its oldest comparable series and the code steps up each time comparability breaks, so two survey rows of one economy compare over time only when they share it. Null on gap-filled rows.", + "type": [ + "number", + "null" + ] +} - changed
Output schema / properties / estimates / items / requiredPrevious value: -[ - "countryCode", - "countryName", - "regionCode", - "regionName", - "reportingYear", - "reportingLevel", - "welfareType", - "povertyLine", - "headcount", - "povertyGap", - "povertySeverity", - "watts", - "mean", - "median", - "gini", - "mld", - "polarization", - "decileShares", - "population", - "surveyYear", - "surveyAcronym", - "estimationType", - "isInterpolated" -]New value: +[ + "countryCode", + "countryName", + "regionCode", + "regionName", + "reportingYear", + "reportingLevel", + "welfareType", + "povertyLine", + "headcount", + "povertyGap", + "povertySeverity", + "watts", + "mean", + "median", + "gini", + "mld", + "polarization", + "decileShares", + "population", + "surveyYear", + "surveyAcronym", + "surveyComparability", + "comparableSpell", + "estimationType", + "isInterpolated" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty result set, or for a result carrying gap-filled rows with no inequality data."New value: +"Context for an empty result set, for a page past the end of the results, for a page size reduced to the page cap, or for a result carrying gap-filled rows with no inequality data."
- Changed
worldbank_list_countries2 fields changed- changed
Output schema / properties / currentPage / descriptionPrevious value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end." - added
Output schema / properties / noticeAdded value: +{ + "description": "Context for an empty page: which filters matched nothing, or the page range that exists when the requested page is past the end.", + "type": "string" +}
- Changed
worldbank_list_sources2 fields changed- changed
Output schema / properties / currentPage / descriptionPrevious value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end." - added
Output schema / properties / noticeAdded value: +{ + "description": "Context for an empty page: the page range that exists when the requested page is past the end.", + "type": "string" +}
- Changed
worldbank_search_projects10 fields changed- changed
Input schema / properties / approved_from / descriptionPrevious value: -"Earliest board approval date, as YYYY-MM-DD and inclusive. Board approval is the date the Bank committed to the operation; pipeline projects carry a scheduled date in the future."New value: +"Earliest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day (2024-02-29, not 2023-02-29) and, when approved_to is also set, on or before it. Board approval is the date the Bank committed to the operation; pipeline projects carry a scheduled date in the future." - changed
Input schema / properties / approved_to / descriptionPrevious value: -"Latest board approval date, as YYYY-MM-DD and inclusive."New value: +"Latest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day." - changed
Input schema / properties / include_abstract / descriptionPrevious value: -"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters — so a full page of them roughly doubles the response; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes."New value: +"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, with every abstract returned whole; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (default: server default, max: 1000, which is also the most the API will return for one request)."New value: +"Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap, disclosed in notice, and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size." - changed
Output schema / properties / appliedFilters / properties / perPage / descriptionPrevious 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." - added
Output schema / properties / appliedFilters / properties / requestedPerPageAdded value: +{ + "description": "Page size asked for, requested or server default, present only when it exceeded the page cap and perPage was reduced.", + "type": "number" +} - changed
Output schema / properties / currentPage / descriptionPrevious value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry is not a two-character code — most often an ISO3 code such as BRA, which the Projects API does not key on. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "page_out_of_range", - "upstream_unavailable" -]New value: +[ + "invalid_country_code", + "invalid_date", + "reversed_date_range", + "page_out_of_range", + "upstream_unavailable" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Context for an empty result set — including whether the country filter matched anything on its own — or for a page past the end of the results."New value: +"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the page cap."
4 tool updates
- Changed
worldbank_get_country5 fields changed- changed
Input schema / properties / country_code / descriptionPrevious value: -"Country code. Accepts ISO2 (US), ISO3 (USA), or aggregate code (EAS, HIC, WLD). Use worldbank_list_countries to browse valid codes."New value: +"One country code. Accepts ISO2 (US), ISO3 (USA), or aggregate code (EAS, HIC, WLD) — not \"all\" or a list of codes. Use worldbank_list_countries to browse valid codes." - removed
Input schema / properties / country_code / minLengthRemoved value: -1 - added
Input schema / properties / country_code / patternAdded value: +"^[A-Za-z0-9]{2,3}$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: The country code does not exist in the World Bank API. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: The country code does not exist in the World Bank API. `multiple_countries`: The code is \"all\", or another selector the World Bank resolves to more than one country. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "country_not_found" -]New value: +[ + "country_not_found", + "multiple_countries" +]
- Changed
worldbank_get_data5 fields changed- changed
Input schema / properties / indicator_id / descriptionPrevious 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." - removed
Input schema / properties / indicator_id / minLengthRemoved value: -1 - added
Input schema / properties / indicator_id / patternAdded value: +"^[A-Za-z0-9._-]+$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +]
- Changed
worldbank_get_indicator5 fields changed- changed
Input schema / properties / indicator_id / descriptionPrevious value: -"Indicator code (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL). Use worldbank_search_indicators to find valid IDs."New value: +"One indicator code (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL) — not \"all\" or a list of codes. Use worldbank_search_indicators to find valid IDs." - removed
Input schema / properties / indicator_id / minLengthRemoved value: -1 - added
Input schema / properties / indicator_id / patternAdded value: +"^[A-Za-z0-9._-]+$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `indicator_not_found`: The indicator ID does not exist in the World Bank API. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `indicator_not_found`: The indicator ID does not exist in the World Bank API. `multiple_indicators`: The ID is \"all\", or another selector the World Bank resolves to more than one indicator. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "indicator_not_found" -]New value: +[ + "indicator_not_found", + "multiple_indicators" +]
- Changed
worldbank_search_indicators5 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored. At least one of query, topic_id, or source_id must be provided."New value: +"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored, so the query needs at least one letter or digit. At least one of query, topic_id, or source_id must be provided." - added
Input schema / properties / source_id / patternAdded value: +"^\\s*\\d*\\s*$" - added
Input schema / properties / topic_id / patternAdded value: +"^\\s*\\d*\\s*$" - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. `empty_query`: The query contains no letters or digits once punctuation is ignored. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "missing_filter", - "invalid_filter" -]New value: +[ + "missing_filter", + "invalid_filter", + "empty_query" +]
3 tool updates
- Changed
worldbank_get_data7 fields changed- changed
Input schema / properties / countries / anyOfPrevious 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" + } +] - changed
Input schema / properties / countries / descriptionPrevious 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\"." - changed
Output schema / properties / appliedFilters / properties / countries / descriptionPrevious 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." - removed
Output schema / properties / data / items / properties / value / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / value / typeAdded value: +[ + "number", + "null" +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious 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" +]
- Changed
worldbank_get_poverty22 fields changed- removed
Output schema / properties / estimates / items / properties / gini / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / gini / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / headcount / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / headcount / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / mean / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / mean / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / median / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / median / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / mld / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / mld / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / polarization / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / polarization / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / population / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / population / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / povertyGap / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / povertyGap / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / povertySeverity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / povertySeverity / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / surveyYear / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / surveyYear / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / estimates / items / properties / watts / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / estimates / items / properties / watts / typeAdded value: +[ + "number", + "null" +]
- Changed
worldbank_search_projects8 fields changed- removed
Output schema / properties / projects / items / properties / abstract / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / projects / items / properties / abstract / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / projects / items / properties / boardApprovalDate / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / projects / items / properties / boardApprovalDate / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / projects / items / properties / closingDate / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / projects / items / properties / closingDate / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / projects / items / properties / totalCommitment / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / projects / items / properties / totalCommitment / typeAdded value: +[ + "number", + "null" +]
9 tool updates
- Changed
worldbank_get_country6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "iso2", + "name", + "region", + "incomeLevel", + "lendingType", + "capitalCity", + "longitude", + "latitude", + "isAggregate" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `country_not_found`: The country code does not exist in the World Bank API. Other values are possible when a failure originates below the handler.", + "examples": [ + "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" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "iso2", - "name", - "region", - "incomeLevel", - "lendingType", - "capitalCity", - "longitude", - "latitude", - "isAggregate" -]
- Changed
worldbank_get_data6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "data", + "indicator", + "nullCount", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "data", - "indicator", - "nullCount", - "appliedFilters", - "totalCount", - "currentPage", - "totalPages" -]
- Changed
worldbank_get_indicator6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "name", + "unit", + "sourceId", + "sourceName", + "sourceNote", + "sourceOrganization", + "topics" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `indicator_not_found`: The indicator ID does not exist in the World Bank API. Other values are possible when a failure originates below the handler.", + "examples": [ + "indicator_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" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "name", - "unit", - "sourceId", - "sourceName", - "sourceNote", - "sourceOrganization", - "topics" -]
- Changed
worldbank_get_poverty6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "estimates", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `country_not_found`: PIP does not recognize one or more of the country codes. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `upstream_unavailable`: PIP answered with a server error, which an aggregate country code also produces. Other values are possible when a failure originates below the handler.", + "examples": [ + "country_not_found", + "invalid_parameter", + "upstream_unavailable" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "estimates", - "appliedFilters", - "totalCount", - "currentPage", - "totalPages" -]
- Changed
worldbank_list_countries6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "countries", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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_filter`: An invalid region or income_level code was provided. Other values are possible when a failure originates below the handler.", + "examples": [ + "invalid_filter" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "countries", - "totalCount", - "currentPage", - "totalPages" -]
- Changed
worldbank_list_sources6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "sources", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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.", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "sources", - "totalCount", - "currentPage", - "totalPages" -]
- Changed
worldbank_list_topics6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "topics" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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.", + "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" +} - removed
Output schema / requiredRemoved value: -[ - "topics" -]
- Changed
worldbank_search_indicators6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "indicators", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `missing_filter`: None of query, topic_id, or source_id were provided. `invalid_filter`: The topic_id or source_id does not exist upstream. Other values are possible when a failure originates below the handler.", + "examples": [ + "missing_filter", + "invalid_filter" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "indicators", - "appliedFilters", - "totalCount", - "currentPage", - "totalPages" -]
- Changed
worldbank_search_projects6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "projects", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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: `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status or an HTML error page. Other values are possible when a failure originates below the handler.", + "examples": [ + "page_out_of_range", + "upstream_unavailable" + ], + "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" +} - removed
Output schema / requiredRemoved value: -[ - "projects", - "appliedFilters", - "totalCount", - "currentPage", - "totalPages" -]
1 tool update
- Added
worldbank_search_projects
1 tool update
- Added
worldbank_get_poverty
2 tool updates
- Changed
worldbank_get_data2 fields changed- added
Output schema / properties / appliedFiltersAdded 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" +} - changed
Output schema / requiredPrevious value: -[ - "data", - "indicator", - "nullCount", - "totalCount", - "currentPage", - "totalPages" -]New value: +[ + "data", + "indicator", + "nullCount", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" +]
- Changed
worldbank_search_indicators2 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "The effective search parameters, field by field — confirms which filter combination produced these results without parsing the effectiveQuery string.", + "properties": { + "query": { + "description": "Trimmed keyword query sent to the search, omitted when none was given.", + "type": "string" + }, + "sourceId": { + "description": "Source ID the results were scoped to, omitted when none was given.", + "type": "string" + }, + "topicId": { + "description": "Topic ID the results were scoped to, omitted when none was given.", + "type": "string" + } + }, + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "indicators", - "totalCount", - "currentPage", - "totalPages" -]New value: +[ + "indicators", + "appliedFilters", + "totalCount", + "currentPage", + "totalPages" +]
1 tool update
- Changed
worldbank_get_data6 fields changed- changed
Input schema / properties / countries / anyOfPrevious 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" + } +] - changed
Input schema / properties / countries / descriptionPrevious 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\"." - changed
Input schema / properties / date_range / descriptionPrevious 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." - added
Input schema / properties / date_range / patternAdded 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*$" - changed
Input schema / properties / mrv / descriptionPrevious 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." - changed
Input schema / properties / mrv / maximumPrevious value: -10New value: +100
1 tool update
- Changed
worldbank_search_indicators1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Keyword search terms. At least one of query, topic_id, or source_id must be provided."New value: +"Keyword search terms — an indicator name, ID, or any words from either (e.g. \"GDP per capita\", \"NY.GDP.MKTP.CD\", \"CO2 emissions\"). Every term must match; punctuation is ignored. At least one of query, topic_id, or source_id must be provided."
Related MCP Connectors
Access World Bank development indicators for 200+ countries.
World Bank World Development Indicators: curated country-year economy, health, education and more.
330+ indicators for 217 countries from the IMF, World Bank, WHO and national statistics offices.
Official World Bank macro indicators (GDP, inflation...) by country. $0.005/call via x402.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides query capabilities for global economic and social development data from the World Bank Open Data API.536 npm8MIT
- AlicenseAqualityDmaintenanceEnables access to World Bank Data360 API with 1000+ economic and social indicators across 200+ countries and 60+ years of historical data, allowing searches, temporal coverage checks, and filtered data retrieval through natural language queries.51MIT

Data360 MCP Serverofficial
FlicenseNot gradedqualityAmaintenanceProvides LLM agents direct access to World Bank development indicators, enabling search, validation, and retrieval of data on topics like GDP, poverty, and gender equality.43-- AlicenseAqualityDmaintenanceProvides access to World Bank economic and country data without an API key, allowing users to search countries, fetch indicator time series, and compare latest values.5MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.