worldbank-mcp-server
Server Details
Query 29,500+ World Bank development indicators for 200+ countries across 60+ years.
- Status
- Healthy
- Uptime
- 100.0% over 40 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/worldbank-mcp-server
- GitHub Stars
- 3
- Server Listing
- worldbank-mcp-server
TDQS
Scored across 9 tools
Each tool targets a distinct resource and action: countries (get vs list), indicators (get vs search), data (WDI vs poverty), and separate list tools for sources and topics. Descriptions explicitly differentiate overlapping areas like get_data vs get_poverty.
All tools follow a consistent worldbank_<verb>_<noun> pattern with lowercase snake_case, using verbs get, list, and search predictably. No mixing of styles or vague verbs.
9 tools is well-scoped for a World Bank data server: browsing metadata, searching catalogs, and retrieving specific items. Each tool earns its place without redundancy.
The surface covers the full read-only lifecycle: list, search, and get for countries, indicators, data, and projects, plus dedicated tools for sources and topics. No obvious gaps for the stated purpose of accessing World Bank statistics and operations.
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 200 per page, since the API returns several hundred entries per indicator. Indicators the standard data endpoint does not serve — WDI Database Archives, PEFA, ICP, GDLD, International Debt Statistics: DSSI, Food Prices for Nutrition — are answered from their own dataset instead; the response then carries sourceScoped, naming that dataset and the release, classification, sector, or counterpart area applied (see dimension_value), because those values can be archived or superseded figures rather than current ones.
| 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, 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. | |
| 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. | |
| 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. |
| 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 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. |
| 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?
The description goes far beyond the readOnly/openWorld/idempotent annotations by disclosing null-value behavior for sparse series, the exact semantics and mutual exclusivity of mrv/mrnev/date_range, frequency selection for quarterly/monthly series, the lastUpdated vintage, pagination consequences, and the sourceScoped mechanism for specially served datasets. These details are not derivable from the annotations or schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads the core purpose and primary sibling in the first sentence, then moves through behavior, parameter selection, frequency, vintage, pagination, and special datasets in a logical order. Despite its length, each clause adds necessary operational detail for a complex 9-parameter tool, so the density is justified rather than padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of an output schema, and rich schema/annotation coverage, the description covers all relevant operational concerns: sparse data, parameter mutual exclusivity, frequency handling, pagination caps, dataset-scoped responses, and how to find valid indicator IDs. No critical calling context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already documents every parameter at 100% coverage, the description adds a layer of meaning: it summarizes the core selection mode ('Set at most one of date_range, mrv, or mrnev'), explains what each mode means for the returned rows, and ties frequency and pagination behavior to real API semantics. This materially helps an agent choose the correct argument combination without reading the full schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Query World Bank indicator values for one or more countries across a time range — the primary data-access tool', which names a specific verb and resource, and immediately distinguishes the tool from worldbank_search_indicators by telling the agent to use that sibling for finding indicator_id values. The purpose is unmistakable even among eight sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly positions the tool as 'the primary data-access tool' and directs the agent to 'find indicator_id values with worldbank_search_indicators', establishing when to use it and when to use a sibling instead. It also gives concrete usage guidance for pagination on 'all' countries and mutual exclusivity among date_range, mrv, and mrnev.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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, and lending 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. 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, 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. | |
| 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); 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. | |
| 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 read-only and idempotent behavior, but the description adds substantial transparency: estimationType variants, null inequality fields for gap-filled rows, aggregate row behavior, PPP vintage selection, pagination reduction, and documented gaps in source data. There is no contradiction with 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?
Core purpose and return values are front-loaded, and each subsequent sentence contributes new operational or data-quality information. The length is justified by the tool's complexity; no filler or redundant restatement of the schema is present.
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 nine-parameter tool with output schema, the description covers edge cases that would otherwise be opaque: survey versus filled estimates, aggregate projections, unsupported aggregate IDs, PPP vintage errors, and pagination limits. The definition is complete enough for correct selection and use.
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?
Though the schema already covers all parameters, the description adds crucial semantic detail: valid aggregate codes, rejected codes like IDA and SSA, welfare_type behavior when economies publish both measures, MRV resolution under fill_gaps, and per_page cap reduction. This materially improves correct invocation.
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 names the exact dataset (World Bank Poverty and Inequality Platform), the resources it queries (economies and PIP aggregates), and the data returned. It also clearly distinguishes this tool from the sibling worldbank_get_data by identifying PIP as a separate dataset from the WDI series.
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?
The description explicitly says to use this tool for inequality and distribution questions and clarifies when worldbank_get_data is the different alternative. This gives an agent concrete guidance for selecting among the sibling tools.
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, 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. | |
| 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, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds valuable behavior: filters combine by AND, aggregates are excluded by default, and include_aggregates changes the result set. These are behaviors not in the annotations and are useful for correct invocation.
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 two sentences, front-loaded with purpose, then filters, then the default behavior. No filler or repetition. Every sentence adds new information, and the structure is efficient.
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 listing tool with 6 optional parameters, the description explains filtering semantics, default behavior, and the effect of include_aggregates. Since an output schema is present, return values need not be described. The description covers all key behavioral aspects needed for correct invocation.
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 input schema has 100% description coverage, so the baseline is 3. The description adds the AND combination logic and the default exclusion of aggregates, which are not in the schema. It also clarifies the lending_type mapping to codes, though the schema already lists those. This extra context lifts it 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?
The description clearly states the tool lists countries and regional aggregates with specific metadata fields (ISO codes, region, income level, etc.), and the verb 'List' distinguishes it from sibling tools like worldbank_get_country or worldbank_get_data. It is specific about what resource it returns and the scope.
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?
The description implies when to use it (to list countries vs. fetching a single country or data series) but does not explicitly name alternatives or state when not to use it. The guidance is implicit from the verb and resource, but there is no explicit routing to siblings.
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, 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, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds genuine behavioral context beyond that: the result set is bounded at 70+ sources and retrieval is paginated ('one page at a time'), which tells the agent to expect multiple 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 what is listed and followed by the downstream purpose. Every clause carries information; nothing is redundant.
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?
Covers scope (70+ sources), examples, downstream usage of the returned IDs, and pagination behavior, and an output schema exists so return values need no further explanation. 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 description coverage is 100%, so page and per_page are already fully documented in the schema. The description only alludes to pagination generically ('one page at a time') and adds no format or constraint detail beyond the schema, so baseline 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?
States a specific verb and resource ('List the 70+ World Bank data sources (datasets)') and grounds it with concrete examples (WDI, IDS, Doing Business). It also distinguishes itself from siblings by naming worldbank_search_indicators as the consumer of the returned source IDs.
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 clear context: use this to obtain source IDs that feed worldbank_search_indicators, and it operates one page at a time. It does not state when NOT to use it (e.g., versus worldbank_list_topics or list_countries), so it stops short of full exclusion guidance.
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, financing window (IBRD, IDA, Grants, Other), and board approval date. 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. | |
| 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, 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. | |
| 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 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. |
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, for a page size reduced to the page cap, or naming the projects whose abstracts were cut. |
| 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?
The annotations declare readOnlyHint, openWorldHint, and idempotentHint, but the description adds significant behavioral context beyond these: it explains the exact-match nature of filters, the AND combination, the possibility of empty results and how to interpret them, pagination behavior, and the fact that most of the portfolio is closed. This is exemplary transparency for a tool with complex filtering semantics. No contradiction with 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 lengthy and dense, but every sentence carries critical information that an agent needs for correct invocation. It is front-loaded with the core purpose and ends with filter semantics. Slightly overlong for some contexts, but the density is justified for a tool with this many nuanced behaviors.
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?
Given the tool's complexity (10 optional parameters, exact-match semantics, and output schema), the description covers all essential aspects: what it returns, how filters combine, edge cases like empty results and legacy country codes, pagination behavior, and performance implications. No gaps that would prevent an agent from using 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?
Despite 100% schema coverage, the description adds substantial meaning to every parameter: it explains the special country code handling (legacy codes like RY, ZR, GZ, TP), the rejection of WDI aggregates, the implications of the financial_type window (including the 36% of operations with no window), and the performance trade-offs of include_abstract. This goes far beyond the schema's basic descriptions.
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 defines a specific verb ('Search') and resource ('World Bank lending portfolio'), and explicitly distinguishes this from the statistics catalogue via sibling names. It clearly states what it returns (project ID, name, country, region, status, dates, amounts, sectors, link) and gives concrete example queries, making it easy for an agent to understand its purpose and scope.
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 when to use this tool (e.g., 'what is the World Bank funding in Kenya') and when not to, naming alternatives (worldbank_search_indicators, worldbank_get_data) for development statistics. It also provides critical usage constraints such as exact-match filtering, AND combination of filters, and rejection of WDI aggregates, guiding the agent to choose correctly.
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.
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.
490+ economic & demographic indicators for 218 countries from IMF, World Bank, UN, FRED.
Macro indicators from World Bank, FRED, IMF, and OECD via unified query surface.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides query capabilities for global economic and social development data from the World Bank Open Data API.336 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 gradedqualityCmaintenanceProvides LLM agents direct access to World Bank development indicators, enabling search, validation, and retrieval of data on topics like GDP, poverty, and gender equality.40-- AlicenseAqualityCmaintenanceProvides 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.