Releases: cyanheads/eurostat-mcp-server
Release list
v0.6.0: OBS_FLAG/CONF_STATUS split, confidential-slice no_results fix
OBS_FLAG/CONF_STATUS split, confidential-slice no_results fix
- Breaking: eurostat_query_dataset's observations[].status carries only OBS_FLAG now; confidentiality moves to a new confStatus field, and the staged dataframe table gains matching conf_status/conf_status_label columns (#35)
- Fixed: a dataset slice where every cell is confidential no longer wrongly raises no_results (#36)
- OBS_FLAG/CONF_STATUS dictionaries and measure column names consolidated into a shared eurostat-codelists module; both dataframe tool descriptions updated to match
v0.5.0: SDMX TSV bulk downloads
SDMX TSV bulk downloads
eurostat_download_datasetstreams the SDMX 2.1 TSV bulk endpoint and stages a whole dataset on the dataframe canvas — roughly half the bytes ofeurostat_query_dataset's JSON-stat body for the same data (#8)- New
EurostatBulkService: streaming gzip sniffing (no Content-Encoding header on compressed bodies), a byte budget enforced mid-transfer, SOAP-fault and async-queue-envelope classification, wide-to-long TSV expansion eurostat_query_dataset, both dataframe tools, and three other tool descriptions rewritten to route between a dataset slice and a whole download, and to flag that the two dataframe stagers disagree onobs_flag- docs: README, design doc, and plugin manifest updated for the new tool
v0.4.0: DataCanvas support for the dataframe tools
DataCanvas support for the dataframe tools
- eurostat_query_dataset stages a match past the 5,000-row inline cap onto an optional DuckDB canvas as a flat SQL table, reusing the response body already in memory — no extra request to Eurostat (#8)
- eurostat_dataframe_describe and eurostat_dataframe_query read the staged tables; both are gated off tools/list when CANVAS_PROVIDER_TYPE is not duckdb (#8)
- Dockerfile grants the non-root user writable canvas scratch/export directories; a scratch-directory permission failure now names CANVAS_TEMP_PATH instead of surfacing a bare EACCES
- deps: @duckdb/node-api ^1.5.5-r.3 added as a runtime dependency
v0.3.0: dimensions[].valuesCount/sampleValues become optional on dataset_info and the dataset resource
dimensions[].valuesCount/sampleValues become optional on dataset_info and the dataset resource
- Breaking:
eurostat_get_dataset_infooutput and theeurostat://dataset/{dataset_code}resource narrowdimensions[].valuesCount/sampleValuesto optional — a failed time-enumeration request now returns partial metadata instead of failing (#34) eurostat_query_dataset's 5,000-row cap now applies during decoding instead of after the full match is decoded, with totals from a separate cell scan (#27)eurostat_browse_themesresolves a folder code filed under more than one TOC branch to its first placement, with the other branches now disclosed viaotherPlacements(#32)
v0.2.0: Ten output fields become optional, and Eurostat's silence stops being fabricated as zero
Ten output fields become optional, and Eurostat's silence stops being fabricated as zero
- Breaking: 10 fields move required → optional across 3 schemas — eurostat_get_dataset_info's timeRange.start/end, obsCount, lastUpdated; the eurostat://dataset/{dataset_code} resource's same 4 fields; eurostat_query_dataset's timeRange.start/end (#30, #33)
- get_dataset_info's time-dimension valuesCount now reflects the dataset's real period count instead of a single-period artifact, at the cost of one bounded extra request (#21)
- get_dataset_info's async_response error is no longer retryable — its recovery hint now points at eurostat_search_datasets/eurostat_browse_themes/eurostat_get_dimension_values (#31)
- get_dimension_values rejects geo_level paired with a non-geo dimension instead of silently ignoring it (#25)
- query_dataset drops zero-length filter arrays before building the request and echoes the filters actually applied via a new appliedFilters field (#22)
- docs: design.md and README.md corrected for stale error-code labels, single-request description, and mutual-exclusion wording
v0.1.16: TOC cache TTL, cursor binding, and search fixes
TOC cache TTL, cursor binding, and search fixes
Catalogue caching and eurostat_search_datasets pagination/validation, plus mcp-ts-core ^0.11.1 adoption.
- Catalogue TOC now refreshes on a 12h TTL instead of caching for the process lifetime, with stale-on-error fallback (#23)
eurostat_search_datasetsdeduplicates matches by dataset code before pagination (#26)- Search cursors are bound to their query and catalogue snapshot; cross-query, malformed, or superseded cursors reject as
invalid_cursor(#28) - Whitespace-only search queries are now rejected instead of matching everything (#24)
eurostat_search_datasets/eurostat_browse_themesadvertiseopenWorldHint: true(#29)- skill/script resync, Dockerfile install hardening,
.mcpbbundle now strips native DuckDB bindings too - deps:
@cyanheads/mcp-ts-core^0.10.14 -> ^0.11.1 (+ typescript, biome, dev-dep bumps)
v0.1.15: Content parity, full-range dimension values, live error classification
Content parity, full-range dimension values, live error classification
Three bug fixes: content[]/structuredContent parity for two tools, complete time-range enumeration for get_dimension_values, and invalid-dimension error mapping on the live HTTP path.
Fixed:
eurostat_query_dataset/eurostat_browse_themescontent[] parity — removed the 200-row cap and its truncation note;hasChildrennow renders both boolean states (#15)eurostat_get_dimension_valuesfull time range — pins every other dimension to enumeratetime's complete range instead of the latest period only;geodefaults togeoLevel=country; adds a non-retryableasync_responseerror variant (#17)eurostat_query_datasetinvalid-dimension error classification — HTTP 400 (Eurostat error id 150) now maps to the declaredinvalid_dimensioncontract (ValidationError, -32007) instead of the raw HTTP error (#18)
156 tests pass; bun run devcheck clean.
v0.1.14: Discovery fixes + mcp-ts-core ^0.10.14 adoption
Discovery fixes + mcp-ts-core ^0.10.14 adoption
Tokenized multi-word search, cursor pagination, and nextStep hints for the search/browse tools; a multi-root theme-browse fix; framework/skill maintenance folded in.
Added:
eurostat_search_datasetscursor pagination — newcursorinput,nextCursor/truncatedenrichment,limitis now page size (#16)nextStephint oneurostat_search_datasetsandeurostat_browse_themesresults (#13)bunfig.tomlminimumReleaseAgeinstall guard +@socketsecurity/bun-security-scanner;.gitattributes;.github/SECURITY.md
Changed:
- Dropped hardcoded "8,933 datasets" / "11 top-level themes" from tool descriptions and docs (#19)
@cyanheads/mcp-ts-core^0.10.9 → ^0.10.14 — ctx.state.getMany, ctx.elicit.url, ctx.enrich helpers, ctx.content collector- Skills re-synced; 12 metadata.version bumps
- Dockerfile: oven/bun 1.3.14, BuildKit cache mounts
Fixed:
eurostat_search_datasetsmulti-word queries now AND-match tokens across label+themePath+code (#14)eurostat_browse_themesroot browse unions children of every depth-0 TOC root (#20)
Dependencies:
@cyanheads/mcp-ts-core^0.10.9 → ^0.10.14@biomejs/biome^2.5.0 → 2.5.2@types/node^26.0.0 → 26.1.0tsc-alias^1.8.17 → ^1.9.0tsx^4.22.4 → ^4.23.0vitest^4.1.9 → ^4.1.10@socketsecurity/bun-security-scanner^1.1.2 (new)- Transitive: hono → 4.12.28, js-yaml → 3.15.0, vite/esbuild patched (advisories cleared)
145 tests pass; bun run devcheck clean.
v0.1.13: mcp-ts-core ^0.10.9 adoption
mcp-ts-core ^0.10.9 adoption
Framework-maintenance release: upstream DataCanvas fixes, two new devcheck guards, skill + script re-sync.
Dependencies:
@cyanheads/mcp-ts-core^0.10.6 → ^0.10.9@types/node^25.9.3 → ^26.0.0
Changed:
@cyanheads/mcp-ts-core^0.10.6 → ^0.10.9 — DuckdbProvider.describe({ tableName }) binder-error fix (core #235); Canvas SQL gate classifies SELECT-shaped prepare failures as invalid_sql with binder detail (core #236); ctx.content collector for image/audio blocks (core #239); OTEL_SERVICE_NAME seeding precedence corrected (core #233); biome 2.4.16 → 2.5.0check-dependency-specifiersdevcheck step rejects floating specifiers (latest/*/dist-tags) in package.json + bun.lock workspaces (core #246)lint:packagingplugin-manifest checks validate .claude-plugin / .codex-plugin descriptions, unscoped display name, scoped install arg (core #240)devcheck.config.jsonpackaging.pluginManifests enabled- Skills re-synced; seven metadata.version bumps (core #238)
135 tests pass; bun run devcheck clean.
v0.1.12: mcp-ts-core ^0.10.6 adoption
mcp-ts-core ^0.10.6 adoption
Framework upgrade with no change to the tool surface. Picks up env-boolean parsing via Zod stringbool, a fail-closed DataCanvas SQL gate, wire-level elicitation, and the bundle-hygiene tooling.
Dependencies:
@cyanheads/mcp-ts-core^0.9.21 → ^0.10.6@biomejs/biome^2.4.16 → ^2.5.0@types/node^25.9.1 → ^25.9.3tsx^4.22.3 → ^4.22.4vitest^4.1.8 → ^4.1.9
Added:
- Server identity:
createApp()name/title set toeurostat-mcp-server(core #213) DockerfileHEALTHCHECK (bun-native fetch on /healthz) + image.version labelscripts/clean-mcpb.tsstrips dependency-shipped agent docs from the .mcpb bundle (core #230)
Changed:
.mcpbignoreroot dev-dir patterns anchored with / (core #172/#207)lint-packaging.tsbundle-content + entrypoint-identity checks (core #230/#231)check-framework-antipatterns.tsadds the coerce-boolean-env-flag rule- Skills re-synced; adds the techniques skill (core #204)
135 tests pass; bun run devcheck clean.