Skip to main content
Glama

Server Details

Query 29,500+ World Bank development indicators for 200+ countries across 60+ years.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 80 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/worldbank-mcp-server
GitHub Stars
3
Server Listing
worldbank-mcp-server
ChatGPT
–
Claude
–

TDQS

A4.5/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct resource and action: single-entity metadata (get_country, get_indicator), filtered browsing (list_countries, list_sources, list_topics), catalog search (search_indicators, search_projects), and data retrieval (get_data, get_poverty). The descriptions explicitly cross-reference each other, e.g. get_country points to list_countries for valid codes, and get_data is distinguished from get_poverty as a separate dataset with different semantics. No two tools read as interchangeable.

Naming Consistency5/5

Every tool follows the same worldbank_ prefix plus a consistent verb_noun pattern (get_country, list_sources, search_indicators). Verbs are used semantically consistently: get for a single identified entity, list for paged enumeration, search for query-driven lookup. No casing or style deviations.

Tool Count5/5

Nine tools is well within the ideal range and each one covers a distinct access pattern (browse the three catalogs, search the two catalogs, fetch three data families). Nothing looks like a redundant wrapper or an internal detail leaked as a tool.

Completeness4/5

The surface covers the core lifecycle well: discover countries/sources/topics, search indicators, fetch indicator and country metadata, pull indicator series and poverty data, and query the lending portfolio. Minor gaps remain — there is no way to fetch a single project by ID (only search_projects), and no direct listing of indicators within a source/topic without search, but agents can work around both.

Available Tools

9 tools
worldbank_get_countryGet World Bank CountryA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
country_codeYesOne 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

NameRequiredDescription
idNoCountry or aggregate ID.
iso2NoISO2 country code.
nameNoCountry or aggregate name.
errorNoPresent when the call failed. Absent on success.
regionNoWorld Bank region this country belongs to.
latitudeNoCapital latitude (empty for aggregates).
longitudeNoCapital longitude (empty for aggregates).
capitalCityNoCapital city name (empty for aggregates).
incomeLevelNoWorld Bank income classification.
isAggregateNoTrue when this entry is a regional or income-group aggregate.
lendingTypeNoWorld Bank lending type classification.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return values need not be explained, 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DataA
Read-onlyIdempotent
Inspect

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

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

Output Schema

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

TDQS

A4.4/5.0
Behavior3/5

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

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

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

Conciseness4/5

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

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

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

Completeness5/5

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

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

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

Parameters4/5

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

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

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

Purpose5/5

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

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

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

Usage Guidelines5/5

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

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

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

worldbank_get_indicatorGet World Bank IndicatorA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
indicator_idYesOne 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

NameRequiredDescription
idNoIndicator ID.
nameNoIndicator name.
unitNoUnit of measurement (empty when not specified).
errorNoPresent when the call failed. Absent on success.
topicsNoThematic topics this indicator belongs to.
sourceIdNoSource dataset ID.
sourceNameNoSource dataset name.
sourceNoteNoDetailed indicator description from the source.
sourceOrganizationNoOrganization that collects or publishes this data.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 EstimatesA
Read-onlyIdempotent
Inspect

Query poverty and inequality estimates from the World Bank Poverty and Inequality Platform (PIP) for economies and for PIP's own aggregates — World, World Bank regions, income groups, lending groups, and fragility groups. Returns the poverty headcount ratio, poverty gap, and poverty severity at any poverty line, plus mean and median welfare and population. Use it for inequality and distribution questions too — survey-based economy rows carry the Gini coefficient, mean log deviation, polarization, and the ten decile income/consumption shares, because PIP returns poverty and inequality in the same row. PIP is a separate dataset from the WDI series worldbank_get_data reads: it measures welfare in PPP dollars per person per day, at a PPP vintage ppp_version selects, and computes its aggregates at any poverty line, where worldbank_get_data carries only the published lines. Every row reports how it was produced. Nullable estimateType separately identifies actual, nowcast, or projection estimates, while distributionType preserves the source distribution classification (micro, group, or imputed); missing upstream classifications remain null. On an economy, estimationType "survey" rows carry the full inequality block; "interpolation", "extrapolation", and "CMD estimation" rows are gap-filled estimates for years no survey covers, and their gini, mld, polarization, and decileShares are null — a documented gap in the source data, not an error. Aggregate rows (isAggregate true) are "actual", "nowcast", or "projection", add popInPoverty, and carry no distributional block.

NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
yearNoReporting 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_pageNoResults per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size.
countriesYesCountry codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); "all" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); the fragility groups FCVY (fragile) and FCVN (not fragile); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. FCS is rejected: use PIP's FCVY for its fragile group, whose membership is not asserted to match WDI's FCS. Other aggregate codes (SSA, EAP, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate.
fill_gapsNoWhen 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_versionNoPPP 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_lineNoPoverty 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_typeNoRestrict 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_levelNoRestrict 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

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoContext 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.
estimatesNoPoverty and inequality estimates for this page — economies and aggregates in one list, ordered by code, year, reporting level, then welfare type.
totalCountNoTotal estimates before pagination.
totalPagesNoTotal number of pages.
currentPageNoPage number requested — past totalPages when the request ran off the end.
appliedFiltersNoThe effective parameters sent to PIP — confirms country code normalization and which filters were in force for these estimates.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent, so the bar is lower, but the description discloses a great deal more: nullable estimateType and distributionType, that interpolation/extrapolation/CMD rows have null gini, mld, polarization and decileShares as a documented source gap rather than an error, and that aggregate rows are actual/nowcast/projection with popInPoverty and no distributional block. This is exactly the failure-mode context an agent needs to avoid misreading nulls as tool errors.

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

Conciseness4/5

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

Purpose and scope are front-loaded and every sentence carries substantive content about row provenance or nullability. It is nonetheless a dense two-paragraph block, and some material (MRV resolution under fill_gaps, aggregate code rejection) restates what the parameter schema already says, which costs a little economy.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description instead covers the interpretive layer: row production method, null semantics, and aggregate vs economy row shape. For a 9-parameter read-only query tool this is enough for an agent to call it and interpret the results correctly.

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

Parameters3/5

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

Schema coverage is 100% with detailed per-parameter descriptions, so the schema already carries the semantics and a 3 is the baseline. The description reinforces a few interactions (ppp_version selecting the vintage of every dollar figure, poverty_line not affecting inequality fields, welfare_type/reporting_level producing extra rows) but adds no syntax or value information absent from the schema.

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

Purpose5/5

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

The first sentence gives a specific verb and resource ('Query poverty and inequality estimates from the World Bank Poverty and Inequality Platform') and enumerates the entity types covered (economies plus PIP aggregates). It explicitly contrasts with the sibling worldbank_get_data ('PIP is a separate dataset from the WDI series worldbank_get_data reads'), so an agent can dispatch without opening either schema.

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

Usage Guidelines4/5

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

It states a positive use case beyond the obvious ('Use it for inequality and distribution questions too') and routes WDI-series requests to worldbank_get_data, with the distinguishing criterion being PPP-dollar welfare measurement and computable aggregates at any poverty line. What is missing is an explicit when-not-to-use statement for the other siblings (indicator, country, projects), and the routing sentence sits mid-paragraph rather than up front.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

worldbank_list_countriesList World Bank CountriesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
regionNoFilter 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_pageNoResults per page (default: server default). Positive integers above 300 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size.
source_idNoSelect a source-specific entity listing. Entries carry canonical id, name and sourceId only; global classification filters and include_aggregates=true are unavailable. Default false keeps all source entities.
income_levelNoFilter by income group code: LIC (Low income), LMC (Lower middle income), UMC (Upper middle income), HIC (High income).
lending_typeNoFilter 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_aggregatesNoWhen 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

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoContext 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.
countriesNoCountries (and optionally aggregates) matching the filters.
totalCountNoTotal matching entries before pagination (includes aggregates if include_aggregates=true).
totalPagesNoTotal number of pages.
currentPageNoPage number requested — past totalPages when the request ran off the end.
appliedFiltersNoThe effective listing parameters — which filters were in force and the page size served.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuine behavioral context beyond that: aggregates are dropped by default, filters combine as AND, and include_aggregates changes scope. It doesn't describe pagination or response shape, but the output schema and per_page parameter cover those.

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

Conciseness5/5

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

Three dense sentences, front-loaded with the resource and metadata, then filters, then the aggregate default. Every clause carries information and nothing is restated from the title.

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

Completeness4/5

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

With 7 optional parameters, full schema coverage, rich annotations, and an output schema, the description supplies what's needed to call the tool correctly. It could mention pagination behavior or the source_id trade-off, but the schema already documents both, so the gap is minor.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description still earns credit by giving example codes (EAS, SSF, NAC; LIC–HIC; IDX/IBD/IDB) and the AND-combination semantics that the schema documents per-parameter but doesn't state jointly.

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

Purpose5/5

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

The description opens with a specific verb and resource ("List countries and regional aggregates") and enumerates the returned metadata (ISO codes, region, income level, lending type, capital, coordinates). An agent can distinguish this from worldbank_get_country, which returns a single country, without opening either schema.

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

Usage Guidelines4/5

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

It states how the three filters combine ("filters combine by AND") and clarifies the default exclusion of aggregate entities, which is real selection guidance. It stops short of explicitly naming when to use this instead of worldbank_get_country, leaving that inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

worldbank_list_sourcesList World Bank Data SourcesA
Read-onlyIdempotent
Inspect

List the 70+ World Bank data sources (datasets), such as World Development Indicators, International Debt Statistics, and Doing Business. Returns source IDs and names for use as source_id in worldbank_search_indicators, worldbank_get_data, and worldbank_list_countries, one page at a time.

NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
per_pageNoResults per page (default: server default, max: 100).

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoContext for an empty page: the page range that exists when the requested page is past the end.
sourcesNoWorld Bank data sources for this page.
totalCountNoTotal number of sources.
totalPagesNoTotal number of pages.
currentPageNoPage number requested — past totalPages when the request ran off the end.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds value beyond them by disclosing pagination behavior ("one page at a time") and the shape of the payload (IDs and names), which an agent needs to plan sequential calls.

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

Conciseness5/5

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

Two sentences, front-loaded with purpose and examples, then the return value and downstream use. No filler, and the most decision-relevant facts come first.

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

Completeness5/5

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

For a simple zero-required-parameter read/list tool with an output schema and full annotation coverage, the definition supplies everything needed: what it lists, what it returns, and where the IDs are used. Return-format details are correctly left to the output schema.

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

Parameters3/5

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

Schema description coverage is 100%, so page and per_page are already fully documented in the schema, including the 1-based and max-100 constraints. The description's "one page at a time" confirms pagination exists but adds no semantics beyond what the schema states, so the baseline of 3 applies.

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

Purpose5/5

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

The description states a specific verb and resource ("List the 70+ World Bank data sources (datasets)") and anchors it with named examples (World Development Indicators, International Debt Statistics, Doing Business). It also states what the tool returns (source IDs and names), which makes it unambiguously distinguishable from siblings like worldbank_list_topics or worldbank_list_countries.

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

Usage Guidelines4/5

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

It gives clear usage context by naming exactly where the returned source IDs are consumed (worldbank_search_indicators, worldbank_get_data, worldbank_list_countries), which implicitly tells an agent to call this before those. It stops short of explicit exclusions, e.g. it doesn't say when to prefer worldbank_list_topics or worldbank_list_countries instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

worldbank_list_topicsList World Bank TopicsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
topicsNoAll 21 World Bank thematic topics.

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 IndicatorsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
queryNoKeyword 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_pageNoResults per page (default: server default, max: 100).
topic_idNoFilter by topic ID (e.g. "1" for Agriculture, "3" for Economy & Growth). Use worldbank_list_topics to browse valid IDs.
source_idNoFilter by data source ID (e.g. "2" for World Development Indicators). Use worldbank_list_sources to browse valid IDs.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoRecovery 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.
indicatorsNoMatching indicators for this page.
totalCountNoTotal matching indicators before pagination.
totalPagesNoTotal number of pages.
currentPageNoCurrent page number.
appliedFiltersNoThe effective search parameters, field by field — confirms which filter combination produced these results without parsing the effectiveQuery string.
effectiveQueryNoActive filters echoed: keyword, topic ID, and/or source ID that were applied.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ProjectsA
Read-onlyIdempotent
Inspect

Search the World Bank lending portfolio — the individual loans, credits, and grants the Bank finances — by free text, country, region, status, sector names, financing window (IBRD, IDA, Grants, Other), and board approval date. For classified education commitments use sector: ["Education"], rather than a free-text education query. Returns the project ID, name, borrowing country, region, status, board approval and closing dates, the commitment amount in USD with its IBRD, IDA, and grant parts, financing windows, major sectors, and a link to the project page. This is the operations catalogue, not the statistics catalogue: use it for "what is the World Bank funding in Kenya", "which climate adaptation projects are active", or "how much was committed to education in South Asia since 2020". For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead. Countries take the ISO3 or ISO2 codes the other tools take (BRA or BR), and multi-country operations carry a World Bank regional code such as 3A; WDI aggregates such as SSF or WLD are rejected, since the portfolio lists operations by economy — use region for those. Every filter is an exact match upstream and combines with the others by AND, so a narrow search can legitimately return nothing; when it does, the response says whether the country codes matched anything on their own.

NameRequiredDescriptionDefault
pageNoPagination page number (1-based).
queryNoFree-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.
regionNoWorld 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.
sectorNoExact sector names, such as Education or FY17 - Social Protection, combined as OR across bare and FY17 spellings. Use names copied from the Projects API sector_exact facet, not sector codes. Unknown names return no matches; each name must be nonblank and contain no caret. Combines with other filters by AND.
statusNoLifecycle 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_pageNoResults per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size.
countriesNoBorrowing 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_toNoLatest board approval date, as YYYY-MM-DD and inclusive. It must be a real calendar day.
approved_fromNoEarliest 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_typeNoFinancing 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_abstractNoInclude each project's complete abstract without changing page size. A project with no abstract reports null; appliedFilters.includeAbstract distinguishes omission from unavailable text.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoContext for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the maximum.
projectsNoProjects on this page, newest board approval date first with or without query, and projects with no board date last. Pagination walks the same order.
totalCountNoTotal projects matching the search, before pagination.
totalPagesNoTotal number of pages.
currentPageNoPage number requested — past totalPages when the request ran off the end.
appliedFiltersNoThe effective search sent upstream — confirms country-code normalization and which filters were in force for these results.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description still adds substantial behavior: all filters are exact-match AND so narrow searches can legitimately return nothing, the response reports whether country codes matched on their own, and 36% of the portfolio publishes no financing window so financial_type never matches those. It also discloses the legacy country codes (RY, ZR, GZ, TP) and that WDI aggregates are rejected — none of which is in the annotations.

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

Conciseness4/5

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

Front-loaded with the verb, resource, and filter list, then returns, then sibling routing, then parameter caveats — a sensible order. It is dense and long, and the enumerated return fields partly duplicate the output schema, but nearly every sentence carries distinct information, so little is wasted.

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

Completeness5/5

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

For an 11-parameter, zero-required search tool over a large open-world catalogue, the description covers scope, empty-result behavior, code formats, filter interaction, and how it differs from all statistical siblings. An output schema exists, so the brief return listing is extra rather than necessary, and nothing an agent needs to call it correctly is missing.

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

Parameters5/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes well beyond it: it explains that sector names must come from the sector_exact facet and not codes, that status omission returns mostly historical operations, that the Grants window is not the grantAmount figure, and that pipeline projects carry future scheduled approval dates. It also adds ISO2/ISO3 vs regional-code semantics (3A, 4E) that supplement the schema's terse wording.

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

Purpose5/5

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

States a specific verb and resource ("Search the World Bank lending portfolio — the individual loans, credits, and grants") and immediately scopes it against the sibling statistics catalogue. An agent can tell this apart from worldbank_search_indicators and worldbank_get_data without opening any schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use examples ("what is the World Bank funding in Kenya", "which climate adaptation projects are active"), explicit when-not with named alternatives ("For development statistics and time series, use worldbank_search_indicators and worldbank_get_data instead"), plus a specific routing rule to sector: ["Education"] for classified education commitments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedworldbank_get_data9 fields changed
      • changedInput schema / properties / per_page / description
        Previous value: -"Results per page (default: server default, max: 1000). One page holds at most 200 observations, which keeps a response within about 50 KB; a larger value is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size, so page + 1 continues where a page ends; notice discloses the reduction whenever the result runs past one page."New value: +"Results per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size."
      • changedInput schema / properties / per_page / maximum
        Previous value: -1000New value: +9007199254740991
      • addedInput schema / properties / source_id
        Added value: +{
        +  "description": "Select this source dataset explicitly, including subnational sources. Use worldbank_list_countries with the same source_id for its canonical entity IDs. Omission preserves the standard dataset and automatic fallback.",
        +  "pattern": "^\\s*\\d*\\s*$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / appliedFilters / properties / sourceId
        Added value: +{
        +  "description": "Explicit source_id requested, omitted for automatic routing.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / items / properties / countryCode / description
        Previous value: -"ISO2 code of the country or aggregate (US, XD for High income)."New value: +"ISO2 code of the country or aggregate (US, XD for High income), or the canonical opaque entity ID for a source-only entity."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: More than one of date_range, mrv, and mrnev is provided, or frequency is provided with date_range. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. `upstream_inconsistent`: The World Bank API answered a data read, and its one re-read, with rows that do not fit the request — its response cache served another query's result — so nothing was served. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `source_not_found`: source_id does not name a source. `source_not_queryable`: The selected source has no supported country/series/time layout. `invalid_params`: More than one of date_range, mrv, and mrnev is provided, or frequency is provided with date_range. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. `upstream_inconsistent`: The World Bank API answered a data read, and its one re-read, with rows that do not fit the request — its response cache served another query's result — so nothing was served. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "mixed_all_selector",
        -  "reversed_date_range",
        -  "multiple_indicators",
        -  "indicator_not_found",
        -  "indicator_not_queryable",
        -  "unknown_dimension_value",
        -  "dimension_not_applicable",
        -  "source_scope_too_large",
        -  "country_not_found",
        -  "indicator_and_country_not_found",
        -  "upstream_inconsistent"
        -]New value: +[
        +  "source_not_found",
        +  "source_not_queryable",
        +  "invalid_params",
        +  "mixed_all_selector",
        +  "reversed_date_range",
        +  "multiple_indicators",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "unknown_dimension_value",
        +  "dimension_not_applicable",
        +  "source_scope_too_large",
        +  "country_not_found",
        +  "indicator_and_country_not_found",
        +  "upstream_inconsistent"
        +]
      • addedOutput schema / properties / sourceId
        Added value: +{
        +  "description": "Serving source ID, present only when established by the selected source or upstream response.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / sourceScoped / description
        Previous value: -"Present only when the standard data endpoint does not serve the indicator and its catalog source served the values instead. Absent for indicators the standard endpoint serves."New value: +"Present when the source-scoped data API served the explicitly selected source or an automatic fallback dataset."
    • Changedworldbank_get_poverty5 fields changed
      • changedInput schema / properties / per_page / description
        Previous value: -"Results per page (default: server default, max: 1000). \"all\" countries across \"all\" years runs to several thousand rows. One page holds at most 70 estimates, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; notice discloses the reduction whenever the result runs past one page."New value: +"Results per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size."
      • changedInput schema / properties / per_page / maximum
        Previous value: -1000New value: +9007199254740991
      • addedOutput schema / properties / estimates / items / properties / distributionType
        Added value: +{
        +  "description": "PIP distribution classification, such as micro, group, or imputed. Null when PIP publishes none.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / estimates / items / properties / estimateType
        Added value: +{
        +  "description": "PIP estimate classification: actual, nowcast, or projection. Null when PIP publishes none; independent of estimationType.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / properties / estimates / items / required
        Previous value: -[
        -  "countryCode",
        -  "countryName",
        -  "regionCode",
        -  "regionName",
        -  "reportingYear",
        -  "reportingLevel",
        -  "welfareType",
        -  "povertyLine",
        -  "headcount",
        -  "povertyGap",
        -  "povertySeverity",
        -  "watts",
        -  "mean",
        -  "median",
        -  "gini",
        -  "mld",
        -  "polarization",
        -  "decileShares",
        -  "population",
        -  "popInPoverty",
        -  "surveyYear",
        -  "surveyAcronym",
        -  "surveyComparability",
        -  "comparableSpell",
        -  "estimationType",
        -  "isInterpolated",
        -  "isAggregate"
        -]New value: +[
        +  "countryCode",
        +  "countryName",
        +  "regionCode",
        +  "regionName",
        +  "reportingYear",
        +  "reportingLevel",
        +  "welfareType",
        +  "povertyLine",
        +  "headcount",
        +  "povertyGap",
        +  "povertySeverity",
        +  "watts",
        +  "mean",
        +  "median",
        +  "gini",
        +  "mld",
        +  "polarization",
        +  "decileShares",
        +  "population",
        +  "popInPoverty",
        +  "surveyYear",
        +  "surveyAcronym",
        +  "surveyComparability",
        +  "comparableSpell",
        +  "estimationType",
        +  "estimateType",
        +  "distributionType",
        +  "isInterpolated",
        +  "isAggregate"
        +]
    • Changedworldbank_list_countries12 fields changed
      • changedInput schema / properties / per_page / description
        Previous value: -"Results per page (default: server default, max: 300). One page holds at most 150 entries, which keeps a response within about 50 KB; a larger value is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size, so page + 1 continues where a page ends; notice discloses the reduction whenever the result runs past one page."New value: +"Results per page (default: server default). Positive integers above 300 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size."
      • changedInput schema / properties / per_page / maximum
        Previous value: -300New value: +9007199254740991
      • addedInput schema / properties / source_id
        Added value: +{
        +  "description": "Select a source-specific entity listing. Entries carry canonical id, name and sourceId only; global classification filters and include_aggregates=true are unavailable. Default false keeps all source entities.",
        +  "pattern": "^\\s*\\d*\\s*$",
        +  "type": "string"
        +}
      • addedOutput schema / properties / appliedFilters / properties / sourceId
        Added value: +{
        +  "description": "Source dataset requested, omitted for the global country listing.",
        +  "type": "string"
        +}
      • removedOutput schema / properties / countries / items / additionalProperties
        Removed value: -false
      • addedOutput schema / properties / countries / items / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An entity from a selected source.",
        +    "properties": {
        +      "id": {
        +        "description": "Canonical source entity ID, accepted unchanged by worldbank_get_data.",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "Source entity name.",
        +        "type": "string"
        +      },
        +      "sourceId": {
        +        "description": "Source owning this entity.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "sourceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A country or aggregate entry.",
        +    "properties": {
        +      "capitalCity": {
        +        "description": "Capital city name (empty for aggregates).",
        +        "type": "string"
        +      },
        +      "id": {
        +        "description": "Country or aggregate ID (ISO2 or WB aggregate code).",
        +        "type": "string"
        +      },
        +      "incomeLevel": {
        +        "additionalProperties": false,
        +        "description": "World Bank income classification.",
        +        "properties": {
        +          "id": {
        +            "description": "Income level code.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Income level name.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "isAggregate": {
        +        "description": "True when this entry is a regional or income-group aggregate rather than an individual country.",
        +        "type": "boolean"
        +      },
        +      "iso2": {
        +        "description": "ISO2 country code.",
        +        "type": "string"
        +      },
        +      "latitude": {
        +        "description": "Capital latitude (empty for aggregates).",
        +        "type": "string"
        +      },
        +      "lendingType": {
        +        "description": "World Bank lending type name: IDA, IBRD, Blend, or Not classified (lending_type filters by the codes IDX, IBD, IDB, LNX). Aggregates report Aggregates.",
        +        "type": "string"
        +      },
        +      "longitude": {
        +        "description": "Capital longitude (empty for aggregates).",
        +        "type": "string"
        +      },
        +      "name": {
        +        "description": "Country or aggregate name.",
        +        "type": "string"
        +      },
        +      "region": {
        +        "additionalProperties": false,
        +        "description": "World Bank region this country belongs to.",
        +        "properties": {
        +          "id": {
        +            "description": "Region code.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Region name.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "id",
        +      "iso2",
        +      "name",
        +      "region",
        +      "incomeLevel",
        +      "lendingType",
        +      "capitalCity",
        +      "longitude",
        +      "latitude",
        +      "isAggregate"
        +    ],
        +    "type": "object"
        +  }
        +]
      • changedOutput schema / properties / countries / items / description
        Previous value: -"A country or aggregate entry."New value: +"A global country or aggregate, or an entity from the selected source."
      • removedOutput schema / properties / countries / items / properties
        Removed value: -{
        -  "capitalCity": {
        -    "description": "Capital city name (empty for aggregates).",
        -    "type": "string"
        -  },
        -  "id": {
        -    "description": "Country or aggregate ID (ISO2 or WB aggregate code).",
        -    "type": "string"
        -  },
        -  "incomeLevel": {
        -    "additionalProperties": false,
        -    "description": "World Bank income classification.",
        -    "properties": {
        -      "id": {
        -        "description": "Income level code.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Income level name.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name"
        -    ],
        -    "type": "object"
        -  },
        -  "isAggregate": {
        -    "description": "True when this entry is a regional or income-group aggregate rather than an individual country.",
        -    "type": "boolean"
        -  },
        -  "iso2": {
        -    "description": "ISO2 country code.",
        -    "type": "string"
        -  },
        -  "latitude": {
        -    "description": "Capital latitude (empty for aggregates).",
        -    "type": "string"
        -  },
        -  "lendingType": {
        -    "description": "World Bank lending type name: IDA, IBRD, Blend, or Not classified (lending_type filters by the codes IDX, IBD, IDB, LNX). Aggregates report Aggregates.",
        -    "type": "string"
        -  },
        -  "longitude": {
        -    "description": "Capital longitude (empty for aggregates).",
        -    "type": "string"
        -  },
        -  "name": {
        -    "description": "Country or aggregate name.",
        -    "type": "string"
        -  },
        -  "region": {
        -    "additionalProperties": false,
        -    "description": "World Bank region this country belongs to.",
        -    "properties": {
        -      "id": {
        -        "description": "Region code.",
        -        "type": "string"
        -      },
        -      "name": {
        -        "description": "Region name.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name"
        -    ],
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / properties / countries / items / required
        Removed value: -[
        -  "id",
        -  "iso2",
        -  "name",
        -  "region",
        -  "incomeLevel",
        -  "lendingType",
        -  "capitalCity",
        -  "longitude",
        -  "latitude",
        -  "isAggregate"
        -]
      • removedOutput schema / properties / countries / items / type
        Removed value: -"object"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_filter`: An invalid region or income_level code was provided. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `source_not_found`: source_id does not name a source. `source_not_queryable`: The selected source has no supported country/series/time layout. `unsupported_source_filter`: Global classification filters are combined with source_id. `invalid_filter`: An invalid region or income_level code was provided. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_filter"
        -]New value: +[
        +  "source_not_found",
        +  "source_not_queryable",
        +  "unsupported_source_filter",
        +  "invalid_filter"
        +]
    • Changedworldbank_list_sources1 field changed
      • changedOutput schema / properties / sources / items / properties / id / description
        Previous value: -"Source ID for use in worldbank_search_indicators."New value: +"Source ID for use in worldbank_search_indicators, worldbank_get_data, and worldbank_list_countries."
    • Changedworldbank_search_projects9 fields changed
      • changedInput schema / properties / include_abstract / description
        Previous value: -"Include each project's abstract. Abstracts run long — a median of roughly 1,200 characters, up to 8,000 — so a page carrying them holds at most 8 projects rather than 80, and an abstract longer than 5,000 characters (about 2% of them) is cut there and marked with …, with notice naming the projects cut and each project's url leading to the full text; leave this off while narrowing a search and turn it on once the result set is small enough to read. Projects that publish no abstract report null either way, which appliedFilters.includeAbstract distinguishes."New value: +"Include each project's complete abstract without changing page size. A project with no abstract reports null; appliedFilters.includeAbstract distinguishes omission from unavailable text."
      • changedInput schema / properties / per_page / description
        Previous value: -"Results per page (default: server default, max: 1000). One page holds at most 80 projects, or 8 with include_abstract, which keeps a response within about 50 KB; a larger value, the server default included, is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size; notice discloses the reduction whenever the result runs past one page."New value: +"Results per page (default: server default). Positive integers above 1000 are served at that maximum with the requested and served sizes echoed and a notice. totalPages uses the served size."
      • changedInput schema / properties / per_page / maximum
        Previous value: -1000New value: +9007199254740991
      • addedInput schema / properties / sector
        Added value: +{
        +  "description": "Exact sector names, such as Education or FY17 - Social Protection, combined as OR across bare and FY17 spellings. Use names copied from the Projects API sector_exact facet, not sector codes. Unknown names return no matches; each name must be nonblank and contain no caret. Combines with other filters by AND.",
        +  "items": {
        +    "description": "A sector name, optionally prefixed FY17 - .",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / appliedFilters / properties / sector
        Added value: +{
        +  "description": "Sector names applied, deduplicated with the leading FY17 prefix removed; omitted when none.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. Also when countries holds only separators and so names no code at all. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_sector_name`: A sector name is blank after normalization or contains a caret separator. `invalid_country_code`: A countries entry resolves to no economy: it is not two or three letters or digits, no economy in the World Bank country index has that three-character code, or it is a WDI aggregate such as SSF or WLD, which the portfolio lists no operations under. Also when countries holds only separators and so names no code at all. `invalid_date`: approved_from or approved_to is shaped YYYY-MM-DD but names no real day — a month outside 01–12, or a day outside its month. `reversed_date_range`: approved_from falls after approved_to, an interval no project can match. `invalid_query`: The Projects API could not parse query and answered HTTP 400, or query contains #, which the API answers with rows unrelated to the search. `page_out_of_range`: The requested page starts past the 100,000-result offset the Projects API serves. `upstream_unavailable`: The Projects API answered with a non-success status other than a query it could not parse — a rate limit, a timeout, a 5xx — or with an HTML error page, or the World Bank Indicators API country listing that resolves an ISO3 code could not be loaded. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_country_code",
        -  "invalid_date",
        -  "reversed_date_range",
        -  "invalid_query",
        -  "page_out_of_range",
        -  "upstream_unavailable"
        -]New value: +[
        +  "invalid_sector_name",
        +  "invalid_country_code",
        +  "invalid_date",
        +  "reversed_date_range",
        +  "invalid_query",
        +  "page_out_of_range",
        +  "upstream_unavailable"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, for a page size reduced to the page cap, or naming the projects whose abstracts were cut."New value: +"Context for an empty result set — including whether the country filter matched anything on its own — for a page past the end of the results, or for a page size reduced to the maximum."
      • changedOutput schema / properties / projects / items / properties / abstract / description
        Previous value: -"Project abstract, cut at 5,000 characters and marked with … when longer. Null when include_abstract was not requested and when the project publishes none — appliedFilters.includeAbstract separates the two."New value: +"Complete project abstract. Null when include_abstract was not requested or the project publishes none; appliedFilters.includeAbstract distinguishes them."
  2. 1 tool update
    • Changedworldbank_get_poverty3 fields changed
      • changedInput schema / properties / countries / description
        Previous value: -"Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. Other aggregate codes (SSA, EAP, FCVY, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate."New value: +"Country codes: a single code, an array, or one string separated by commas, semicolons, or pipes. Economies go by ISO3 (IND, USA) or ISO2 (IN, US) code, including those PIP publishes only as model estimates (AFG); \"all\" returns every economy. PIP's aggregates are served too: WLD; the World Bank regions AFE, AFW, EAS, ECS, LCN, MEA, NAC, SAS, SSF; the income groups HIC, LIC, LMIC (or LMC), UMIC (or UMC); the fragility groups FCVY (fragile) and FCVN (not fragile); and the lending groups IDX (IDA only), IDB or BLND (IDA blend), IBD or IBRD (IBRD only), and REST. Income groups follow the fiscal-year classification PIP's data release was built with — FY2026 (July 2025) for release 20260922 — applied to every year, so membership can differ from the current one worldbank_get_country reports. IDA (IDA total) is rejected because PIP computes no IDA total: ask for IDX and IDB together. FCS is rejected: use PIP's FCVY for its fragile group, whose membership is not asserted to match WDI's FCS. Other aggregate codes (SSA, EAP, MIC, LMY) are rejected, and welfare_type and reporting_level cannot be combined with an aggregate."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: an FCV or PovcalNet grouping from PIP's regions table (FCVY, SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, or the World Bank Indicators API country listing that resolves an ISO2 code could not be loaded. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `country_not_found`: No economy or aggregate PIP publishes goes by one or more of the codes, including a two-character code the World Bank country listing does not carry. `ambiguous_aggregate`: IDA or its ISO2 code XG names WDI's IDA total, which PIP does not compute. `unserved_aggregate`: An aggregate code this tool does not serve: WDI's FCS, a PovcalNet grouping from PIP's regions table (SSA, EAP), or a WDI income aggregate PIP computes none for (MIC, LMY). `aggregate_filter_conflict`: welfare_type or reporting_level was set alongside an aggregate code. `invalid_parameter`: PIP rejected the value supplied for a query parameter other than country. `ppp_version_unavailable`: ppp_version names a PPP vintage PIP's current data release is not published at. `upstream_unavailable`: PIP answered with a server error, or the World Bank Indicators API country listing that resolves an ISO2 code could not be loaded. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / estimates / items / properties / isAggregate / description
        Previous value: -"True on a PIP aggregate — World, a region, an income group, or a lending group — whose median, distributional block, survey fields, welfareType, and reportingLevel are null."New value: +"True on a PIP aggregate — World, a region, an income group, a lending group, or a fragility group — whose median, distributional block, survey fields, welfareType, and reportingLevel are null."
  3. 1 tool update
    • Changedworldbank_get_data10 fields changed
      • changedInput schema / properties / date_range / description
        Previous value: -"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. On a series publishing more than one period form, the window's form picks which: `2024` returns the annual value, `2024Q1:2024Q4` the quarters, `2024M01:2024M12` the months, and a quarter or month window is null-filled where the series has none (a notice then names the other forms). On a series with one form, a window at another form keeps the periods it overlaps (`2019:2021` on a quarterly series returns its twelve quarters). A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv, mrnev, and frequency."
      • addedInput schema / properties / frequency
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "description": "annual (2025), quarterly (2025Q4), or monthly (2025M12) periods.",
        +      "enum": [
        +        "annual",
        +        "quarterly",
        +        "monthly"
        +      ],
        +      "type": "string"
        +    }
        +  ],
        +  "description": "The period form to return, for series such as Global Economic Monitor's that publish quarterly or monthly values beside annual ones: annual (the default), quarterly, or monthly. With mrv or mrnev it picks the form they select from — frequency \"monthly\" with mrv 3 returns the three latest months, where mrv 3 alone returns the three latest years. With neither, it returns the whole series at that form. A series that does not publish the form returns an empty result with a notice saying so, except that with neither mrv nor mrnev a source that null-fills the form (Global Economic Monitor) returns null rows, and a page of them carries a notice. Mutually exclusive with date_range, whose own form (2024, 2024Q1, 2024M01) picks the periods of a window."
        +}
      • addedInput schema / properties / mrnev
        Added value: +{
        +  "description": "Return each requested country's own N most recent periods (1–100) holding a value — its latest non-null observations, however far back they sit. A country with fewer values in the series returns the ones it has, and a country with none returns no rows. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Mutually exclusive with date_range and mrv.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / mrv / description
        Previous value: -"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."New value: +"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values; mrnev returns each country's own latest values instead. The periods are annual unless frequency names another form (a series with no annual periods keeps its own). Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range and mrnev."
      • addedOutput schema / properties / appliedFilters / properties / frequency
        Added value: +{
        +  "description": "Period form applied (annual, quarterly, monthly), omitted when none was requested.",
        +  "enum": [
        +    "annual",
        +    "quarterly",
        +    "monthly"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / appliedFilters / properties / mrnev
        Added value: +{
        +  "description": "Most-recent-non-empty-values count applied, omitted when none was requested.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: More than one of date_range, mrv, and mrnev is provided, or frequency is provided with date_range. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. `upstream_inconsistent`: The World Bank API answered a data read, and its one re-read, with rows that do not fit the request — its response cache served another query's result — so nothing was served. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "mixed_all_selector",
        -  "reversed_date_range",
        -  "multiple_indicators",
        -  "indicator_not_found",
        -  "indicator_not_queryable",
        -  "unknown_dimension_value",
        -  "dimension_not_applicable",
        -  "source_scope_too_large",
        -  "country_not_found",
        -  "indicator_and_country_not_found"
        -]New value: +[
        +  "invalid_params",
        +  "mixed_all_selector",
        +  "reversed_date_range",
        +  "multiple_indicators",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "unknown_dimension_value",
        +  "dimension_not_applicable",
        +  "source_scope_too_large",
        +  "country_not_found",
        +  "indicator_and_country_not_found",
        +  "upstream_inconsistent"
        +]
      • addedOutput schema / properties / lastUpdated
        Added value: +{
        +  "description": "Last update date of the World Bank source that served these values (YYYY-MM-DD) — the data vintage to cite with them. Omitted when upstream reports none, as for an empty result.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, whether the series publishes the requested frequency, or the page range that exists when the requested page is past the end — a quarter or month date_range whose observations are all null, with the same span at the other period forms, a frequency page whose observations are all null, a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
  4. 5 tool updates
    • Changedworldbank_get_data10 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous value: -[
        -  {
        -    "description": "A single country code, a comma- or semicolon-separated list, or \"all\".",
        -    "pattern": "[^\\s;,]",
        -    "type": "string"
        -  },
        -  {
        -    "description": "An array of country codes.",
        -    "items": {
        -      "description": "A country code.",
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single country code, a list separated by commas, semicolons, or pipes, or \"all\".",
        +    "pattern": "[^\\s;,|]",
        +    "type": "string"
        +  },
        +  {
        +    "description": "An array of country codes; an element holding several codes separated by commas, semicolons, or pipes is split too.",
        +    "items": {
        +      "description": "A country code.",
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas or semicolons. At least one code is required — an empty value is rejected rather than treated as \"all\"."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas, semicolons, or pipes (US,JP · US;JP · US|JP). At least one code is required — an empty value, or one made only of separators, is rejected rather than treated as \"all\"."
      • changedInput schema / properties / per_page / description
        Previous value: -"Results per page (default: server default, max: 1000). Use higher values for \"all\" country queries."New value: +"Results per page (default: server default, max: 1000). One page holds at most 200 observations, which keeps a response within about 50 KB; a larger value is reduced to that cap and echoed as appliedFilters.perPage, and totalPages is counted at the reduced size, so page + 1 continues where a page ends; notice discloses the reduction whenever the result runs past one page."
      • changedOutput schema / properties / appliedFilters / properties / countries / description
        Previous value: -"Country codes as sent to the API — array elements and comma- or semicolon-separated strings are split and rejoined with semicolons, so this shows the normalized value."New value: +"Country codes as requested, normalized — array elements and strings separated by commas, semicolons, or pipes are split and rejoined with semicolons, the separator the API takes."
      • changedOutput schema / properties / appliedFilters / properties / perPage / description
        Previous value: -"Results per page used, including the server default."New value: +"Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size."
      • addedOutput schema / properties / appliedFilters / properties / requestedPerPage
        Added value: +{
        +  "description": "Page size asked for, present only when it exceeded the page cap and perPage was reduced.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / data / items / properties / countryCode / description
        Previous value: -"ISO2 country code (or aggregate code)."New value: +"ISO2 code of the country or aggregate (US, XD for High income)."
      • changedOutput schema / properties / data / items / properties / countryIso3 / description
        Previous value: -"ISO3 country code (empty for some aggregates)."New value: +"Three-character code of the country or aggregate (USA, HIC) — the form the countries input takes. Empty only for an entity the World Bank country listing does not carry."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. The message and countryCodes name the codes the World Bank country listing lacks, or every requested code when it lacks none. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. The codes are named as on country_not_found. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — a page size reduced to the page cap, and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
    • Changedworldbank_get_poverty3 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous 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."
      • changedInput schema / properties / per_page / description
        Previous 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."
    • Changedworldbank_list_countries4 fields changed
      • changedInput schema / properties / per_page / description
        Previous 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."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "countries",
        -      "totalCount",
        -      "currentPage",
        -      "totalPages"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "countries",
        +      "appliedFilters",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / appliedFilters
        Added 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"
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
    • Changedworldbank_search_indicators2 fields changed
      • changedOutput schema / properties / indicators / items / properties / sourceNote / description
        Previous 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."
      • changedOutput schema / properties / notice / description
        Previous 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."
    • Changedworldbank_search_projects7 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous 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."
      • changedInput schema / properties / include_abstract / description
        Previous 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."
      • changedInput schema / properties / per_page / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / projects / items / properties / abstract / description
        Previous 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."
  5. 3 tool updates
    • Changedworldbank_get_poverty1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
    • Changedworldbank_list_countries4 fields changed
      • changedInput schema / properties / include_aggregates / description
        Previous 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."
      • addedInput schema / properties / lending_type
        Added 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)."
        +}
      • changedInput schema / properties / region / description
        Previous 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."
      • changedOutput schema / properties / countries / items / properties / lendingType / description
        Previous 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."
    • Changedworldbank_search_projects16 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous 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."
      • addedInput schema / properties / financial_type
        Added 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"
        +}
      • changedInput schema / properties / query / description
        Previous 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."
      • changedOutput schema / properties / appliedFilters / properties / countries / description
        Previous 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."
      • addedOutput schema / properties / appliedFilters / properties / financialType
        Added value: +{
        +  "description": "Financing windows applied, comma-joined, omitted when none.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / projects / description
        Previous 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."
      • changedOutput schema / properties / projects / items / properties / countryCodes / description
        Previous 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."
      • changedOutput schema / properties / projects / items / properties / financialTypes / description
        Previous 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."
      • addedOutput schema / properties / projects / items / properties / grantAmount
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / projects / items / properties / ibrdCommitment
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / projects / items / properties / idaCommitment
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / projects / items / properties / totalCommitment / description
        Previous 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."
      • changedOutput schema / properties / projects / items / required
        Previous 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"
        +]
  6. 2 tool updates
    • Changedworldbank_get_poverty26 fields changed
      • changedInput schema / properties / countries / description
        Previous 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."
      • changedInput schema / properties / fill_gaps / description
        Previous 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."
      • changedInput schema / properties / year / description
        Previous 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."
      • changedOutput schema / properties / appliedFilters / properties / countries / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous 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"
        +]
      • changedOutput schema / properties / estimates / description
        Previous 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."
      • changedOutput schema / properties / estimates / items / description
        Previous value: -"One country × year × reporting-level × welfare-type estimate."New value: +"One economy × year × reporting-level × welfare-type estimate, or one aggregate × year."
      • changedOutput schema / properties / estimates / items / properties / countryCode / description
        Previous 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."
      • changedOutput schema / properties / estimates / items / properties / countryName / description
        Previous value: -"Economy name."New value: +"Economy or aggregate name — \"IDA only\" for IDX, as WDI names it."
      • changedOutput schema / properties / estimates / items / properties / estimationType / description
        Previous 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\"."
      • addedOutput schema / properties / estimates / items / properties / isAggregate
        Added 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"
        +}
      • changedOutput schema / properties / estimates / items / properties / isInterpolated / description
        Previous 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."
      • changedOutput schema / properties / estimates / items / properties / isInterpolated / type
        Previous value: -"boolean"New value: +[
        +  "boolean",
        +  "null"
        +]
      • changedOutput schema / properties / estimates / items / properties / median / description
        Previous 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."
      • addedOutput schema / properties / estimates / items / properties / popInPoverty
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / estimates / items / properties / regionCode / description
        Previous 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."
      • changedOutput schema / properties / estimates / items / properties / regionCode / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / estimates / items / properties / regionName / description
        Previous value: -"PIP region name."New value: +"PIP region name of the economy; null on an aggregate row."
      • changedOutput schema / properties / estimates / items / properties / regionName / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / estimates / items / properties / reportingLevel / description
        Previous value: -"Coverage of this estimate: national, urban, or rural."New value: +"Coverage of this estimate: national, urban, or rural. Null on an aggregate row."
      • changedOutput schema / properties / estimates / items / properties / reportingLevel / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / estimates / items / properties / welfareType / description
        Previous 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."
      • changedOutput schema / properties / estimates / items / properties / welfareType / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedOutput schema / properties / estimates / items / required
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
    • Changedworldbank_search_projects1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
  7. 1 tool update
    • Changedworldbank_get_data10 fields changed
      • addedInput schema / properties / dimension_value
        Added value: +{
        +  "description": "For indicators answered from their own dataset (the response carries sourceScoped), the id of the value of that dataset's extra dimension to query, matched case-insensitively: a WDI Database Archives release (\"202503\"), an ICP or Food Prices for Nutrition classification (\"PPPGlob\", \"FPN 5.0\"), a GDLD sector (\"WHT\"), or an International Debt Statistics counterpart area (\"265\"). Omit it for the default, which sourceScoped.dimension reports: the only value when the dataset has one, \"WLD\" (World) for counterpart areas, the newest WDI Database Archives release holding data for the requested countries and periods (the newest release when none does), or otherwise every value with each row labelled. A value the dataset does not list is rejected with the valid ids, and a value for an indicator the standard data endpoint serves is rejected too.",
        +  "type": "string"
        +}
      • changedInput schema / properties / mrv / description
        Previous value: -"Return the N most recent available values per country (1–100), clamped upstream to the length of the series. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."New value: +"Return the N most recent periods (1–100) holding a value for any requested country, clamped to the length of the series. Every requested country comes back at those periods, null where it has no value there rather than with its own older values. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."
      • addedOutput schema / properties / appliedFilters / properties / dimensionValue
        Added value: +{
        +  "description": "dimension_value as requested, omitted when none was given.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / data / items / description
        Previous value: -"A single country×year observation."New value: +"A single country×period observation."
      • changedOutput schema / properties / data / items / properties / date / description
        Previous value: -"Year of observation (YYYY format)."New value: +"Period of observation: a year (2020), quarter (2020Q1), or month (2020M03)."
      • addedOutput schema / properties / data / items / properties / dimension
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The value of the dataset's extra dimension (sourceScoped.dimension.concept) this row belongs to. Present on source-scoped rows from a dataset that has one.",
        +  "properties": {
        +    "id": {
        +      "description": "Dimension value id, e.g. \"202503\".",
        +      "type": "string"
        +    },
        +    "label": {
        +      "description": "Dimension value label, e.g. \"2025 Mar\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "label"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The standard data endpoint does not serve the indicator, and no catalog source can serve it through the source-scoped data API instead — the catalog no longer lists the ID, the catalog lookup failed, or the source is not organized by country, series, and time plus at most one further dimension. `unknown_dimension_value`: dimension_value is not a value the indicator's dataset lists for its extra dimension. `dimension_not_applicable`: dimension_value is given for an indicator the standard data endpoint serves, or whose dataset has no dimension beyond country, series, and time. `source_scope_too_large`: A source-scoped query would read more rows (countries × periods × unpinned dimension values) than one request allows. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "mixed_all_selector",
        -  "reversed_date_range",
        -  "multiple_indicators",
        -  "indicator_not_found",
        -  "indicator_not_queryable",
        -  "country_not_found",
        -  "indicator_and_country_not_found"
        -]New value: +[
        +  "invalid_params",
        +  "mixed_all_selector",
        +  "reversed_date_range",
        +  "multiple_indicators",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "unknown_dimension_value",
        +  "dimension_not_applicable",
        +  "source_scope_too_large",
        +  "country_not_found",
        +  "indicator_and_country_not_found"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end — and, for source-scoped data, the requested country codes the serving dataset publishes nothing for."
      • addedOutput schema / properties / sourceScoped
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the standard data endpoint does not serve the indicator and its catalog source served the values instead. Absent for indicators the standard endpoint serves.",
        +  "properties": {
        +    "dimension": {
        +      "anyOf": [
        +        {
        +          "additionalProperties": false,
        +          "properties": {
        +            "concept": {
        +              "description": "The extra dimension: Version, Classification, Sector, or Counterpart-Area.",
        +              "type": "string"
        +            },
        +            "id": {
        +              "description": "Applied value id; null for every_value.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "label": {
        +              "description": "Applied value label; null for every_value.",
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "selection": {
        +              "description": "How the value was chosen: requested (dimension_value), only_value (the only one the dataset lists), world_total (WLD, all counterpart areas), newest_with_data (newest release holding a value for the requested countries and periods), newest (newest release; none holds a value in that scope), or every_value (no single value; each row carries its own).",
        +              "enum": [
        +                "requested",
        +                "only_value",
        +                "world_total",
        +                "newest_with_data",
        +                "newest",
        +                "every_value"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "concept",
        +            "selection",
        +            "id",
        +            "label"
        +          ],
        +          "type": "object"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The dimension value applied; null when the dataset has no extra dimension."
        +    },
        +    "note": {
        +      "description": "States that the values came from the source-scoped data API rather than the standard World Bank data endpoint, and may be archived or superseded figures.",
        +      "type": "string"
        +    },
        +    "sourceId": {
        +      "description": "ID of the World Bank data source that served the values.",
        +      "type": "string"
        +    },
        +    "sourceName": {
        +      "description": "Name of that data source, e.g. \"WDI Database Archives\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "sourceId",
        +    "sourceName",
        +    "dimension",
        +    "note"
        +  ],
        +  "type": "object"
        +}
  8. 5 tool updates
    • Changedworldbank_get_data5 fields changed
      • changedInput schema / properties / date_range / description
        Previous value: -"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`). A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`); a range running latest first is rejected. A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."
      • changedOutput schema / properties / currentPage / description
        Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `mixed_all_selector`: countries combines \"all\" with one or more country codes. `reversed_date_range`: date_range names a range whose first period comes after its second. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "multiple_indicators",
        -  "indicator_not_found",
        -  "indicator_not_queryable",
        -  "country_not_found",
        -  "indicator_and_country_not_found"
        -]New value: +[
        +  "invalid_params",
        +  "mixed_all_selector",
        +  "reversed_date_range",
        +  "multiple_indicators",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "country_not_found",
        +  "indicator_and_country_not_found"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Recovery hint for sparse or empty result sets — suggests how to broaden the query."New value: +"Recovery hint for an empty result set — how to broaden the query when nothing matched, or the page range that exists when the requested page is past the end."
    • Changedworldbank_get_poverty15 fields changed
      • changedInput schema / properties / per_page / description
        Previous 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."
      • changedInput schema / properties / poverty_line / description
        Previous 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."
      • addedInput schema / properties / ppp_version
        Added 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."
        +}
      • changedOutput schema / properties / appliedFilters / properties / perPage / description
        Previous value: -"Results per page used, including the server default."New value: +"Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size."
      • addedOutput schema / properties / appliedFilters / properties / pppVersion
        Added 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"
        +}
      • addedOutput schema / properties / appliedFilters / properties / releaseVersion
        Added 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"
        +}
      • addedOutput schema / properties / appliedFilters / properties / requestedPerPage
        Added value: +{
        +  "description": "Page size asked for, requested or server default, present only when it exceeded the page cap and perPage was reduced.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / appliedFilters / required
        Previous value: -[
        -  "countries",
        -  "fillGaps",
        -  "page",
        -  "perPage"
        -]New value: +[
        +  "countries",
        +  "pppVersion",
        +  "releaseVersion",
        +  "fillGaps",
        +  "page",
        +  "perPage"
        +]
      • changedOutput schema / properties / currentPage / description
        Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "country_not_found",
        -  "invalid_parameter",
        -  "upstream_unavailable"
        -]New value: +[
        +  "country_not_found",
        +  "invalid_parameter",
        +  "ppp_version_unavailable",
        +  "upstream_unavailable"
        +]
      • addedOutput schema / properties / estimates / items / properties / comparableSpell
        Added 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"
        +  ]
        +}
      • addedOutput schema / properties / estimates / items / properties / surveyComparability
        Added 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"
        +  ]
        +}
      • changedOutput schema / properties / estimates / items / required
        Previous 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"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
    • Changedworldbank_list_countries2 fields changed
      • changedOutput schema / properties / currentPage / description
        Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
      • addedOutput schema / properties / notice
        Added 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"
        +}
    • Changedworldbank_list_sources2 fields changed
      • changedOutput schema / properties / currentPage / description
        Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Context for an empty page: the page range that exists when the requested page is past the end.",
        +  "type": "string"
        +}
    • Changedworldbank_search_projects10 fields changed
      • changedInput schema / properties / approved_from / description
        Previous 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."
      • changedInput schema / properties / approved_to / description
        Previous 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."
      • changedInput schema / properties / include_abstract / description
        Previous 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."
      • changedInput schema / properties / per_page / description
        Previous 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."
      • changedOutput schema / properties / appliedFilters / properties / perPage / description
        Previous value: -"Results per page used, including the server default."New value: +"Results per page actually served — the requested size or server default, reduced to the page cap when larger. totalPages is counted at this size."
      • addedOutput schema / properties / appliedFilters / properties / requestedPerPage
        Added value: +{
        +  "description": "Page size asked for, requested or server default, present only when it exceeded the page cap and perPage was reduced.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / currentPage / description
        Previous value: -"Current page number."New value: +"Page number requested — past totalPages when the request ran off the end."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "page_out_of_range",
        -  "upstream_unavailable"
        -]New value: +[
        +  "invalid_country_code",
        +  "invalid_date",
        +  "reversed_date_range",
        +  "page_out_of_range",
        +  "upstream_unavailable"
        +]
      • changedOutput schema / properties / notice / description
        Previous 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."
  9. 4 tool updates
    • Changedworldbank_get_country5 fields changed
      • changedInput schema / properties / country_code / description
        Previous 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."
      • removedInput schema / properties / country_code / minLength
        Removed value: -1
      • addedInput schema / properties / country_code / pattern
        Added value: +"^[A-Za-z0-9]{2,3}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "country_not_found"
        -]New value: +[
        +  "country_not_found",
        +  "multiple_countries"
        +]
    • Changedworldbank_get_data5 fields changed
      • changedInput schema / properties / indicator_id / description
        Previous value: -"Indicator code to query (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL). Use worldbank_search_indicators to find valid IDs."New value: +"One indicator code to query (e.g. NY.GDP.PCAP.CD, SP.POP.TOTL) — not \"all\" or a list of codes. Use worldbank_search_indicators to find valid IDs."
      • removedInput schema / properties / indicator_id / minLength
        Removed value: -1
      • addedInput schema / properties / indicator_id / pattern
        Added value: +"^[A-Za-z0-9._-]+$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `multiple_indicators`: The indicator ID is \"all\", which selects every indicator rather than one. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "indicator_not_found",
        -  "indicator_not_queryable",
        -  "country_not_found",
        -  "indicator_and_country_not_found"
        -]New value: +[
        +  "invalid_params",
        +  "multiple_indicators",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "country_not_found",
        +  "indicator_and_country_not_found"
        +]
    • Changedworldbank_get_indicator5 fields changed
      • changedInput schema / properties / indicator_id / description
        Previous 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."
      • removedInput schema / properties / indicator_id / minLength
        Removed value: -1
      • addedInput schema / properties / indicator_id / pattern
        Added value: +"^[A-Za-z0-9._-]+$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "indicator_not_found"
        -]New value: +[
        +  "indicator_not_found",
        +  "multiple_indicators"
        +]
    • Changedworldbank_search_indicators5 fields changed
      • changedInput schema / properties / query / description
        Previous 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."
      • addedInput schema / properties / source_id / pattern
        Added value: +"^\\s*\\d*\\s*$"
      • addedInput schema / properties / topic_id / pattern
        Added value: +"^\\s*\\d*\\s*$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "missing_filter",
        -  "invalid_filter"
        -]New value: +[
        +  "missing_filter",
        +  "invalid_filter",
        +  "empty_query"
        +]
  10. 3 tool updates
    • Changedworldbank_get_data7 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous value: -[
        -  {
        -    "description": "A single country code or \"all\".",
        -    "pattern": "[^\\s;]",
        -    "type": "string"
        -  },
        -  {
        -    "description": "An array of country codes.",
        -    "items": {
        -      "description": "A country code.",
        -      "type": "string"
        -    },
        -    "minItems": 1,
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single country code, a comma- or semicolon-separated list, or \"all\".",
        +    "pattern": "[^\\s;,]",
        +    "type": "string"
        +  },
        +  {
        +    "description": "An array of country codes.",
        +    "items": {
        +      "description": "A country code.",
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for every entry (use pagination). Pass a single string or an array of codes for multi-country queries. At least one code is required — an empty value is rejected rather than treated as \"all\"."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" on its own for every entry (use pagination). Pass a single code, an array, or one string separated by commas or semicolons. At least one code is required — an empty value is rejected rather than treated as \"all\"."
      • changedOutput schema / properties / appliedFilters / properties / countries / description
        Previous value: -"Country codes as sent to the API — an array input is joined with semicolons, so this shows the normalized value."New value: +"Country codes as sent to the API — array elements and comma- or semicolon-separated strings are split and rejoined with semicolons, so this shows the normalized value."
      • removedOutput schema / properties / data / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / data / items / properties / value / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `indicator_not_queryable`: The indicator is listed in the catalog, or was, but the data endpoint does not serve it for any country or date — archived and retired datasets. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "invalid_params",
        -  "indicator_not_found",
        -  "country_not_found",
        -  "indicator_and_country_not_found"
        -]New value: +[
        +  "invalid_params",
        +  "indicator_not_found",
        +  "indicator_not_queryable",
        +  "country_not_found",
        +  "indicator_and_country_not_found"
        +]
    • Changedworldbank_get_poverty22 fields changed
      • removedOutput schema / properties / estimates / items / properties / gini / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / gini / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / headcount / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / headcount / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / mean / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / mean / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / median / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / median / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / mld / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / mld / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / polarization / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / polarization / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / population / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / population / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / povertyGap / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / povertyGap / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / povertySeverity / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / povertySeverity / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / surveyYear / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / surveyYear / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / estimates / items / properties / watts / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / estimates / items / properties / watts / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedworldbank_search_projects8 fields changed
      • removedOutput schema / properties / projects / items / properties / abstract / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / projects / items / properties / abstract / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / projects / items / properties / boardApprovalDate / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / projects / items / properties / boardApprovalDate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / projects / items / properties / closingDate / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / projects / items / properties / closingDate / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / projects / items / properties / totalCommitment / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / projects / items / properties / totalCommitment / type
        Added value: +[
        +  "number",
        +  "null"
        +]
  11. 9 tool updates
    • Changedworldbank_get_country6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "id",
        +      "iso2",
        +      "name",
        +      "region",
        +      "incomeLevel",
        +      "lendingType",
        +      "capitalCity",
        +      "longitude",
        +      "latitude",
        +      "isAggregate"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "iso2",
        -  "name",
        -  "region",
        -  "incomeLevel",
        -  "lendingType",
        -  "capitalCity",
        -  "longitude",
        -  "latitude",
        -  "isAggregate"
        -]
    • Changedworldbank_get_data6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "data",
        +      "indicator",
        +      "nullCount",
        +      "appliedFilters",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_params`: Both date_range and mrv are provided simultaneously. `indicator_not_found`: The indicator ID does not exist. `country_not_found`: One or more country codes are invalid. `indicator_and_country_not_found`: The indicator ID and the country codes are both invalid. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "invalid_params",
        +            "indicator_not_found",
        +            "country_not_found",
        +            "indicator_and_country_not_found"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "data",
        -  "indicator",
        -  "nullCount",
        -  "appliedFilters",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
    • Changedworldbank_get_indicator6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "id",
        +      "name",
        +      "unit",
        +      "sourceId",
        +      "sourceName",
        +      "sourceNote",
        +      "sourceOrganization",
        +      "topics"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "name",
        -  "unit",
        -  "sourceId",
        -  "sourceName",
        -  "sourceNote",
        -  "sourceOrganization",
        -  "topics"
        -]
    • Changedworldbank_get_poverty6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "estimates",
        +      "appliedFilters",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "estimates",
        -  "appliedFilters",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
    • Changedworldbank_list_countries6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "countries",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `invalid_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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "countries",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
    • Changedworldbank_list_sources6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "sources",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "sources",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
    • Changedworldbank_list_topics6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "topics"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "topics"
        -]
    • Changedworldbank_search_indicators6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "indicators",
        +      "appliedFilters",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "indicators",
        -  "appliedFilters",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
    • Changedworldbank_search_projects6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "projects",
        +      "appliedFilters",
        +      "totalCount",
        +      "currentPage",
        +      "totalPages"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "projects",
        -  "appliedFilters",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]
  12. 1 tool update
    • Addedworldbank_search_projects
  13. 1 tool update
    • Addedworldbank_get_poverty
  14. 2 tool updates
    • Changedworldbank_get_data2 fields changed
      • addedOutput schema / properties / appliedFilters
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The effective parameters sent to the World Bank API — confirms country code normalization and which filters were in force for these observations.",
        +  "properties": {
        +    "countries": {
        +      "description": "Country codes as sent to the API — an array input is joined with semicolons, so this shows the normalized value.",
        +      "type": "string"
        +    },
        +    "dateRange": {
        +      "description": "Date window applied, omitted when none was requested.",
        +      "type": "string"
        +    },
        +    "indicatorId": {
        +      "description": "Indicator ID queried.",
        +      "type": "string"
        +    },
        +    "mrv": {
        +      "description": "Most-recent-values count applied, omitted when none was requested.",
        +      "type": "number"
        +    },
        +    "page": {
        +      "description": "Page number requested.",
        +      "type": "number"
        +    },
        +    "perPage": {
        +      "description": "Results per page used, including the server default.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "indicatorId",
        +    "countries",
        +    "page",
        +    "perPage"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "data",
        -  "indicator",
        -  "nullCount",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]New value: +[
        +  "data",
        +  "indicator",
        +  "nullCount",
        +  "appliedFilters",
        +  "totalCount",
        +  "currentPage",
        +  "totalPages"
        +]
    • Changedworldbank_search_indicators2 fields changed
      • addedOutput schema / properties / appliedFilters
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "indicators",
        -  "totalCount",
        -  "currentPage",
        -  "totalPages"
        -]New value: +[
        +  "indicators",
        +  "appliedFilters",
        +  "totalCount",
        +  "currentPage",
        +  "totalPages"
        +]
  15. 1 tool update
    • Changedworldbank_get_data6 fields changed
      • changedInput schema / properties / countries / anyOf
        Previous value: -[
        -  {
        -    "description": "A single country code or \"all\".",
        -    "type": "string"
        -  },
        -  {
        -    "description": "An array of country codes.",
        -    "items": {
        -      "description": "A country code.",
        -      "type": "string"
        -    },
        -    "type": "array"
        -  }
        -]New value: +[
        +  {
        +    "description": "A single country code or \"all\".",
        +    "pattern": "[^\\s;]",
        +    "type": "string"
        +  },
        +  {
        +    "description": "An array of country codes.",
        +    "items": {
        +      "description": "A country code.",
        +      "type": "string"
        +    },
        +    "minItems": 1,
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / countries / description
        Previous value: -"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for all 266 entries (use pagination). Pass a single string or an array of codes for multi-country queries."New value: +"Country codes. Accepts: ISO2 (US, CN), ISO3 (USA, CHN), regional aggregate codes (EAS, LCN, MEA, SAS, SSF, ECS, NAC), income group codes (HIC, UMC, LMC, LIC), world code (WLD), or \"all\" for every entry (use pagination). Pass a single string or an array of codes for multi-country queries. At least one code is required — an empty value is rejected rather than treated as \"all\"."
      • changedInput schema / properties / date_range / description
        Previous value: -"Year or year range in YYYY or YYYY:YYYY format (e.g. \"2020\" or \"2010:2023\"). Mutually exclusive with mrv."New value: +"Time window to filter observations to. Accepts a whole year (`2020`), a quarter (`2020Q1`), or a month (`2020M03`), or a range of two periods of the same type separated by a colon, earliest first (`2010:2023`, `2020Q1:2021Q4`, `2020M01:2020M06`). A window and an observation match whenever the periods overlap, so a year window also selects the quarters and months inside it. A window covering no part of the series returns zero observations rather than the full series. Mutually exclusive with mrv."
      • addedInput schema / properties / date_range / pattern
        Added value: +"^\\s*(?:\\d{4}(?::\\d{4})?|\\d{4}[Qq][1-4](?::\\d{4}[Qq][1-4])?|\\d{4}[Mm](?:0[1-9]|1[0-2])(?::\\d{4}[Mm](?:0[1-9]|1[0-2]))?)?\\s*$"
      • changedInput schema / properties / mrv / description
        Previous value: -"Return the N most recent available values (1–10). Mutually exclusive with date_range."New value: +"Return the N most recent available values per country (1–100), clamped upstream to the length of the series. Rows are mrv × countries, so page through them with per_page. Mutually exclusive with date_range."
      • changedInput schema / properties / mrv / maximum
        Previous value: -10New value: +100
  16. 1 tool update
    • Changedworldbank_search_indicators1 field changed
      • changedInput schema / properties / query / description
        Previous 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

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    5
    1
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    Provides LLM agents direct access to World Bank development indicators, enabling search, validation, and retrieval of data on topics like GDP, poverty, and gender equality.
    43
    -
  • A
    license
    A
    quality
    D
    maintenance
    Provides 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.
    5
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.