Skip to main content
Glama

Server Details

Query IMF SDMX 3.0 macroeconomic dataflows — WEO, BOP, CPI, exchange rates, 190 countries.

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 60 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/imf-mcp-server
GitHub Stars
1
Server Listing
imf-mcp-server

TDQS

A4.5/5.0

Scored across 5 tools

Disambiguation4/5

Each tool has a distinct target: listing dataflows, fetching dimension metadata, querying a dataflow, describing staged tables, and SQL-querying staged tables. The only mild overlap is between imf_get_database and imf_dataframe_describe (both surface schema/names), and between imf_query_dataset and imf_dataframe_query (both 'query'), but the descriptions clearly separate SDMX vs DataCanvas contexts.

Naming Consistency4/5

All names use snake_case with a consistent imf_ prefix, which is strong. However, the verb ordering deviates in two tools: list_databases/get_database/query_dataset are verb_noun, while dataframe_describe and dataframe_query are noun_verb, a minor inconsistency.

Tool Count5/5

Five tools is well-scoped for an IMF SDMX query server, with each tool earning its place in the discover-then-query workflow. No redundant or filler tools.

Completeness4/5

The surface covers the full flow: list dataflows, resolve dimension codes, query data, and analyze spilled results via DataCanvas. The dataframe tools are conditionally available only when DataCanvas is enabled and there is no direct tool to verify availability, a minor gap agents can work around via guidance fields.

Available Tools

5 tools
imf_dataframe_describeImf Dataframe DescribeA
Read-onlyIdempotent
Inspect

List DataCanvas tables and columns staged by a prior imf_query_dataset call. Returns each table's name, row count, and column schema (name + DuckDB type). Required before imf_dataframe_query to discover the table and column names for SQL.

ParametersJSON Schema
NameRequiredDescriptionDefault
canvas_idYesCanvas ID returned by imf_query_dataset whenever staged=true, from automatic spillover or output_mode="canvas".

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
tablesNoAll tables registered on this canvas.
canvas_idNoCanvas session ID that was introspected.
table_countNoTotal number of tables on the canvas.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds meaningful behavioral context by clarifying the dependency on a prior imf_query_dataset call and specifying what is returned (table name, row count, column schema). It does not go into pagination or error behavior, but that is minor given the annotations and output schema.

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 with no filler: the first states the action and return content, the second states the prerequisite. The most important operational detail (required before imf_dataframe_query) is placed at the end but is still concise and clearly separated from the functional description.

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?

The description is complete for an introspection tool: it explains what the tool lists, what the output includes, and why an agent needs it before querying. The output schema exists, annotations cover safety, and the single parameter is fully documented. Nothing critical is missing for correct invocation.

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?

The only parameter, canvas_id, is fully documented in the schema with a description that already explains its origin and valid values. The tool description reinforces the staging context but does not add new parameter-level meaning beyond what the schema provides. Since schema coverage is 100%, the baseline of 3 is appropriate.

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 uses a specific verb ('List') and identifies the precise resource: DataCanvas tables and columns staged by a prior imf_query_dataset call. It also clearly differentiates this tool from siblings like imf_dataframe_query and imf_query_dataset by framing it as the discovery step for staged data.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool: 'Required before imf_dataframe_query to discover the table and column names for SQL.' This gives the agent a clear prerequisite relationship and tells it why this tool exists in the workflow.

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

imf_dataframe_queryImf Dataframe Query
Read-onlyIdempotent
Inspect

Run a read-only SQL SELECT against a DataCanvas table staged by imf_query_dataset. Supports multi-country comparisons, time-series aggregation, and cross-indicator joins. Requires imf_dataframe_describe first to discover table and column names. One SELECT statement per call; a leading WITH … SELECT (CTE) is accepted. DML and DDL are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
sqlYesRead-only SQL SELECT statement — exactly one statement, starting with SELECT or with a WITH … SELECT common table expression. Reference tables by the names returned by imf_dataframe_describe. Example: SELECT time_period, value FROM spilled_abc123 WHERE time_period >= '2010' ORDER BY time_period.
canvas_idYesCanvas ID returned by imf_query_dataset whenever staged=true. Call imf_dataframe_describe with it before writing SQL.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNoLargest result-row prefix whose complete structured and formatted response fits the 100,000-character response budget, after the canvas row limit (default 10,000) is applied. Values and column names are always whole here; when a single row only fits with its long cells or column names clipped in the formatted table, listed there one name: value line per column, or replaced there by a one-line pointer to this field, it is returned alone.
errorNoPresent when the call failed. Absent on success.
row_countNoNumber of materialized rows returned in rows. Always equals rows.length and never claims a pre-cap total.
truncatedNoTrue when DataCanvas capped the query at its row limit or the server omitted materialized rows to fit the response-size budget. Page the remainder with a stable ORDER BY plus LIMIT/OFFSET, or narrow the query with WHERE or aggregation.
imf_get_databaseImf Get Database
Read-onlyIdempotent
Inspect

Fetch a dataflow's dimension list with a codelist preview for each dimension. Resolves human-readable terms to SDMX codes (e.g. "United States" → USA, "Constant prices" → NGDP_RPCH). Required before imf_query_dataset — SDMX keys are opaque without codelist lookups. Each codelist is capped at the first 50 entries by default, including previews filtered by codelist_filter. Set dimension_id to retrieve one codelist with bounded limit/offset paging after the optional codelist_filter, which keeps codes whose ID or name contains every word given. Set available_only=true to page codes the dataflow actually publishes, with series and time coverage metadata; availability filtering happens before codelist_filter and paging. The imf://database/{dataflow_id} resource provides the same bounded discovery summary. Country codes are ISO 3-letter (USA, GBR, DEU), not ISO 2-letter (US, GB, DE). The key_format field shows the exact dimension order required by imf_query_dataset. Note: codelists enumerate the code universe, not actual coverage — valid codes can still return no_data if the combination has no series in this dataflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoEntries to return from the selected dimension. Valid only with dimension_id; default 50. One call returns at most 200, so a larger limit (up to 50,000) returns 200, echoes requested_limit and applied_limit, and next_offset names the rest.
offsetNoMatching entries to skip in the selected dimension before this page. Valid only with dimension_id; default 0.
versionNoDataflow version, e.g. 9.0.0. Auto-detected from the dataflow list when omitted.
agency_idNoAgency ID that publishes this dataflow, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from the dataflow list when omitted.
dataflow_idYesDataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI.
dimension_idNoExact dimension ID from this tool, e.g. INDICATOR. Select one dimension to page beyond its preview.
available_onlyNoReturn only codes reported by the dataflow-wide availability constraint. Default false keeps ordinary codelist discovery unchanged.
codelist_filterNoOptional words to search for in each dimension's codelist, split on spaces and commas. A code matches when every word appears, case-insensitively, in its code ID or name; different words may match different fields. Filtering runs before the 50-entry preview or selected-dimension page. Example: "CPI", "GDP constant prices", or "NGDP_RPCH percent" surfaces matching WEO indicator codes.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoHuman-readable dataflow name.
errorNoPresent when the call failed. Absent on success.
noticeNoPopulated when a codelist_filter matched no entries anywhere, or when a dimension has no resolvable codelist, or when offset is past the final match.
sourceNoAttribution string required by IMF data terms: "Source: International Monetary Fund, <dataflow name>, <link>".
versionNoDataflow version string, e.g. 9.0.0.
agency_idNoAgency that publishes this dataflow, e.g. IMF.RES, IMF.STA.
truncatedNoTrue when any returned dimension page omits matching codes.
dimensionsNoAll dimension previews, or the one selected dimension page.
key_formatNoDimension names in dot-separated keyPosition order, e.g. COUNTRY.INDICATOR.FREQUENCY. Use this exact format when constructing the key for imf_query_dataset.
dataflow_idNoDataflow identifier, e.g. WEO, BOP, CPI.
descriptionNoThis dataflow's own description in full — not the shared DSD's, and not the shortened preview imf_list_databases returns for the same id. Absent when the dataflow publishes none.
dsd_versionNoVersion of the underlying data structure definition (DSD) that backs this dataflow. Differs from version when the dataflow references a shared DSD (e.g. IIP → DSD_BOP at 24.0.0).
dimension_idNoSelected dimension ID. Absent when previews for every dimension were returned.
series_countNoTotal series published by the dataflow. Present when available_only is true.
applied_limitNoThe limit the selected dimension's page was cut to — the per-call maximum of 200 — echoed beside requested_limit.
structure_refNoIdentifier of the underlying DSD, e.g. DSD_BOP. Several dataflows can share one DSD.
available_onlyNoTrue when dimensions contain published availability coverage rather than codelists.
codelist_filterNoEcho of the codelist_filter that produced this result. Absent when no filter was applied — an empty codelist then means the codelist could not be resolved, not that the filter missed.
requested_limitNoThe limit requested, echoed only when it exceeded the per-call maximum of 200.
time_period_endNoLatest period with published data, or null when the constraint omits it.
time_period_startNoEarliest period with published data, or null when the constraint omits it.
imf_list_databasesImf List Databases
Read-onlyIdempotent
Inspect

