Releases: cyanheads/open-meteo-mcp-server
Release list
v0.2.5: flood DataCanvas spillover, date/mode guards, and cell-rendering fixes
flood DataCanvas spillover, date/mode guards, and cell-rendering fixes
openmeteo_get_flood gains canvas spillover for wide reanalysis pulls and guards its mutually-exclusive forecast/reanalysis modes; dataframe_query and formatUnits now render output at parity with structuredContent.
Added:
- openmeteo_get_flood DataCanvas spillover — a wide GloFAS reanalysis pull (~15.5k daily records) stages to DuckDB instead of returning inline. Optional canvas_id input; record_count/truncated/canvas_id/table_name output, all additive. Query via openmeteo_dataframe_query. (#19)
Fixed:
- openmeteo_get_flood rejects a one-sided start_date/end_date (date_range_incomplete) and forecast_days combined with a date range (forecast_days_conflict) before the API call, each with a targeted recovery. (#25)
- openmeteo_dataframe_query serializes struct and list cells as JSON and escapes pipes, so content[] matches structuredContent.rows. (#20)
- formatUnits keeps the time entry in content[], matching structuredContent.*_units. (#24)
176 tests pass; bun run devcheck clean.
v0.2.4: DataCanvas spill fixes
DataCanvas spill fixes
Spill eligibility is serialized payload size rather than row count, and staged tables keep their column types and both cadences.
Fixed:
- Wide results under 500 rows now spill —
exceedsInlineBudget()replaces theINLINE_LIMIT = 500gate and measures records against the samePREVIEW_CHARSbudget passed tospillover()aspreviewChars. (#23) - Spilled numeric columns keep their type through a leading all-null run —
spillover()now receives an explicit schema fromderiveSpillSchema()derived over every staged row instead of sniffing its own preview buffer. (#21) - Daily-only columns survive a mixed hourly + daily spill, unioned into the one staged table under the existing
table_namecontract. (#22)
Changed:
canvas_idandtruncateddescriptions no longer claim a ~500-record threshold — corrected in the three spill-capable tools,README.md, anddocs/design.md.
Dependency bumps:
ignore^7.0.5 → ^7.0.6
156 tests pass; bun run devcheck clean.
v0.2.3: Row-parity, empty-variable, and DataCanvas table-name fixes
Row-parity, empty-variable, and DataCanvas table-name fixes
Three bug fixes landing together: content[] no longer drops rows structuredContent carries, flood/climate accept empty daily_variables, and spill results surface their exact staged table_name.
Changed:
openmeteo_dataframe_querycaps inlinerowsto a 100-row preview (previously up to 10,000);row_countstill reports the true total, paged via SQL LIMIT/OFFSET
Dependency bumps:
@biomejs/biome^2.5.2 → ^2.5.3@types/node^26.1.0 → ^26.1.1tsc-alias^1.8.17 → ^1.9.0vitest^4.1.9 → ^4.1.10
Fixed:
- content[] renders every row across all seven time-series tools — no more capped previews or "…and N more" trailers (#16)
openmeteo_get_flood/openmeteo_get_climateaccept empty or omitteddaily_variables, reaching the declaredno_variables_requestedrecovery (#17)openmeteo_get_historical/openmeteo_get_ensemble/openmeteo_get_climatereturn the exact stagedtable_name;dataframe_querypoints at it instead of implying derivation fromcanvas_id(#18)
135 tests pass; bun run devcheck clean.
v0.2.2: geocode input-guidance fix, country filter
geocode input-guidance fix, country filter
Resolves #15 — description and no_results recovery no longer imply nonexistent country/admin1 inputs.
Added:
openmeteo_geocodegains acountryinput (ISO 3166-1 alpha-2) mapped to the upstreamcountryCodefilter, for disambiguating same-named places. (#15)
Fixed:
- Description and
no_resultsrecovery no longer implycountry/admin1are inputs — both are output-only result fields. Callers are steered to bare place names; recovery now distinguishes an admin qualifier (drop it) from a physical feature/landmark outside the populated-places index (search the nearest town). (#15) - README corrected: no-match throws
no_results, not an empty array.
124 tests pass; bun run devcheck clean.
v0.2.1: canvas preview + recovery-hint fixes, mcp-ts-core ^0.10.14
canvas preview + recovery-hint fixes, mcp-ts-core ^0.10.14
Truncated DataCanvas previews (get_historical, get_ensemble, get_climate) now report the staged row count instead of the preview length, and dataframe_query surfaces its declared recovery hints instead of framework internals.
Changed:
openmeteo_get_ensembletruncated preview starts at the first row with real data, skipping leading all-nullpast_daysplaceholder rows (#14)
Fixed:
openmeteo_dataframe_queryrewraps framework errors so declared recovery hints reach the wire; missing-table errors now nameopenmeteo_dataframe_describe(#12)- Truncated preview headings (
get_historical,get_ensemble,get_climate) cite the stagedrecord_count, not the preview slice length (#13)
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.10→^0.10.14- New
@socketsecurity/bun-security-scanner^1.1.2devDependency +bunfig.tomlsupply-chain guard
120 tests pass; bun run devcheck clean.
v0.2.0: CMIP6 climate projection tool
CMIP6 climate projection tool
Added:
openmeteo_get_climate— bias-corrected daily CMIP6 climate projections (1950-01-01 to 2050-12-31) at any coordinate; selectable models CMCC_CM2_VHR4, FGOALS_f3_H, HiRAM_SIT_HR, MRI_AGCM3_2_S, EC_Earth3P_HR, MPI_ESM1_2_XR, NICAM16_8S; per-model suffixed columns with 2+ models; DataCanvas spillover past 500 records (#2)OPEN_METEO_CLIMATE_BASE_URL— optional base URL override for the Climate API
Changed:
openmeteo_dataframe_describe/openmeteo_dataframe_queryand docs name three canvas producers: openmeteo_get_historical, openmeteo_get_ensemble, openmeteo_get_climate
115 tests pass; bun run devcheck clean.
v0.1.8: Actionable error contracts — upstream framing, wire recovery hints, canvas DX
Actionable error contracts — upstream framing, wire recovery hints, canvas DX
Changed:
- Unknown-variable rejections across the six weather/environment tools lead with actionable guidance, name the offending value(s), and demote the raw upstream Swift type-init string to a trailing parenthetical (
frameInvalidVariableMessage) (#7) openmeteo_dataframe_describe/openmeteo_dataframe_querydocumentopenmeteo_get_ensemblealongsideopenmeteo_get_historicalas canvas producers (#8)
Fixed:
- Every
ctx.failsite attaches the declared recovery hint to the wire viactx.recoveryFor—data.recovery.hintnow ships (#11) canvas_idreturned only whentruncated: true— no pointer at an empty canvas on the non-spilled path (#8)- Dataframe tools rethrow unknown-canvas under their own
canvas_not_foundcontract instead of the framework's misleading omit-canvas_id hint (#8)
100 tests pass; bun run devcheck clean.
v0.1.7: Geocode sparse-result and native-script fixes; ensemble member metadata
Geocode sparse-result and native-script fixes; ensemble member metadata
Fixed:
openmeteo_geocodeno longer hard-fails on results missingcountry/country_code/timezone(continents, oceans — e.g. "Antarctica") (#5)openmeteo_geocoderetries a non-Latin-script query once with a script-inferred language when it misses under the defaultlanguage: "en"; recovery hint no longer says "search in English" (#10)openmeteo_get_ensemblepopulatesmodel(echoes the requestedmodels) andmember_count(distinct_memberNNcolumn suffixes) — both were always absent (#6)
Security:
- Transitive
js-yamladvisory GHSA-h67p-54hq-rp68 (moderate) cleared via the framework re-resolve (js-yaml → 3.15.0);bun audit1 → 0
Dependency bumps:
@cyanheads/mcp-ts-core^0.10.9 → ^0.10.10@biomejs/biome^2.5.0 → ^2.5.2@types/node^26.0.0 → ^26.1.0
88 tests pass; bun run devcheck clean.
v0.1.6: mcp-ts-core ^0.10.9 maintenance
mcp-ts-core ^0.10.9 maintenance
Framework adoption + vendored script/skill re-sync. No tool, schema, or behavior changes.
Changed:
- devcheck
Dependency Specifiersgate (check-dependency-specifiers.ts) — rejects floating specifiers (latest/*/dist-tags) in package.json deps and bun.lock workspaces (cyanheads/mcp-ts-core#246) - devcheck plugin-manifest checks (lint-packaging.ts check 10) — validates .claude-plugin/.codex-plugin descriptions + scoped/unscoped identity, gated by devcheck.config.json packaging.pluginManifests (cyanheads/mcp-ts-core#240)
- fresh-scaffold + worktree-deletion guards across build-changelog, devcheck, check-framework-antipatterns, check-skill-versions (cyanheads/mcp-ts-core#242, #243, #237)
- skills re-synced to 0.10.9 — api-context ctx.content (#239), api-canvas invalid_sql SQL gate (#236), plus body-drift bumps (#238)
- .codex-plugin/plugin.json longDescription populated to satisfy the new manifest check
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
79 tests pass; bun run devcheck clean.
v0.1.5: mcp-ts-core ^0.10.6 adoption, dataframe_query catalog deny, container hardening
mcp-ts-core ^0.10.6 adoption, dataframe_query catalog deny, container hardening
Framework adoption plus a DataCanvas hardening, Docker healthcheck, and MCPB bundle cleaner.
Security:
openmeteo_dataframe_queryruns with denySystemCatalogs: true — SQL touching information_schema, sqlite_master, pg_catalog, or duckdb_*() is rejected (new system_catalog_access error) so callers cannot enumerate other staged canvases.
Added:
- Dockerfile HEALTHCHECK (bun-native fetch on /healthz) + org.opencontainers.image.version label from APP_VERSION.
- scripts/clean-mcpb.ts — post-pack cleaner strips dependency-shipped agent-doc trees under node_modules/.
Changed:
- createApp() sets explicit name/title of open-meteo-mcp-server; .codex-plugin displayName aligned.
- .mcpbignore patterns root-anchored; vendored skills synced to 0.10.6.
Dependency bumps:
@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.3typescript^5.9.3 → ^6.0.3tsc-alias^1.8.16 → ^1.8.17vitest^4.1.0 → ^4.1.8
79 tests pass; bun run devcheck clean.