Releases: cyanheads/imf-mcp-server
Release list
v0.2.4: imf_query_dataset period validation
imf_query_dataset period validation
Reject malformed/reversed start_period and end_period before the upstream IMF call.
Fixed:
imf_query_datasetrejects malformedstart_period/end_periodand reversed ranges asValidationError(invalid_period_format,invalid_period_range) before calling IMF (#11)docs/design.md:key_dimension_mismatchandinvalid_sqlcorrected fromInvalidParamstoValidationError, matching source (#14)
83 tests pass; bun run devcheck clean.
v0.2.3: mcp-ts-core 0.10.14, shared-DSD codelist + identity fixes, stale-count sweep
mcp-ts-core 0.10.14, shared-DSD codelist + identity fixes, stale-count sweep
Adopts @cyanheads/mcp-ts-core ^0.10.14 with a bun install supply-chain guard; fixes imf_get_database codelist resolution and dataflow identity for shared IMF DSDs.
Added:
dsd_version/structure_refoptional output fields onimf_get_databaseand theimf://database/{dataflow_id}resource (#12)
Fixed:
- Codelist resolution for
_PUB-suffixed and shared IMF DSDs — DSD resolved via thestructureURN on the dataflow itself, not aDSD_<flow>guess; a 204 response is now a definitive miss instead of exhausting the retry budget (#10) - Dataflow identity (name/version/agencyId) no longer overwritten by shared DSD metadata (#12)
Changed:
- Dropped the stale hardcoded
193dataflow count from the tool description and package/plugin metadata (#13)
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.9 → ^0.10.14js-yaml3.14.2 → 3.15.0 (transitive; clears GHSA-h67p-54hq-rp68)
79 tests pass; bun run devcheck clean.
v0.2.2: mcp-ts-core ^0.10.9 adoption
mcp-ts-core ^0.10.9 adoption
Framework maintenance pass — adopts the 0.10.7–0.10.9 delta, re-syncs agent skills and devcheck scripts.
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.6 → ^0.10.9@duckdb/node-api^1.5.3-r.3 → ^1.5.4-r.1@types/node^25.9.3 → ^26.0.0vitest^4.1.8 → ^4.1.9
Changed:
DuckdbProvider.describe({ tableName })binder-error fix — filtered describe() no longer raises an ambiguous-column Binder Error on canvas table-list queries- Canvas SQL gate classifies SELECT-shaped prepare failures as
invalid_sqlwith DuckDB binder detail, notnon_select_statement ctx.contentcollector for image/audio blocks added to the framework Context
Added:
check-dependency-specifiersdevcheck step — fails on floating specifiers in package.json + bun.lock workspaces- Plugin-manifest packaging checks via
devcheck.config.jsonpackaging.pluginManifests
69 tests pass; bun run devcheck clean.
v0.2.1: mcp-ts-core ^0.10.6 adoption, MCPB bundle cleaner
mcp-ts-core ^0.10.6 adoption, MCPB bundle cleaner
Adopts framework 0.10.x APIs and adds packaging guards so the .mcpb bundle
ships no dependency agent docs.
Added:
- scripts/clean-mcpb.ts — post-pack cleaner strips node_modules/** agent docs (skills/, .claude/, .agents/, SKILL.md) the .mcpbignore patterns cannot reach
- lint-packaging bundle-content and identity guards
- check-framework-antipatterns rule flagging z.coerce.boolean() on env flags
Changed:
- imf_list_databases notice moved to the enrichment block (ctx.enrich.notice())
- imf_dataframe_query / imf_query_dataset: invalid_sql and key_dimension_mismatch now ValidationError
- imf_dataframe_query canvas query sets denySystemCatalogs: true
- createApp() name/title set to imf-mcp-server
- Dockerfile: APP_VERSION OCI label, .cache canvas dir, /healthz HEALTHCHECK
- plugin npx args use the scoped name @cyanheads/imf-mcp-server
Dependency bumps:
- @cyanheads/mcp-ts-core ^0.9.21 → ^0.10.6
- @biomejs/biome ^2.4.16 → ^2.5.0
69 tests pass; bun run devcheck clean.
v0.2.0: codelist_filter, server-side period filtering, null-padding removal, availability enrichment
codelist_filter, server-side period filtering, null-padding removal, availability enrichment
Five issues addressed across imf_query_dataset and imf_get_database — makes period ranges, data coverage, and codelist discovery work as documented.
Added:
- imf_get_database
codelist_filter: case-insensitive substring over code ID and name; returns all matches uncapped — bypasses the 50-entry ceiling for large codelists like WEO INDICATOR (#8) - imf_query_dataset availability enrichment: on empty result, queries SDMX 2.1 availableconstraint before throwing no_data; series_count=0 states the code is not covered; series_count>0 reports per-dimension available codes and time range; degrades gracefully on fetch failure (#5)
Changed:
- imf_query_dataset period filtering: start_period/end_period now filter server-side post-fetch, before canvas spill; handles upstream YYYY-MNN monthly format vs YYYY-MM input via normalizePeriod (#6)
- imf_query_dataset null-padding removal: observations with both value=null and status=null dropped; rows with non-null status kept; all-null result falls through to no_data (#7)
- imf_list_databases filter description: corrected from 'name or ID' to 'name, ID, or description' — behavior was already correct (#9)
- imf_dataframe_describe / imf_dataframe_query canvas_not_found recovery: removed CANVAS_PROVIDER_TYPE env-var hint; recovery now reads 'Re-run imf_query_dataset to obtain a fresh canvas_id' (#9)
- @types/node ^25.9.2 -> ^25.9.3
70 tests pass; bun run devcheck clean.
v0.1.4: Three tool fixes
Three tool fixes
Fixed:
- imf_dataframe_query: SQL validation (invalid_sql) now fires before the canvas-existence check; DML/DDL rejected regardless of CANVAS_PROVIDER_TYPE (#2)
- imf_query_dataset: Scale "0" (IMF SDMX no-op sentinel for absent scale) suppressed from format() Series line; real unit/scale/decimals unaffected (#3)
- imf_list_databases: When a substring filter matches nothing, notice field is now populated in structuredContent and rendered as a blockquote in content[] — previously silent empty result (#4)
50 tests pass; bun run devcheck clean.
v0.1.3: Public hosted endpoint
Public hosted endpoint
Adds the public hosted instance at https://imf.caseyjhand.com/mcp.
Added:
server.jsonremotesarray with streamable-http entry for MCP Registry discovery- README centered hosted-server link block
- README "Public Hosted Instance" section with Streamable HTTP client config
Changed:
@types/node^25.9.1 → ^25.9.2
bun run devcheck clean; build succeeds.
v0.1.2: IMF source attribution in data-returning tool output
IMF source attribution in data-returning tool output
Both imf_query_dataset and imf_get_database now carry a source field
in structuredContent and format() output per IMF data terms.
Added:
- source field in imf_query_dataset output (inline and canvas-spill paths) with attribution string: "Source: International Monetary Fund, , https://data.imf.org/" (#1)
- source field in imf_get_database output with same attribution format (#1)
- Data source section in README documenting attribution requirement
42 tests pass; bun run devcheck clean.
v0.1.1: Initial public release — IMF SDMX 3.0, DataCanvas SQL, security hardening
Initial public release — IMF SDMX 3.0, DataCanvas SQL, security hardening
First public release of @cyanheads/imf-mcp-server. Wraps the IMF SDMX 3.0 API (keyless) with 5 tools and 1 resource for querying 193 macroeconomic dataflows across 190 countries, with DuckDB-backed DataCanvas for SQL analytics over large result sets.
Added:
- imf_list_databases — browse/filter 193 IMF SDMX dataflows
- imf_get_database — fetch full DSD (dimensions + codelists) for any dataflow
- imf_query_dataset — query by dimension key + time range; spills to DataCanvas when large
- imf_dataframe_describe, imf_dataframe_query — SQL analytics over staged canvas tables
- imf://database/{dataflow_id} resource — full dataflow metadata as JSON
- DataCanvas support (CANVAS_PROVIDER_TYPE=duckdb) for multi-country SQL comparisons
Security:
- Error messages in structure-fetch failures now expose only the dataflow ID, not the upstream API URL path
42 tests pass; bun run devcheck clean.