List IMF SDMX dataflows available on the portal. Entry point for every query: imf_get_database and imf_query_dataset both require a dataflow id obtained here. Vintage (historical snapshot) dataflows such as WEO_2025_OCT_VINTAGE are excluded by default; set include_vintages=true to include them. Results are paged — 50 per call by default and at most 200, adjustable with limit and offset — and total_count reports how many dataflows matched. Descriptions are shortened here; imf_get_database returns the full text for a single dataflow.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum dataflows to return in this call. Default 50; one call returns at most 200, so a larger limit (up to 1,000) returns 200 and echoes requested_limit and applied_limit. total_count reports how many matched, so a partial page is always recognizable as one.
filterNoOptional words to filter results by, split on spaces and commas. A dataflow matches when every word appears, case-insensitively, somewhere in its ID, name, or full description. Example: "exchange rate" returns ER and related dataflows; "WEO outlook" returns WEO and the regional outlooks built on it.
offsetNoNumber of matching dataflows to skip before this page. Combine with limit to page through a broad or unfiltered catalog.
include_vintagesNoInclude vintage (historical snapshot) dataflows such as WEO_2025_OCT_VINTAGE. Default false — vintages are excluded to keep the discovery surface clean.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that bounded this page.
errorNoPresent when the call failed. Absent on success.
shownNoDataflows returned in this page.
noticeNoPopulated when the filter matches nothing, or when matches remain beyond this page — explains why and names the next offset to request.
offsetNoNumber of matching dataflows skipped before this page.
dataflowsNoThis page of matching dataflows; pass the id to imf_get_database to resolve dimension codelists.
truncatedNoTrue when matching dataflows remain beyond this page.
total_countNoDataflows matching filter and include_vintages, before limit and offset are applied. Exceeds returned_count when more pages remain.
applied_limitNoThe limit this page was cut to — the per-call maximum of 200 — echoed beside requested_limit.
returned_countNoDataflows in this page — the length of dataflows.
requested_limitNoThe limit requested, echoed only when it exceeded the per-call maximum of 200.
imf_query_datasetImf Query Dataset
Read-onlyIdempotent
Inspect

Query an IMF SDMX dataflow by dimension key over a time range. Returns observations with time_period, value, and status, plus the unit, scale, and decimals of each series — a key resolving to several series carries one entry per series in series_metadata, since unit and scale differ between them. An index series also carries the reference_period it is based on (e.g. 2010A, 2010=100) exactly as published, on the series and, where the dataflow publishes one per observation, on each observation. Requires imf_get_database first to obtain the correct key_format and valid dimension codes. Country codes are ISO 3-letter (USA, GBR, DEU — not US, GB, DE). Key format: dot-separated codes in DSD keyPosition order (e.g. USA.NGDP_RPCH.A for WEO). Every position must carry a code: use + to combine codes (e.g. USA+GBR.NGDP_RPCH.A) and * to match every code at a position (e.g. *.NGDP_RPCH.A for all countries); * stands alone and cannot join a + list. Codes are matched case-insensitively and checked against each dimension's codelist before the query — an unknown code is rejected with the nearest valid codes. Codelists from imf_get_database enumerate the code universe, not actual coverage — valid codes can still return no_data if the combination has no series. When a + key returns data for some requested series and none for others, missing_series names each empty one with the reason a query for it alone gives (no_data or no_data_in_range). When the extra request that recovers the unit, scale, or decimals a + key suppresses fails, unresolved_attributes names them and how to get them. start_period and end_period must be valid period strings (YYYY, YYYY-SN, YYYY-QN, YYYY-MM, or a calendar-valid YYYY-MM-DD) with start_period no later than end_period; malformed or reversed ranges are rejected. A bound covers the whole period it names, so end_period 2023 includes 2023-M12 and 2023-Q4. last_n_observations keeps each series' last N observations — 1 is each series' latest value, the cheap way to ask many countries for their latest figure. Values are in base units everywhere, staged canvas rows included: scale is the power of ten the IMF publishes a series in (value / 10^scale is the published figure), never a factor still to apply. A response is held to 100,000 serialized characters. With DataCanvas enabled (CANVAS_PROVIDER_TYPE=duckdb), a larger result (multi-country, long time range) spills to it: call imf_dataframe_describe first to inspect staged tables and columns, then imf_dataframe_query for SQL analysis. Without DataCanvas, a larger result returns its earliest observations with truncated=true, and retrieval_guidance names the last period returned and how to narrow the query.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesDot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. A * stands alone at its position — combined with other codes (USA+*) it is rejected. Codes are trimmed and matched case-insensitively (usa resolves to USA), empty and repeated + members are dropped (USA++GBR+USA is queried as USA+GBR, and notice says so), and the response echoes the canonical key. A code missing from its dimension's codelist is rejected before the query, naming the nearest valid codes. The portal limits the request URL, so a + list of a few hundred codes is rejected as too long — use * there, or split the codes across calls. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE.
versionNoDataflow version, e.g. 9.0.0. Auto-detected from dataflow list when omitted.
agency_idNoAgency ID, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from dataflow list when omitted.
canvas_idNoExisting canvas ID to accumulate results into across multiple queries. This selects the destination only; it does not force staging. Use output_mode="canvas" to stage an under-budget result.
end_periodNoEnd of time range (inclusive). Same formats as start_period, and must not be earlier than it. The bound covers the whole period it names, so end_period 2023 admits 2023-M12 and 2023-Q4. Observations after this period are excluded from the result.
dataflow_idYesDataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. Matched case-insensitively; the response echoes the catalog spelling.
output_modeNoResult placement. auto returns an under-budget result inline and spills only when needed. canvas explicitly stages the full result, using canvas_id when supplied or allocating a fresh canvas.auto
start_periodNoStart of time range (inclusive). Accepts any of YYYY (annual), YYYY-SN (semi-annual, e.g. 2023-S1), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly), or a calendar-valid YYYY-MM-DD (daily), whatever the dataflow's frequency. The bound covers the whole period it names, so start_period 2023 admits 2023-M01 and 2023-Q1. Observations before this period are excluded from the result.
last_n_observationsNoKeep only each series' last N observations, an integer from 1 to 1,000,000; 1 returns each series' latest value. Latest is per series: series end at different periods, and a WEO series ends in its projection years (e.g. 2031), so set end_period to stop at a past year. With start_period or end_period, the last N inside that range. A series with fewer than N observations is returned whole. Omit to return every observation.

Output Schema

ParametersJSON Schema
NameRequiredDescription
keyNoDimension key used in the query, trimmed and with each code in its codelist spelling, e.g. USA.NGDP_RPCH.A.
errorNoPresent when the call failed. Absent on success.
noticeNoPopulated when empty or duplicate + members were dropped from key (naming each position and the key queried), or when a period bound was set but some observations carry a time_period label the range filter does not recognize; both texts appear when both apply. Composes with retrieval_guidance, staged or not, when both apply.
sourceNoAttribution string required by IMF data terms: "Source: International Monetary Fund, <dataflow name>, <link>".
stagedNoTrue when the complete observation set is stored on DataCanvas. canvas_id and table_name are present whenever true.
canvas_idNoDataCanvas session ID — present when staged=true. Pass first to imf_dataframe_describe, then to imf_dataframe_query.
truncatedNoTrue only when observations is an incomplete preview of observation_count. A result can be staged=true and truncated=false when every observation also fits inline, and staged=false and truncated=true when DataCanvas is not enabled and the full result exceeds the response budget.
end_periodNoLatest period covered; absent when the full available range was used.
table_nameNoDuckDB table name on the canvas — present when staged=true; reference in SQL via FROM <table_name>.
dataflow_idNoDataflow identifier that was queried, in its catalog spelling, e.g. WEO.
observationsNoInline observations, oldest period first. When truncated=true this is the budget-limited time-ascending prefix of the result; observation_count remains the full count.
start_periodNoEarliest period covered; absent when the full available range was used.
missing_seriesNoRequested series of a + key that returned no observation while others did, in key order, at most 20. A requested series is each combination of the codes listed at every position. Counted over the full result, so a series left out of a truncated preview is not listed. Absent when every requested series returned.
series_metadataNoPer-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Unit and scale differ across series in one query — WEO NGDPD is USD published in billions (scale 9) while NGDP_RPCH is PT at scale 0 — so interpret each series against its own entry.
observation_countNoTotal observations in the result, after any last_n_observations selection.
series_attributesNoAttributes of the first series in the result — the same series as series_metadata[0]. A key with + or * resolves to several series whose scale and unit differ, and this field describes only the first of them: read series_metadata for the rest, and never apply these values to another series_key.
retrieval_guidanceNoPresent on every staged result, where it names the imf_dataframe_describe-before-imf_dataframe_query retrieval workflow, and on a result truncated without DataCanvas, where it names the last time_period returned and how to narrow the query for the rest.
last_n_observationsNoThe last_n_observations input, echoed when set: observations holds each series' last N in the range. Absent when every observation was returned.
missing_series_countNoHow many requested series returned no observation — the full count when missing_series stops at 20. Present with missing_series.
unresolved_attributesNoPresent only when a + key on the dimension an attribute is grouped by made the portal leave unit, scale, or decimals out, and the extra request that recovers them failed. A listed attribute that is null is then unknown, not unpublished. Absent when that request found no value — the dataflow publishes none — or was not needed.

