Skip to content

Releases: cyanheads/open-meteo-mcp-server

v0.2.5: flood DataCanvas spillover, date/mode guards, and cell-rendering fixes

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 09:14
v0.2.5
b74ec6f

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.

CHANGELOG v0.2.5

v0.2.4: DataCanvas spill fixes

Choose a tag to compare

@cyanheads cyanheads released this 16 Jul 05:49
v0.2.4
0afa1e7

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 the INLINE_LIMIT = 500 gate and measures records against the same PREVIEW_CHARS budget passed to spillover() as previewChars. (#23)
  • Spilled numeric columns keep their type through a leading all-null run — spillover() now receives an explicit schema from deriveSpillSchema() 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_name contract. (#22)

Changed:

  • canvas_id and truncated descriptions no longer claim a ~500-record threshold — corrected in the three spill-capable tools, README.md, and docs/design.md.

Dependency bumps:

  • ignore ^7.0.5 → ^7.0.6

156 tests pass; bun run devcheck clean.

CHANGELOG v0.2.4

v0.2.3: Row-parity, empty-variable, and DataCanvas table-name fixes

Choose a tag to compare

@cyanheads cyanheads released this 11 Jul 20:26
v0.2.3
7797131

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_query caps inline rows to a 100-row preview (previously up to 10,000); row_count still 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.1
  • tsc-alias ^1.8.17 → ^1.9.0
  • vitest ^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_climate accept empty or omitted daily_variables, reaching the declared no_variables_requested recovery (#17)
  • openmeteo_get_historical / openmeteo_get_ensemble / openmeteo_get_climate return the exact staged table_name; dataframe_query points at it instead of implying derivation from canvas_id (#18)

135 tests pass; bun run devcheck clean.

CHANGELOG v0.2.3

v0.2.2: geocode input-guidance fix, country filter

Choose a tag to compare

@cyanheads cyanheads released this 06 Jul 23:54
v0.2.2
c7e37b2

geocode input-guidance fix, country filter

Resolves #15 — description and no_results recovery no longer imply nonexistent country/admin1 inputs.

Added:

  • openmeteo_geocode gains a country input (ISO 3166-1 alpha-2) mapped to the upstream countryCode filter, for disambiguating same-named places. (#15)

Fixed:

  • Description and no_results recovery no longer imply country/admin1 are 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.

CHANGELOG v0.2.2

v0.2.1: canvas preview + recovery-hint fixes, mcp-ts-core ^0.10.14

Choose a tag to compare

@cyanheads cyanheads released this 06 Jul 23:24
v0.2.1
4a02333

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_ensemble truncated preview starts at the first row with real data, skipping leading all-null past_days placeholder rows (#14)

Fixed:

  • openmeteo_dataframe_query rewraps framework errors so declared recovery hints reach the wire; missing-table errors now name openmeteo_dataframe_describe (#12)
  • Truncated preview headings (get_historical, get_ensemble, get_climate) cite the staged record_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.2 devDependency + bunfig.toml supply-chain guard

120 tests pass; bun run devcheck clean.

CHANGELOG v0.2.1

v0.2.0: CMIP6 climate projection tool

Choose a tag to compare

@cyanheads cyanheads released this 02 Jul 09:02
v0.2.0
26ffa8a

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_query and 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

Choose a tag to compare

@cyanheads cyanheads released this 02 Jul 08:29
v0.1.8
c61f901

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_query document openmeteo_get_ensemble alongside openmeteo_get_historical as canvas producers (#8)

Fixed:

  • Every ctx.fail site attaches the declared recovery hint to the wire via ctx.recoveryFordata.recovery.hint now ships (#11)
  • canvas_id returned only when truncated: true — no pointer at an empty canvas on the non-spilled path (#8)
  • Dataframe tools rethrow unknown-canvas under their own canvas_not_found contract 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

Choose a tag to compare

@cyanheads cyanheads released this 02 Jul 07:49
v0.1.7
8fe3fe7

Geocode sparse-result and native-script fixes; ensemble member metadata

Fixed:

  • openmeteo_geocode no longer hard-fails on results missing country/country_code/timezone (continents, oceans — e.g. "Antarctica") (#5)
  • openmeteo_geocode retries a non-Latin-script query once with a script-inferred language when it misses under the default language: "en"; recovery hint no longer says "search in English" (#10)
  • openmeteo_get_ensemble populates model (echoes the requested models) and member_count (distinct _memberNN column suffixes) — both were always absent (#6)

Security:

  • Transitive js-yaml advisory GHSA-h67p-54hq-rp68 (moderate) cleared via the framework re-resolve (js-yaml → 3.15.0); bun audit 1 → 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

Choose a tag to compare

@cyanheads cyanheads released this 20 Jun 17:29
v0.1.6
1ea06bb

mcp-ts-core ^0.10.9 maintenance

Framework adoption + vendored script/skill re-sync. No tool, schema, or behavior changes.

Changed:

  • devcheck Dependency Specifiers gate (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.0
  • vitest ^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

Choose a tag to compare

@cyanheads cyanheads released this 13 Jun 03:49
v0.1.5
7b064dc

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_query runs 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.3
  • typescript ^5.9.3 → ^6.0.3
  • tsc-alias ^1.8.16 → ^1.8.17
  • vitest ^4.1.0 → ^4.1.8

79 tests pass; bun run devcheck clean.