Tool Schema Changelog

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

  1. 4 tool updates
    • Changedimf_dataframe_query4 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled). `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong. `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error. `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist. `response_too_large`: The first result row cannot fit in the complete structured and formatted response budget. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled). `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong. `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error. `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, plans an operator outside the read-only allowlist, or names a file instead of a staged table. `sql_execution_error`: sql prepares but fails while it runs, such as a failed cast or an arithmetic overflow. `response_too_large`: The first result row alone exceeds the response budget as structured content, even with the formatted text reduced to a one-line pointer to it. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_not_found",
        -  "missing_table",
        -  "invalid_sql",
        -  "sql_not_permitted",
        -  "response_too_large"
        -]New value: +[
        +  "canvas_not_found",
        +  "missing_table",
        +  "invalid_sql",
        +  "sql_not_permitted",
        +  "sql_execution_error",
        +  "response_too_large"
        +]
      • changedOutput schema / properties / rows / description
        Previous value: -"Largest result-row prefix whose complete structured and formatted response fits the 100,000-character response budget, after the canvas row limit (default 10,000) is applied."New value: +"Largest result-row prefix whose complete structured and formatted response fits the 100,000-character response budget, after the canvas row limit (default 10,000) is applied. Values and column names are always whole here; when a single row only fits with its long cells or column names clipped in the formatted table, listed there one name: value line per column, or replaced there by a one-line pointer to this field, it is returned alone."
      • changedOutput schema / properties / rows / items / description
        Previous value: -"A result row — keys are the selected column names, values match the column DuckDB types (string, number, null)."New value: +"A result row — keys are the selected column names; values are the JSON form of each DuckDB type: number, string (BIGINT, DECIMAL, and dates included), boolean, null, or an object/array for STRUCT, LIST, and MAP."
    • Changedimf_get_database6 fields changed
      • changedInput schema / properties / agency_id / description
        Previous value: -"Agency ID that publishes this dataflow, e.g. IMF.RES or IMF.STA. Auto-detected from the dataflow list when omitted."New value: +"Agency ID that publishes this dataflow, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from the dataflow list when omitted."
      • changedInput schema / properties / limit / description
        Previous value: -"Entries to return from the selected dimension. Valid only with dimension_id; default 50, maximum 200."New value: +"Entries to return from the selected dimension. Valid only with dimension_id; default 50. One call returns at most 200, so a larger limit (up to 50,000) returns 200, echoes requested_limit and applied_limit, and next_offset names the rest."
      • changedInput schema / properties / limit / maximum
        Previous value: -200New value: +50000
      • addedOutput schema / properties / applied_limit
        Added value: +{
        +  "description": "The limit the selected dimension's page was cut to — the per-call maximum of 200 — echoed beside requested_limit.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow. `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted. `availability_unavailable`: available_only is true and the dataflow-wide availability constraint cannot be fetched or parsed. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id matches no catalog dataflow on api.imf.org, or none under the agency_id and version given. `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow. `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted. `availability_unavailable`: available_only is true and the dataflow-wide availability constraint cannot be fetched or parsed. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The limit requested, echoed only when it exceeded the per-call maximum of 200.",
        +  "type": "number"
        +}
    • Changedimf_list_databases4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum dataflows to return in this call. Default 50, ceiling 200; total_count reports how many matched, so a partial page is always recognizable as one."New value: +"Maximum dataflows to return in this call. Default 50; one call returns at most 200, so a larger limit (up to 1,000) returns 200 and echoes requested_limit and applied_limit. total_count reports how many matched, so a partial page is always recognizable as one."
      • changedInput schema / properties / limit / maximum
        Previous value: -200New value: +1000
      • addedOutput schema / properties / applied_limit
        Added value: +{
        +  "description": "The limit this page was cut to — the per-call maximum of 200 — echoed beside requested_limit.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / requested_limit
        Added value: +{
        +  "description": "The limit requested, echoed only when it exceeded the per-call maximum of 200.",
        +  "type": "number"
        +}
    • Changedimf_query_dataset15 fields changed
      • changedInput schema / properties / agency_id / description
        Previous value: -"Agency ID, e.g. IMF.RES or IMF.STA. Auto-detected from dataflow list when omitted."New value: +"Agency ID, e.g. IMF.RES or IMF.STA, matched case-insensitively. Auto-detected from dataflow list when omitted."
      • changedInput schema / properties / key / description
        Previous value: -"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. A * stands alone at its position — combined with other codes (USA+*) it is rejected. Codes are trimmed and matched case-insensitively (usa resolves to USA), and the response echoes the canonical key. A code missing from its dimension's codelist is rejected before the query, naming the nearest valid codes. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."New value: +"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. A * stands alone at its position — combined with other codes (USA+*) it is rejected. Codes are trimmed and matched case-insensitively (usa resolves to USA), empty and repeated + members are dropped (USA++GBR+USA is queried as USA+GBR, and notice says so), and the response echoes the canonical key. A code missing from its dimension's codelist is rejected before the query, naming the nearest valid codes. The portal limits the request URL, so a + list of a few hundred codes is rejected as too long — use * there, or split the codes across calls. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."
      • changedInput schema / properties / last_n_observations / description
        Previous value: -"Keep only each series' last N observations, an integer from 1 to 10,000; 1 returns each series' latest value. Latest is per series: series end at different periods, and a WEO series ends in its projection years (e.g. 2031), so set end_period to stop at a past year. With start_period or end_period, the last N inside that range. A series with fewer than N observations is returned whole. Omit to return every observation."New value: +"Keep only each series' last N observations, an integer from 1 to 1,000,000; 1 returns each series' latest value. Latest is per series: series end at different periods, and a WEO series ends in its projection years (e.g. 2031), so set end_period to stop at a past year. With start_period or end_period, the last N inside that range. A series with fewer than N observations is returned whole. Omit to return every observation."
      • changedInput schema / properties / last_n_observations / maximum
        Previous value: -10000New value: +1000000
      • changedInput schema / properties / version / description
        Previous value: -"Dataflow version. Auto-detected from dataflow list when omitted."New value: +"Dataflow version, e.g. 9.0.0. Auto-detected from dataflow list when omitted."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all. `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them. `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count. `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream. `wildcard_in_code_list`: A key position combines * with other codes in a + list, where the portal ignores the * and returns only the listed codes. `invalid_key_code`: A key code is not in its dimension's codelist, checked before any data request. `invalid_period_format`: start_period or end_period is not one of the recognized period formats. `invalid_period_range`: start_period is later than end_period. `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully. `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled. `response_too_large`: The fixed part of the result — full series_metadata, plus the retrieval handle when staging — exceeds the response budget before any observation can be included. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id matches no catalog dataflow on api.imf.org, or none under the agency_id and version given. `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all. `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them. `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count. `empty_key_segment`: A dot-separated position in key is empty or blank, or holds only empty + members (USA.NGDP_RPCH.+), which matches no series upstream. `wildcard_in_code_list`: A key position combines * with other codes in a + list, where the portal ignores the * and returns only the listed codes. `invalid_key_code`: A key code is not in its dimension's codelist, checked before any data request. `key_too_long`: The IMF portal refused the data request because its URL is too long — a + list of a few hundred codes at one position. `invalid_period_format`: start_period or end_period is not one of the recognized period formats. `invalid_period_range`: start_period is later than end_period. `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully. `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled. `response_too_large`: The fixed part of the result — full series_metadata, plus the retrieval handle when staging — exceeds the response budget before any observation can be included. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted. `data_unavailable`: The data request failed after its retries — the portal answered 5xx or an unusable body, could not be reached, or timed out — or the call spent its 45-second budget for upstream requests. `rate_limited`: The IMF portal answered the data request with HTTP 429 after its retries. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataflow_not_found",
        -  "no_data",
        -  "no_data_in_range",
        -  "key_dimension_mismatch",
        -  "empty_key_segment",
        -  "wildcard_in_code_list",
        -  "invalid_key_code",
        -  "invalid_period_format",
        -  "invalid_period_range",
        -  "structure_unavailable",
        -  "canvas_unavailable",
        -  "response_too_large",
        -  "dataflow_list_unavailable"
        -]New value: +[
        +  "dataflow_not_found",
        +  "no_data",
        +  "no_data_in_range",
        +  "key_dimension_mismatch",
        +  "empty_key_segment",
        +  "wildcard_in_code_list",
        +  "invalid_key_code",
        +  "key_too_long",
        +  "invalid_period_format",
        +  "invalid_period_range",
        +  "structure_unavailable",
        +  "canvas_unavailable",
        +  "response_too_large",
        +  "dataflow_list_unavailable",
        +  "data_unavailable",
        +  "rate_limited"
        +]
      • addedOutput schema / properties / missing_series
        Added value: +{
        +  "description": "Requested series of a + key that returned no observation while others did, in key order, at most 20. A requested series is each combination of the codes listed at every position. Counted over the full result, so a series left out of a truncated preview is not listed. Absent when every requested series returned.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "One requested series the result does not carry.",
        +    "properties": {
        +      "available_range": {
        +        "additionalProperties": false,
        +        "description": "With no_data_in_range: the window the series covers.",
        +        "properties": {
        +          "first": {
        +            "description": "Earliest time_period the series has.",
        +            "type": "string"
        +          },
        +          "last": {
        +            "description": "Latest time_period the series has.",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "first",
        +          "last"
        +        ],
        +        "type": "object"
        +      },
        +      "reason": {
        +        "description": "What a query for this series alone reports: no_data when it has no observations at all, no_data_in_range when it has some, but none inside start_period/end_period.",
        +        "enum": [
        +          "no_data",
        +          "no_data_in_range"
        +        ],
        +        "type": "string"
        +      },
        +      "series_key": {
        +        "description": "A requested series that returned no observation: one code per key position, * where the key has *, e.g. ASM.NGDP_RPCH.A.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "series_key",
        +      "reason"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / missing_series_count
        Added value: +{
        +  "description": "How many requested series returned no observation — the full count when missing_series stops at 20. Present with missing_series.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize. Composes with retrieval_guidance, staged or not, when both apply."New value: +"Populated when empty or duplicate + members were dropped from key (naming each position and the key queried), or when a period bound was set but some observations carry a time_period label the range filter does not recognize; both texts appear when both apply. Composes with retrieval_guidance, staged or not, when both apply."
      • addedOutput schema / properties / observations / items / properties / reference_period
        Added value: +{
        +  "description": "This observation's own reference (base) period, exactly as published, e.g. 2010A or 2010M1. Present only when the observation carries one (CPI and GS_LEPM publish it); where the series-level value reads Multiple, it varies by observation. Never filled in from the series.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / series_attributes / properties / reference_period
        Added value: +{
        +  "description": "Reference (base) period of an index series, exactly as published: free text such as 2010A, 2016M12, 2010=100, or Multiple (the observations carry their own). Present only when the series carries one; never parsed as a time_period.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / series_metadata / items / description
        Previous value: -"Unit, scale, and decimals for one series in the result."New value: +"Unit, scale, decimals, and reference period for one series in the result."
      • addedOutput schema / properties / series_metadata / items / properties / reference_period
        Added value: +{
        +  "description": "This series' reference (base) period, exactly as published, e.g. 2010A or 2010=100. Present only when the series carries one.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / unresolved_attributes
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when a + key on the dimension an attribute is grouped by made the portal leave unit, scale, or decimals out, and the extra request that recovers them failed. A listed attribute that is null is then unknown, not unpublished. Absent when that request found no value — the dataflow publishes none — or was not needed.",
        +  "properties": {
        +    "concepts": {
        +      "description": "Attributes the recovery request failed to bring back, e.g. [\"unit\"].",
        +      "items": {
        +        "enum": [
        +          "unit",
        +          "scale",
        +          "decimals"
        +        ],
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "guidance": {
        +      "description": "How to get them: retry, or query the key with a * it names (or a * at one position), which matches every code there, so keep only the series requested.",
        +      "type": "string"
        +    },
        +    "series_count": {
        +      "description": "Series in the result whose value for a listed attribute is null.",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "concepts",
        +    "series_count",
        +    "guidance"
        +  ],
        +  "type": "object"
        +}
  2. 3 tool updates
    • Changedimf_get_database2 fields changed
      • changedInput schema / properties / codelist_filter / description
        Previous value: -"Optional case-insensitive substring to search within each dimension's codelist (code ID and name). Filtering runs before the 50-entry preview or selected-dimension page. Example: \"CPI\" or \"Constant prices\" surfaces matching WEO indicator codes."New value: +"Optional words to search for in each dimension's codelist, split on spaces and commas. A code matches when every word appears, case-insensitively, in its code ID or name; different words may match different fields. Filtering runs before the 50-entry preview or selected-dimension page. Example: \"CPI\", \"GDP constant prices\", or \"NGDP_RPCH percent\" surfaces matching WEO indicator codes."
      • changedInput schema / properties / dataflow_id / description
        Previous value: -"Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. Case-sensitive."New value: +"Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI."
    • Changedimf_list_databases1 field changed
      • changedInput schema / properties / filter / description
        Previous value: -"Optional name, ID, or description substring to filter results. Case-insensitive. Example: \"exchange rate\" returns ER and related dataflows."New value: +"Optional words to filter results by, split on spaces and commas. A dataflow matches when every word appears, case-insensitively, somewhere in its ID, name, or full description. Example: \"exchange rate\" returns ER and related dataflows; \"WEO outlook\" returns WEO and the regional outlooks built on it."
    • Changedimf_query_dataset18 fields changed
      • changedInput schema / properties / dataflow_id / description
        Previous value: -"Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI."New value: +"Dataflow identifier from imf_list_databases, e.g. WEO, BOP, CPI. Matched case-insensitively; the response echoes the catalog spelling."
      • changedInput schema / properties / key / description
        Previous value: -"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."New value: +"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. A * stands alone at its position — combined with other codes (USA+*) it is rejected. Codes are trimmed and matched case-insensitively (usa resolves to USA), and the response echoes the canonical key. A code missing from its dimension's codelist is rejected before the query, naming the nearest valid codes. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."
      • addedInput schema / properties / last_n_observations
        Added value: +{
        +  "description": "Keep only each series' last N observations, an integer from 1 to 10,000; 1 returns each series' latest value. Latest is per series: series end at different periods, and a WEO series ends in its projection years (e.g. 2031), so set end_period to stop at a past year. With start_period or end_period, the last N inside that range. A series with fewer than N observations is returned whole. Omit to return every observation.",
        +  "maximum": 10000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / dataflow_id / description
        Previous value: -"Dataflow identifier that was queried, e.g. WEO."New value: +"Dataflow identifier that was queried, in its catalog spelling, e.g. WEO."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all. `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them. `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count. `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream. `invalid_period_format`: start_period or end_period is not one of the recognized period formats. `invalid_period_range`: start_period is later than end_period. `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully. `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled. `response_too_large`: Fixed staged-result metadata exceeds the response budget before any observation preview can be included. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all. `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them. `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count. `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream. `wildcard_in_code_list`: A key position combines * with other codes in a + list, where the portal ignores the * and returns only the listed codes. `invalid_key_code`: A key code is not in its dimension's codelist, checked before any data request. `invalid_period_format`: start_period or end_period is not one of the recognized period formats. `invalid_period_range`: start_period is later than end_period. `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully. `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled. `response_too_large`: The fixed part of the result — full series_metadata, plus the retrieval handle when staging — exceeds the response budget before any observation can be included. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataflow_not_found",
        -  "no_data",
        -  "no_data_in_range",
        -  "key_dimension_mismatch",
        -  "empty_key_segment",
        -  "invalid_period_format",
        -  "invalid_period_range",
        -  "structure_unavailable",
        -  "canvas_unavailable",
        -  "response_too_large",
        -  "dataflow_list_unavailable"
        -]New value: +[
        +  "dataflow_not_found",
        +  "no_data",
        +  "no_data_in_range",
        +  "key_dimension_mismatch",
        +  "empty_key_segment",
        +  "wildcard_in_code_list",
        +  "invalid_key_code",
        +  "invalid_period_format",
        +  "invalid_period_range",
        +  "structure_unavailable",
        +  "canvas_unavailable",
        +  "response_too_large",
        +  "dataflow_list_unavailable"
        +]
      • changedOutput schema / properties / key / description
        Previous value: -"Dimension key used in the query, e.g. USA.NGDP_RPCH.A."New value: +"Dimension key used in the query, trimmed and with each code in its codelist spelling, e.g. USA.NGDP_RPCH.A."
      • addedOutput schema / properties / last_n_observations
        Added value: +{
        +  "description": "The last_n_observations input, echoed when set: observations holds each series' last N in the range. Absent when every observation was returned.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / notice / description
        Previous value: -"Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize. Composes with staged retrieval_guidance when both apply."New value: +"Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize. Composes with retrieval_guidance, staged or not, when both apply."
      • changedOutput schema / properties / observation_count / description
        Previous value: -"Total observations in the result."New value: +"Total observations in the result, after any last_n_observations selection."
      • changedOutput schema / properties / observations / description
        Previous value: -"Inline observation preview. For staged results this may contain the full set or a budget-limited prefix; observation_count remains the full count."New value: +"Inline observations, oldest period first. When truncated=true this is the budget-limited time-ascending prefix of the result; observation_count remains the full count."
      • changedOutput schema / properties / observations / items / properties / status / description
        Previous value: -"Observation status flag, e.g. E (estimate) or null when absent."New value: +"Observation status flag exactly as the dataflow publishes it, e.g. T, B, C, or NA; null when the observation carries none. The flags are not a shared vocabulary across dataflows. A null value with no status, or whose only status is the not-available marker NA or n.a. (any letter case), is omitted as padding; a null value with any other status is returned."
      • changedOutput schema / properties / observations / items / properties / value / description
        Previous value: -"Observation value, null when missing."New value: +"Observation value in base units, e.g. 29298025000000 for US GDP of $29.3 trillion; null when missing. The series' scale is already reflected in it: never apply scale to this value."
      • changedOutput schema / properties / retrieval_guidance / description
        Previous value: -"Present on every staged result. Identifies the imf_dataframe_describe-before-imf_dataframe_query retrieval workflow."New value: +"Present on every staged result, where it names the imf_dataframe_describe-before-imf_dataframe_query retrieval workflow, and on a result truncated without DataCanvas, where it names the last time_period returned and how to narrow the query for the rest."
      • changedOutput schema / properties / series_attributes / properties / scale / description
        Previous value: -"Scale multiplier as the upstream code, e.g. 9 for billions. \"0\" means no multiplier — the values are unscaled."New value: +"Power of ten the IMF publishes this series in, as the upstream code: \"9\" is billions, \"6\" millions, \"0\" units. Observation values are already in base units, so the published figure is value / 10^scale."
      • changedOutput schema / properties / series_metadata / description
        Previous value: -"Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Unit and scale differ across series in one query — WEO NGDPD is USD at scale 9 while NGDP_RPCH is PT unscaled — so interpret each series against its own entry."New value: +"Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Unit and scale differ across series in one query — WEO NGDPD is USD published in billions (scale 9) while NGDP_RPCH is PT at scale 0 — so interpret each series against its own entry."
      • changedOutput schema / properties / series_metadata / items / properties / scale / description
        Previous value: -"Scale multiplier for this series as the upstream code, e.g. 9 for billions. \"0\" means no multiplier."New value: +"Power of ten the IMF publishes this series in, as the upstream code: \"9\" is billions, \"0\" units. This series' observation values are already in base units."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True only when observations is an incomplete preview of observation_count. A result can be staged=true and truncated=false when every observation also fits inline."New value: +"True only when observations is an incomplete preview of observation_count. A result can be staged=true and truncated=false when every observation also fits inline, and staged=false and truncated=true when DataCanvas is not enabled and the full result exceeds the response budget."
  3. 5 tool updates
    • Changedimf_dataframe_describe2 fields changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled). Other values are possible when a failure originates below the handler."
    • Changedimf_dataframe_query2 fields changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist `response_too_large`: The first result row cannot fit in the complete structured and formatted response budget Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled). `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong. `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error. `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist. `response_too_large`: The first result row cannot fit in the complete structured and formatted response budget. Other values are possible when a failure originates below the handler."
    • Changedimf_get_database5 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted `availability_unavailable`: available_only is true and the dataflow-wide availability constraint cannot be fetched or parsed Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow. `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted. `availability_unavailable`: available_only is true and the dataflow-wide availability constraint cannot be fetched or parsed. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / time_period_end / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / time_period_end / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / time_period_start / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / time_period_start / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedimf_list_databases1 field changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_list_unavailable`: The IMF SDMX structure endpoint that backs the dataflow catalog did not return a usable response Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_list_unavailable`: The IMF SDMX structure endpoint that backs the dataflow catalog did not return a usable response. Other values are possible when a failure originates below the handler."
    • Changedimf_query_dataset18 fields changed
      • addedInput schema / properties / canvas_id / pattern
        Added value: +"^[A-Za-z0-9_-]{10}$"
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream `invalid_period_format`: start_period or end_period is not one of the recognized period formats `invalid_period_range`: start_period is later than end_period `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled `response_too_large`: Fixed staged-result metadata exceeds the response budget before any observation preview can be included `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org. `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all. `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them. `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count. `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream. `invalid_period_format`: start_period or end_period is not one of the recognized period formats. `invalid_period_range`: start_period is later than end_period. `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully. `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled. `response_too_large`: Fixed staged-result metadata exceeds the response budget before any observation preview can be included. `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted. Other values are possible when a failure originates below the handler."
      • removedOutput schema / properties / observations / items / properties / status / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / status / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / observations / items / properties / value / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / observations / items / properties / value / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / series_attributes / properties / decimals / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_attributes / properties / decimals / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / series_attributes / properties / scale / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_attributes / properties / scale / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / series_attributes / properties / unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_attributes / properties / unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / series_metadata / items / properties / decimals / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_metadata / items / properties / decimals / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / series_metadata / items / properties / scale / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_metadata / items / properties / scale / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / series_metadata / items / properties / unit / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series_metadata / items / properties / unit / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  4. 2 tool updates
    • Changedimf_get_database11 fields changed
      • addedInput schema / properties / available_only
        Added value: +{
        +  "default": false,
        +  "description": "Return only codes reported by the dataflow-wide availability constraint. Default false keeps ordinary codelist discovery unchanged.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / available_only
        Added value: +{
        +  "const": true,
        +  "description": "True when dimensions contain published availability coverage rather than codelists.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / dimensions / items / description
        Previous value: -"A single dimension with its codelist."New value: +"A single dimension with its codelist or published availability coverage."
      • addedOutput schema / properties / dimensions / items / properties / available_count
        Added value: +{
        +  "description": "Codes reported with published data before codelist_filter. Present when available_only is true.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / dimensions / items / properties / codelist / description
        Previous value: -"Valid codes for this dimension. Unselected previews show up to 50 entries after optional filtering. Select dimension_id and use limit/offset for a bounded page of up to 200 entries. Empty means the filter matched nothing when codelist_filter is echoed back, and that the codelist could not be resolved when it is not — see notice."New value: +"Valid codelist codes for this dimension, or codes reported with published data when available_only is true. Unselected previews show up to 50 entries after optional filtering. Select dimension_id and use limit/offset for a bounded page of up to 200 entries. Empty means the filter matched nothing when codelist_filter is echoed back, no coverage was reported in availability mode, or the codelist could not be resolved in normal mode — see notice."
      • changedOutput schema / properties / dimensions / items / properties / unfiltered_count / description
        Previous value: -"Codes in the complete resolved codelist before codelist_filter is applied."New value: +"Source codes before codelist_filter: the complete resolved codelist normally, or published codes when available_only is true."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted `availability_unavailable`: available_only is true and the dataflow-wide availability constraint cannot be fetched or parsed Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataflow_not_found",
        -  "dimension_not_found",
        -  "structure_unavailable",
        -  "dataflow_list_unavailable"
        -]New value: +[
        +  "dataflow_not_found",
        +  "dimension_not_found",
        +  "structure_unavailable",
        +  "dataflow_list_unavailable",
        +  "availability_unavailable"
        +]
      • addedOutput schema / properties / series_count
        Added value: +{
        +  "description": "Total series published by the dataflow. Present when available_only is true.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / time_period_end
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Latest period with published data, or null when the constraint omits it."
        +}
      • addedOutput schema / properties / time_period_start
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Earliest period with published data, or null when the constraint omits it."
        +}
    • Changedimf_list_databases1 field changed
      • addedInput schema / properties / filter / minLength
        Added value: +1
  5. 1 tool update
    • Changedimf_dataframe_query5 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist `response_too_large`: The first result row cannot fit in the complete structured and formatted response budget Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "canvas_not_found",
        -  "missing_table",
        -  "invalid_sql",
        -  "sql_not_permitted"
        -]New value: +[
        +  "canvas_not_found",
        +  "missing_table",
        +  "invalid_sql",
        +  "sql_not_permitted",
        +  "response_too_large"
        +]
      • changedOutput schema / properties / row_count / description
        Previous value: -"Number of rows materialized in rows. Equals the canvas row limit when truncated is true — DataCanvas does not report a pre-cap total, so this is never larger than rows.length."New value: +"Number of materialized rows returned in rows. Always equals rows.length and never claims a pre-cap total."
      • changedOutput schema / properties / rows / description
        Previous value: -"Query result rows, capped at the canvas row limit (default 10,000)."New value: +"Largest result-row prefix whose complete structured and formatted response fits the 100,000-character response budget, after the canvas row limit (default 10,000) is applied."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the query matched more rows than the canvas row limit and the result was capped. Page the remainder with a stable ORDER BY plus LIMIT/OFFSET, or narrow the query with WHERE or aggregation."New value: +"True when DataCanvas capped the query at its row limit or the server omitted materialized rows to fit the response-size budget. Page the remainder with a stable ORDER BY plus LIMIT/OFFSET, or narrow the query with WHERE or aggregation."
  6. 3 tool updates
    • Changedimf_dataframe_describe1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID returned by imf_query_dataset when results were too large for inline delivery."New value: +"Canvas ID returned by imf_query_dataset whenever staged=true, from automatic spillover or output_mode=\"canvas\"."
    • Changedimf_dataframe_query1 field changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Canvas ID returned by imf_query_dataset when results were too large for inline delivery."New value: +"Canvas ID returned by imf_query_dataset whenever staged=true. Call imf_dataframe_describe with it before writing SQL."
    • Changedimf_query_dataset13 fields changed
      • changedInput schema / properties / canvas_id / description
        Previous value: -"Existing canvas ID to accumulate results into across multiple queries. Omit to allocate a fresh canvas; the response includes a canvas_id when results spill to DataCanvas."New value: +"Existing canvas ID to accumulate results into across multiple queries. This selects the destination only; it does not force staging. Use output_mode=\"canvas\" to stage an under-budget result."
      • addedInput schema / properties / output_mode
        Added value: +{
        +  "default": "auto",
        +  "description": "Result placement. auto returns an under-budget result inline and spills only when needed. canvas explicitly stages the full result, using canvas_id when supplied or allocating a fresh canvas.",
        +  "enum": [
        +    "auto",
        +    "canvas"
        +  ],
        +  "type": "string"
        +}
      • changedInput schema / properties / start_period / description
        Previous value: -"Start of time range (inclusive). Accepts any of YYYY (annual), YYYY-SN (semi-annual, e.g. 2023-S1), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly), or YYYY-MM-DD (daily), whatever the dataflow's frequency. The bound covers the whole period it names, so start_period 2023 admits 2023-M01 and 2023-Q1. Observations before this period are excluded from the result."New value: +"Start of time range (inclusive). Accepts any of YYYY (annual), YYYY-SN (semi-annual, e.g. 2023-S1), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly), or a calendar-valid YYYY-MM-DD (daily), whatever the dataflow's frequency. The bound covers the whole period it names, so start_period 2023 admits 2023-M01 and 2023-Q1. Observations before this period are excluded from the result."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "dataflow_id",
        -      "key",
        -      "observations",
        -      "series_attributes",
        -      "observation_count",
        -      "truncated",
        -      "source"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dataflow_id",
        +      "key",
        +      "observations",
        +      "series_attributes",
        +      "observation_count",
        +      "staged",
        +      "truncated",
        +      "source"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / canvas_id / description
        Previous value: -"DataCanvas session ID — present when truncated=true. Pass to imf_dataframe_query or imf_dataframe_describe to query the full result."New value: +"DataCanvas session ID — present when staged=true. Pass first to imf_dataframe_describe, then to imf_dataframe_query."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream `invalid_period_format`: start_period or end_period is not one of the recognized period formats `invalid_period_range`: start_period is later than end_period `structure_unavailable`: api.imf.org returns non-200 on the data endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream `invalid_period_format`: start_period or end_period is not one of the recognized period formats `invalid_period_range`: start_period is later than end_period `structure_unavailable`: The dataflow structure (DSD) cannot be fetched after the dataflow catalog resolved successfully `canvas_unavailable`: output_mode=\"canvas\" was requested but DataCanvas is disabled `response_too_large`: Fixed staged-result metadata exceeds the response budget before any observation preview can be included `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataflow_not_found",
        -  "no_data",
        -  "no_data_in_range",
        -  "key_dimension_mismatch",
        -  "empty_key_segment",
        -  "invalid_period_format",
        -  "invalid_period_range",
        -  "structure_unavailable",
        -  "dataflow_list_unavailable"
        -]New value: +[
        +  "dataflow_not_found",
        +  "no_data",
        +  "no_data_in_range",
        +  "key_dimension_mismatch",
        +  "empty_key_segment",
        +  "invalid_period_format",
        +  "invalid_period_range",
        +  "structure_unavailable",
        +  "canvas_unavailable",
        +  "response_too_large",
        +  "dataflow_list_unavailable"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize — those rows are returned unfiltered, so the requested range did not apply to them."New value: +"Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize. Composes with staged retrieval_guidance when both apply."
      • changedOutput schema / properties / observations / description
        Previous value: -"Inline observations. Empty when results spilled to canvas (see canvas_id / table_name)."New value: +"Inline observation preview. For staged results this may contain the full set or a budget-limited prefix; observation_count remains the full count."
      • addedOutput schema / properties / retrieval_guidance
        Added value: +{
        +  "description": "Present on every staged result. Identifies the imf_dataframe_describe-before-imf_dataframe_query retrieval workflow.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / staged
        Added value: +{
        +  "description": "True when the complete observation set is stored on DataCanvas. canvas_id and table_name are present whenever true.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / table_name / description
        Previous value: -"DuckDB table name on the canvas — present when truncated=true; reference in SQL via FROM <table_name>."New value: +"DuckDB table name on the canvas — present when staged=true; reference in SQL via FROM <table_name>."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when the result exceeded the inline limit and was staged on a DataCanvas table; canvas_id and table_name are populated and imf_dataframe_query provides SQL access to the full set."New value: +"True only when observations is an incomplete preview of observation_count. A result can be staged=true and truncated=false when every observation also fits inline."
  7. 1 tool update
    • Changedimf_get_database20 fields changed
      • changedInput schema / properties / codelist_filter / description
        Previous value: -"Optional case-insensitive substring to search within each dimension's codelist (code ID and name). When set, returns all matching entries per dimension instead of the first-50 window — useful for large codelists like WEO INDICATOR (145 entries). Example: \"CPI\" or \"PCPIPCH\" surfaces consumer price index codes without hitting the 50-entry cap."New value: +"Optional case-insensitive substring to search within each dimension's codelist (code ID and name). Filtering runs before the 50-entry preview or selected-dimension page. Example: \"CPI\" or \"Constant prices\" surfaces matching WEO indicator codes."
      • addedInput schema / properties / codelist_filter / minLength
        Added value: +1
      • addedInput schema / properties / dimension_id
        Added value: +{
        +  "description": "Exact dimension ID from this tool, e.g. INDICATOR. Select one dimension to page beyond its preview.",
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Entries to return from the selected dimension. Valid only with dimension_id; default 50, maximum 200.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Matching entries to skip in the selected dimension before this page. Valid only with dimension_id; default 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "dataflow_id",
        -      "agency_id",
        -      "version",
        -      "name",
        -      "key_format",
        -      "dimensions",
        -      "source"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "dataflow_id",
        +      "agency_id",
        +      "version",
        +      "name",
        +      "key_format",
        +      "truncated",
        +      "dimensions",
        +      "source"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / dimension_id
        Added value: +{
        +  "description": "Selected dimension ID. Absent when previews for every dimension were returned.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / dimensions / description
        Previous value: -"All dimensions of this dataflow with their codelists."New value: +"All dimension previews, or the one selected dimension page."
      • changedOutput schema / properties / dimensions / items / properties / codelist / description
        Previous value: -"Valid codes for this dimension. Up to 50 entries shown when no codelist_filter is set; use codelist_filter to search large codelists or the imf://database resource for the full list. Empty means the filter matched nothing when codelist_filter is echoed back, and that the codelist could not be resolved when it is not — see notice."New value: +"Valid codes for this dimension. Unselected previews show up to 50 entries after optional filtering. Select dimension_id and use limit/offset for a bounded page of up to 200 entries. Empty means the filter matched nothing when codelist_filter is echoed back, and that the codelist could not be resolved when it is not — see notice."
      • changedOutput schema / properties / dimensions / items / properties / codelist_truncated / description
        Previous value: -"True when the codelist has more than 50 entries and was truncated."New value: +"True when matching codes were omitted before or after this page."
      • addedOutput schema / properties / dimensions / items / properties / matched_count
        Added value: +{
        +  "description": "Codes matching codelist_filter before limit and offset are applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / dimensions / items / properties / next_offset
        Added value: +{
        +  "description": "Offset for the next page when later matching codes remain.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / dimensions / items / properties / offset
        Added value: +{
        +  "description": "Matching codes skipped before this dimension page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / dimensions / items / properties / returned_count
        Added value: +{
        +  "description": "Codes returned in this dimension page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / dimensions / items / properties / unfiltered_count
        Added value: +{
        +  "description": "Codes in the complete resolved codelist before codelist_filter is applied.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / dimensions / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "position",
        -  "codelist",
        -  "codelist_truncated"
        -]New value: +[
        +  "id",
        +  "name",
        +  "position",
        +  "codelist",
        +  "codelist_truncated",
        +  "unfiltered_count",
        +  "matched_count",
        +  "returned_count",
        +  "offset"
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `dimension_not_found`: dimension_id does not match a dimension in the selected dataflow `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "dataflow_not_found",
        -  "structure_unavailable",
        -  "dataflow_list_unavailable"
        -]New value: +[
        +  "dataflow_not_found",
        +  "dimension_not_found",
        +  "structure_unavailable",
        +  "dataflow_list_unavailable"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"Populated when a codelist_filter matched no entries anywhere, or when a dimension has no resolvable codelist — the two produce the same empty array and need opposite next steps."New value: +"Populated when a codelist_filter matched no entries anywhere, or when a dimension has no resolvable codelist, or when offset is past the final match."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when any returned dimension page omits matching codes.",
        +  "type": "boolean"
        +}
  8. 5 tool updates
    • Changedimf_dataframe_describe6 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": [
        +      "canvas_id",
        +      "tables",
        +      "table_count"
        +    ]
        +  },
        +  {
        +    "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: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_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: -[
        -  "canvas_id",
        -  "tables",
        -  "table_count"
        -]
    • Changedimf_dataframe_query6 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": [
        +      "rows",
        +      "row_count",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "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: `canvas_not_found`: canvas_id does not match any registered DataCanvas session (expired, wrong session, or canvas disabled) `missing_table`: The canvas exists but sql references a table that is not staged on it — the table expired, was dropped, or the name is wrong `invalid_sql`: sql is not a single SELECT statement (a leading WITH … SELECT counts as one), or it is SELECT-shaped but fails to prepare — unknown column, unknown function, or a syntax error `sql_not_permitted`: sql parses as a SELECT but the read-only gate refuses it — it calls an external-data or PRAGMA table function, reads a system catalog, or plans an operator outside the read-only allowlist Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "canvas_not_found",
        +            "missing_table",
        +            "invalid_sql",
        +            "sql_not_permitted"
        +          ],
        +          "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: -[
        -  "rows",
        -  "row_count",
        -  "truncated"
        -]
    • Changedimf_get_database6 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": [
        +      "dataflow_id",
        +      "agency_id",
        +      "version",
        +      "name",
        +      "key_format",
        +      "dimensions",
        +      "source"
        +    ]
        +  },
        +  {
        +    "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: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `structure_unavailable`: api.imf.org returns non-200 on the DSD endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD lookup is attempted Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "dataflow_not_found",
        +            "structure_unavailable",
        +            "dataflow_list_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: -[
        -  "dataflow_id",
        -  "agency_id",
        -  "version",
        -  "name",
        -  "key_format",
        -  "dimensions",
        -  "source"
        -]
    • Changedimf_list_databases6 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": [
        +      "dataflows",
        +      "total_count",
        +      "returned_count",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "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: `dataflow_list_unavailable`: The IMF SDMX structure endpoint that backs the dataflow catalog did not return a usable response Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "dataflow_list_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: -[
        -  "dataflows",
        -  "total_count",
        -  "returned_count",
        -  "offset"
        -]
    • Changedimf_query_dataset6 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": [
        +      "dataflow_id",
        +      "key",
        +      "observations",
        +      "series_attributes",
        +      "observation_count",
        +      "truncated",
        +      "source"
        +    ]
        +  },
        +  {
        +    "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: `dataflow_not_found`: dataflow_id does not match any known dataflow on api.imf.org `no_data`: Key is structurally valid but the dataflow holds no series for this code combination, or the dataflow publishes no series at all `no_data_in_range`: The key returned observations but start_period/end_period excluded every one of them `key_dimension_mismatch`: Number of dot-separated segments in key does not match the dataflow's DSD dimension count `empty_key_segment`: A dot-separated position in key is empty or blank, which matches no series upstream `invalid_period_format`: start_period or end_period is not one of the recognized period formats `invalid_period_range`: start_period is later than end_period `structure_unavailable`: api.imf.org returns non-200 on the data endpoint `dataflow_list_unavailable`: The dataflow catalog that dataflow_id is resolved against could not be fetched — fires before the DSD and data lookups are attempted Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "dataflow_not_found",
        +            "no_data",
        +            "no_data_in_range",
        +            "key_dimension_mismatch",
        +            "empty_key_segment",
        +            "invalid_period_format",
        +            "invalid_period_range",
        +            "structure_unavailable",
        +            "dataflow_list_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: -[
        -  "dataflow_id",
        -  "key",
        -  "observations",
        -  "series_attributes",
        -  "observation_count",
        -  "truncated",
        -  "source"
        -]
  9. 1 tool update
    • Changedimf_query_dataset3 fields changed
      • changedOutput schema / properties / series_attributes / properties / unit / description
        Previous value: -"Unit of measure, e.g. Percent, USD."New value: +"Unit of measure as the upstream code, e.g. PT (percent), USD, XDC (domestic currency), NUM (count). Null when the response carries no unit for the series — many dataflows publish none."
      • changedOutput schema / properties / series_metadata / description
        Previous value: -"Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Scale differs across series in one query — WEO NGDPD is scale 9 while NGDP_RPCH is unscaled — so interpret each series against its own entry."New value: +"Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Unit and scale differ across series in one query — WEO NGDPD is USD at scale 9 while NGDP_RPCH is PT unscaled — so interpret each series against its own entry."
      • changedOutput schema / properties / series_metadata / items / properties / unit / description
        Previous value: -"Unit of measure for this series, e.g. Percent."New value: +"Unit of measure for this series as the upstream code, e.g. PT (percent), USD, XDC (domestic currency). Null when the response carries none for it."
  10. 3 tool updates
    • Changedimf_get_database1 field changed
      • changedOutput schema / properties / description / description
        Previous value: -"This dataflow's own description, matching what imf_list_databases reports for the same id — not the shared DSD's. Absent when the dataflow publishes none."New value: +"This dataflow's own description in full — not the shared DSD's, and not the shortened preview imf_list_databases returns for the same id. Absent when the dataflow publishes none."
    • Changedimf_list_databases12 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Maximum dataflows to return in this call. Default 50, ceiling 200; total_count reports how many matched, so a partial page is always recognizable as one.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Number of matching dataflows to skip before this page. Combine with limit to page through a broad or unfiltered catalog.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit that bounded this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / dataflows / description
        Previous value: -"Matching dataflows; pass the id to imf_get_database to resolve dimension codelists."New value: +"This page of matching dataflows; pass the id to imf_get_database to resolve dimension codelists."
      • changedOutput schema / properties / dataflows / items / properties / description / description
        Previous value: -"Extended description of the dataflow, if available."New value: +"Short description, cut to 200 characters and ended with … when longer. imf_get_database and the imf://database/{dataflow_id} resource return the full text."
      • changedOutput schema / properties / notice / description
        Previous value: -"Populated when the filter matches nothing — explains why and suggests next steps."New value: +"Populated when the filter matches nothing, or when matches remain beyond this page — explains why and names the next offset to request."
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "Number of matching dataflows skipped before this page.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / returned_count
        Added value: +{
        +  "description": "Dataflows in this page — the length of dataflows.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Dataflows returned in this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / total_count / description
        Previous value: -"Total number of matching dataflows returned."New value: +"Dataflows matching filter and include_vintages, before limit and offset are applied. Exceeds returned_count when more pages remain."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when matching dataflows remain beyond this page.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "dataflows",
        -  "total_count"
        -]New value: +[
        +  "dataflows",
        +  "total_count",
        +  "returned_count",
        +  "offset"
        +]
    • Changedimf_query_dataset3 fields changed
      • changedOutput schema / properties / series_attributes / description
        Previous value: -"Series-level attributes (unit, scale, decimals)."New value: +"Attributes of the first series in the result — the same series as series_metadata[0]. A key with + or * resolves to several series whose scale and unit differ, and this field describes only the first of them: read series_metadata for the rest, and never apply these values to another series_key."
      • changedOutput schema / properties / series_attributes / properties / scale / description
        Previous value: -"Scale multiplier, e.g. Billions."New value: +"Scale multiplier as the upstream code, e.g. 9 for billions. \"0\" means no multiplier — the values are unscaled."
      • addedOutput schema / properties / series_metadata
        Added value: +{
        +  "description": "Per-series attributes, one entry per distinct series_key in the result. Present only when the query resolved to more than one series; a single-series query carries its values in series_attributes instead. Scale differs across series in one query — WEO NGDPD is scale 9 while NGDP_RPCH is unscaled — so interpret each series against its own entry.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "Unit, scale, and decimals for one series in the result.",
        +    "properties": {
        +      "decimals": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Number of decimal places shown for this series."
        +      },
        +      "scale": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Scale multiplier for this series as the upstream code, e.g. 9 for billions. \"0\" means no multiplier."
        +      },
        +      "series_key": {
        +        "description": "Series these attributes belong to, matching observations[].series_key.",
        +        "type": "string"
        +      },
        +      "unit": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "description": "Unit of measure for this series, e.g. Percent."
        +      }
        +    },
        +    "required": [
        +      "series_key",
        +      "unit",
        +      "scale",
        +      "decimals"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  11. 2 tool updates
    • Changedimf_get_database1 field changed
      • changedOutput schema / properties / description / description
        Previous value: -"Extended description, if available."New value: +"This dataflow's own description, matching what imf_list_databases reports for the same id — not the shared DSD's. Absent when the dataflow publishes none."
    • Changedimf_query_dataset5 fields changed
      • changedInput schema / properties / end_period / description
        Previous value: -"End of time range (inclusive). Same format as start_period, and must be greater than or equal to start_period. Observations after this period are excluded from the result."New value: +"End of time range (inclusive). Same formats as start_period, and must not be earlier than it. The bound covers the whole period it names, so end_period 2023 admits 2023-M12 and 2023-Q4. Observations after this period are excluded from the result."
      • changedInput schema / properties / key / description
        Previous value: -"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to specify multiple codes (e.g. USA+GBR.NGDP_RPCH.A). Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."New value: +"Dot-separated dimension codes in DSD keyPosition order. Call imf_get_database to get key_format and valid codes first. Use + to combine codes at one position (e.g. USA+GBR.NGDP_RPCH.A). Use * to match every code at a position — *.NGDP_RPCH.A returns the indicator for all countries, and CAN.*.A every indicator for Canada. Every position needs a code or a *; an empty segment (USA..A) is rejected. Country codes are ISO 3-letter: USA not US, GBR not GB, DEU not DE."
      • changedInput schema / properties / start_period / description
        Previous value: -"Start of time range (inclusive). Format matches the dataflow frequency: YYYY (annual), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly). Observations before this period are excluded from the result."New value: +"Start of time range (inclusive). Accepts any of YYYY (annual), YYYY-SN (semi-annual, e.g. 2023-S1), YYYY-QN (quarterly, e.g. 2023-Q1), YYYY-MM (monthly), or YYYY-MM-DD (daily), whatever the dataflow's frequency. The bound covers the whole period it names, so start_period 2023 admits 2023-M01 and 2023-Q1. Observations before this period are excluded from the result."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Populated when a period bound was set but some observations carry a time_period label the range filter does not recognize — those rows are returned unfiltered, so the requested range did not apply to them.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / observations / items / properties / time_period / description
        Previous value: -"Time label as emitted by the upstream API. Annual: YYYY (e.g. 2023). Quarterly: YYYY-QN (e.g. 2023-Q1). Monthly: YYYY-MNN (e.g. 2023-M01, not YYYY-MM). start_period/end_period accept both YYYY-MM and YYYY-MNN for monthly comparisons."New value: +"Time label as emitted by the upstream API. Annual: YYYY (e.g. 2023). Semi-annual: YYYY-SN (e.g. 2023-S1). Quarterly: YYYY-QN (e.g. 2023-Q1). Monthly: YYYY-MNN (e.g. 2023-M01, not YYYY-MM). Daily: YYYY-MM-DD (e.g. 2023-01-05). Every one of these is also accepted as a start_period/end_period bound, so a label from this field can be passed straight back in."
  12. 1 tool update
    • Changedimf_get_database4 fields changed
      • addedOutput schema / properties / codelist_filter
        Added value: +{
        +  "description": "Echo of the codelist_filter that produced this result. Absent when no filter was applied — an empty codelist then means the codelist could not be resolved, not that the filter missed.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / dimensions / items / properties / codelist / description
        Previous value: -"Valid codes for this dimension. Up to 50 entries shown when no codelist_filter is set; use codelist_filter to search large codelists or the imf://database resource for the full list."New value: +"Valid codes for this dimension. Up to 50 entries shown when no codelist_filter is set; use codelist_filter to search large codelists or the imf://database resource for the full list. Empty means the filter matched nothing when codelist_filter is echoed back, and that the codelist could not be resolved when it is not — see notice."
      • changedOutput schema / properties / dimensions / items / properties / name / description
        Previous value: -"Human-readable dimension name."New value: +"Human-readable dimension label from the DSD concept scheme, e.g. Weight Type for WGT_TYPE. Falls back to the dimension id when the structure names no concept."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Populated when a codelist_filter matched no entries anywhere, or when a dimension has no resolvable codelist — the two produce the same empty array and need opposite next steps.",
        +  "type": "string"
        +}
  13. 1 tool update
    • Changedimf_dataframe_query4 fields changed
      • changedInput schema / properties / sql / description
        Previous value: -"Read-only SQL SELECT statement. Must start with SELECT. Reference tables by the names returned by imf_dataframe_describe. Example: SELECT time_period, value FROM spilled_abc123 WHERE time_period >= '2010' ORDER BY time_period."New value: +"Read-only SQL SELECT statement — exactly one statement, starting with SELECT or with a WITH … SELECT common table expression. Reference tables by the names returned by imf_dataframe_describe. Example: SELECT time_period, value FROM spilled_abc123 WHERE time_period >= '2010' ORDER BY time_period."
      • changedOutput schema / properties / row_count / description
        Previous value: -"Total matching rows before the cap — may exceed rows.length."New value: +"Number of rows materialized in rows. Equals the canvas row limit when truncated is true — DataCanvas does not report a pre-cap total, so this is never larger than rows.length."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when the query matched more rows than the canvas row limit and the result was capped. Page the remainder with a stable ORDER BY plus LIMIT/OFFSET, or narrow the query with WHERE or aggregation.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "rows",
        -  "row_count"
        -]New value: +[
        +  "rows",
        +  "row_count",
        +  "truncated"
        +]
  14. 1 tool update
    • Changedimf_query_dataset1 field changed
      • changedInput schema / properties / end_period / description
        Previous value: -"End of time range (inclusive). Same format as start_period. Observations after this period are excluded from the result."New value: +"End of time range (inclusive). Same format as start_period, and must be greater than or equal to start_period. Observations after this period are excluded from the result."
  15. 1 tool update
    • Changedimf_get_database2 fields changed
      • addedOutput schema / properties / dsd_version
        Added value: +{
        +  "description": "Version of the underlying data structure definition (DSD) that backs this dataflow. Differs from version when the dataflow references a shared DSD (e.g. IIP → DSD_BOP at 24.0.0).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / structure_ref
        Added value: +{
        +  "description": "Identifier of the underlying DSD, e.g. DSD_BOP. Several dataflows can share one DSD.",
        +  "type": "string"
        +}

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to query cross-country macroeconomic and financial statistics, including GDP, inflation, fiscal balance, debt, exchange rates, trade, and balance-of-payments data for comparison and time-series analysis.
    20 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables searching, exploring, and querying over 1,500 OECD statistical datasets via SDMX, covering national accounts, employment, trade, PISA, health, and more.
    95 npm
    2
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying Bank for International Settlements central-bank and global financial statistics via the SDMX v2 API, including credit-to-GDP gaps, curated dataflows, and full registry search with dataset fetching, without authentication.
    224 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to European Central Bank statistical data through SDMX data flows, enabling querying and listing of data flows via natural language or direct tool calls.
    1 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.