[{"slug":"ZV-2026-0096","server_name":"gribstream.com","severity":"breaking","title":"gribstream.com: Field handling_guidance was removed from gribstream_query_runs output; consumers reading it will break.","summary":"[risky] Default of accept on gribstream_build_runs_request changed \"text/csv\" → unset. [risky] Default of accept on gribstream_build_timeseries_request changed \"text/csv\" → unset. [risky] Description of gribstream_query_runs changed (45% word delta). [risky] Optional field delivery was added to gribstream_query_runs; may shift model behaviour. [risky] Default of accept on gribstream_query_runs changed \"text/csv\" → unset. [risky] Default of max_bytes on gribstream_query_runs changed 10000000 → unset. [breaking] Field handling_guidance was removed from gribstream_query_runs output; consumers reading it will break. [breaking] Field resource_encoding was removed from gribstream_query_runs output; consumers reading it will break. [risky] Field cache_hit was added to gribstream_query_runs output. [risky] Field delivery was added to gribstream_query_runs output. [risky] Field generated_at was added to gribstream_query_runs output. [risky] Field signed_url_expires_at was added to gribstream_query_runs output. [risky] Description of gribstream_query_timeseries changed (43% word delta). [risky] Optional field delivery was added to gribstream_query_timeseries; may shift model behaviour. [risky] Default of accept on gribstream_query_timeseries changed \"text/csv\" → unset. [risky] Default of max_bytes on gribstream_query_timeseries changed 10000000 → unset. [breaking] Field handling_guidance was removed from gribstream_query_timeseries output; consumers reading it will break. [breaking] Field resource_encoding was removed from gribstream_query_timeseries output; consumers reading it will break. [risky] Field cache_hit was added to gribstream_query_timeseries output. [risky] Field delivery was added to gribstream_query_timeseries output. [risky] Field generated_at was added to gribstream_query_timeseries output. [risky] Field signed_url_expires_at was added to gribstream_query_timeseries output.","changes":[{"kind":"default_changed","path":"inputSchema.properties.accept","tool":"gribstream_build_runs_request","before":"text/csv","detail":"Default of `accept` on `gribstream_build_runs_request` changed \"text/csv\" → unset.","severity":"risky"},{"kind":"default_changed","path":"inputSchema.properties.accept","tool":"gribstream_build_timeseries_request","before":"text/csv","detail":"Default of `accept` on `gribstream_build_timeseries_request` changed \"text/csv\" → unset.","severity":"risky"},{"kind":"description_changed","tool":"gribstream_query_runs","after":"AUTH REQUIRED / DATA QUERY. Executes an authenticated /api/v2/{dataset}/runs request and returns actual weather/forecast data values across model runs. Use this tool, not the NO AUTH request-building or metadata tools, when the user asks to fetch, retrieve, download, return, or analyze model-run history, forecast aging, changing forecasts, CSV/JSON/NDJSON/Parquet data, plots, or analysis. Defaults to inline CSV for compatibility; use URL delivery for dense grids and large tabular results. For dense grids or large tabular results, use delivery=url so MCP returns a short-lived signed HTTPS resource link instead of putting the full dataset into tool output. Prefer application/vnd.apache.parquet when a Parquet reader is already available; otherwise use text/csv with delivery=url. Use one grid request, download the link directly once, process the saved file locally, and never print or serialize the full file into chat or tool output. Do not install a dependency or write a Parquet parser solely for one result. When a real API request limit requires splitting, split by time range first, split variables second, and split coordinates/grid/space last; spatial tiling creates the most extra work. Response rows are unsorted; sort by location fields, forecasted_at, and forecasted_time before plotting, building time series, or checking for gaps. The request body must use request.coordinates and request.variables; do not use location, coord, coords, parameters, parameter, or variable as replacement field names.","before":"AUTH REQUIRED / DATA QUERY. Executes an authenticated /api/v2/{dataset}/runs request and returns actual weather/forecast data values across model runs. Use this tool, not the NO AUTH request-building or metadata tools, when the user asks to fetch, retrieve, download, return, or analyze model-run history, forecast aging, changing forecasts, CSV/JSON/NDJSON/Parquet data, plots, or analysis. Defaults to CSV for compatibility; prefer Parquet for dense grids and large tabular results. DENSE-GRID PLOTS: Send one request.grid and one live query with accept=application/vnd.apache.parquet; do not expand the grid into request.coordinates or spatially tile it first. Save the returned binary resource, sort the decoded rows, and plot that file directly. Spatially tile only after an actual coordinate-limit or response-size error. Return the plot rather than the raw dataset unless the user asks for the data. PARQUET HANDLING: Treat resource.blob as an opaque binary intermediate. Never stringify, print, log, quote, or copy its base64 into assistant-visible text or another tool result. Decode and save it once to suggested_filename in the same execution environment, then read that file with a Parquet-capable library. Do not repeat the same GribStream query merely to materialize or recover the returned file. If the client cannot consume embedded binary resources, use CSV and split the request below max_bytes. For dense grids or large tabular results, request application/vnd.apache.parquet before splitting; Parquet is typed and ZSTD-compressed, and MCP returns it as an embedded binary resource. If Parquet still exceeds the MCP limit, split by time range first, split variables second, and split coordinates/grid/space last; spatial tiling creates the most extra requests and should be the fallback. Response rows are unsorted; sort by location fields, forecasted_at, and forecasted_time before plotting, building time series, or checking for gaps. The request body must use request.coordinates and request.variables; do not use location, coord, coords, parameters, parameter, or variable as replacement field names.","detail":"Description of `gribstream_query_runs` changed (45% word delta).","severity":"risky","descriptionDelta":0.452054794520548},{"kind":"input_property_added","path":"inputSchema.properties.delivery","tool":"gribstream_query_runs","after":{"enum":["url"],"type":"string","description":"Optional result delivery mode. Set url for dense grids or results that may approach the 10 MB inline MCP limit. It returns a short-lived signed resource link for CSV, JSON, NDJSON, or Parquet. Parquet always uses URL delivery even when this is omitted."},"detail":"Optional field `delivery` was added to `gribstream_query_runs`; may shift model behaviour.","severity":"risky"},{"kind":"default_changed","path":"inputSchema.properties.accept","tool":"gribstream_query_runs","before":"text/csv","detail":"Default of `accept` on `gribstream_query_runs` changed \"text/csv\" → unset.","severity":"risky"},{"kind":"default_changed","path":"inputSchema.properties.max_bytes","tool":"gribstream_query_runs","before":10000000,"detail":"Default of `max_bytes` on `gribstream_query_runs` changed 10000000 → unset.","severity":"risky"},{"kind":"output_property_removed","path":"outputSchema.properties.handling_guidance","tool":"gribstream_query_runs","before":{"type":"string","description":"Required handling workflow for an embedded binary result, including keeping base64 out of assistant-visible output, saving it once, and avoiding duplicate queries."},"detail":"Field `handling_guidance` was removed from `gribstream_query_runs` output; consumers reading it will break.","severity":"breaking"},{"kind":"output_property_removed","path":"outputSchema.properties.resource_encoding","tool":"gribstream_query_runs","before":{"type":"string","description":"Encoding of an embedded binary resource. Parquet uses base64 in resource.blob as required by MCP."},"detail":"Field `resource_encoding` was removed from `gribstream_query_runs` output; consumers reading it will break.","severity":"breaking"},{"kind":"output_property_added","path":"outputSchema.properties.cache_hit","tool":"gribstream_query_runs","after":{"type":"boolean","description":"Whether a URL-delivered artifact was served from the shared short-lived response cache."},"detail":"Field `cache_hit` was added to `gribstream_query_runs` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.delivery","tool":"gribstream_query_runs","after":{"type":"string","description":"Result delivery mode. URL-delivered results use url; text formats are inline when delivery is omitted."},"detail":"Field `delivery` was added to `gribstream_query_runs` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.generated_at","tool":"gribstream_query_runs","after":{"type":"string","description":"UTC timestamp at which a URL-delivered artifact was generated."},"detail":"Field `generated_at` was added to `gribstream_query_runs` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.signed_url_expires_at","tool":"gribstream_query_runs","after":{"type":"string","description":"UTC expiration timestamp for an artifact resource link."},"detail":"Field `signed_url_expires_at` was added to `gribstream_query_runs` output.","severity":"risky"},{"kind":"description_changed","tool":"gribstream_query_timeseries","after":"AUTH REQUIRED / DATA QUERY. Executes an authenticated /api/v2/{dataset}/timeseries request and returns actual weather/forecast data values. Use this tool, not the NO AUTH request-building or metadata tools, when the user asks to fetch, retrieve, download, return, or analyze weather values, CSV/JSON/NDJSON/Parquet data, plots, heatmaps, or best-available values by valid time. Defaults to inline CSV for compatibility; use URL delivery for dense grids and large tabular results. For dense grids or large tabular results, use delivery=url so MCP returns a short-lived signed HTTPS resource link instead of putting the full dataset into tool output. Prefer application/vnd.apache.parquet when a Parquet reader is already available; otherwise use text/csv with delivery=url. Use one grid request, download the link directly once, process the saved file locally, and never print or serialize the full file into chat or tool output. Do not install a dependency or write a Parquet parser solely for one result. When a real API request limit requires splitting, split by time range first, split variables second, and split coordinates/grid/space last; spatial tiling creates the most extra work. Do not include request.asOf unless the user explicitly wants backtesting, time travel, or a historical model-run cutoff. Response rows are unsorted; sort by location fields and forecasted_time before plotting, building time series, or checking for gaps. The request body must use request.coordinates and request.variables; do not use location, coord, coords, parameters, parameter, or variable as replacement field names.","before":"AUTH REQUIRED / DATA QUERY. Executes an authenticated /api/v2/{dataset}/timeseries request and returns actual weather/forecast data values. Use this tool, not the NO AUTH request-building or metadata tools, when the user asks to fetch, retrieve, download, return, or analyze weather values, CSV/JSON/NDJSON/Parquet data, plots, heatmaps, or best-available values by valid time. Defaults to CSV for compatibility; prefer Parquet for dense grids and large tabular results. DENSE-GRID PLOTS: Send one request.grid and one live query with accept=application/vnd.apache.parquet; do not expand the grid into request.coordinates or spatially tile it first. Save the returned binary resource, sort the decoded rows, and plot that file directly. Spatially tile only after an actual coordinate-limit or response-size error. Return the plot rather than the raw dataset unless the user asks for the data. PARQUET HANDLING: Treat resource.blob as an opaque binary intermediate. Never stringify, print, log, quote, or copy its base64 into assistant-visible text or another tool result. Decode and save it once to suggested_filename in the same execution environment, then read that file with a Parquet-capable library. Do not repeat the same GribStream query merely to materialize or recover the returned file. If the client cannot consume embedded binary resources, use CSV and split the request below max_bytes. For dense grids or large tabular results, request application/vnd.apache.parquet before splitting; Parquet is typed and ZSTD-compressed, and MCP returns it as an embedded binary resource. If Parquet still exceeds the MCP limit, split by time range first, split variables second, and split coordinates/grid/space last; spatial tiling creates the most extra requests and should be the fallback. Do not include request.asOf unless the user explicitly wants backtesting, time travel, or a historical model-run cutoff. Response rows are unsorted; sort by location fields and forecasted_time before plotting, building time series, or checking for gaps. The request body must use request.coordinates and request.variables; do not use location, coord, coords, parameters, parameter, or variable as replacement field names.","detail":"Description of `gribstream_query_timeseries` changed (43% word delta).","severity":"risky","descriptionDelta":0.43497757847533636},{"kind":"input_property_added","path":"inputSchema.properties.delivery","tool":"gribstream_query_timeseries","after":{"enum":["url"],"type":"string","description":"Optional result delivery mode. Set url for dense grids or results that may approach the 10 MB inline MCP limit. It returns a short-lived signed resource link for CSV, JSON, NDJSON, or Parquet. Parquet always uses URL delivery even when this is omitted."},"detail":"Optional field `delivery` was added to `gribstream_query_timeseries`; may shift model behaviour.","severity":"risky"},{"kind":"default_changed","path":"inputSchema.properties.accept","tool":"gribstream_query_timeseries","before":"text/csv","detail":"Default of `accept` on `gribstream_query_timeseries` changed \"text/csv\" → unset.","severity":"risky"},{"kind":"default_changed","path":"inputSchema.properties.max_bytes","tool":"gribstream_query_timeseries","before":10000000,"detail":"Default of `max_bytes` on `gribstream_query_timeseries` changed 10000000 → unset.","severity":"risky"},{"kind":"output_property_removed","path":"outputSchema.properties.handling_guidance","tool":"gribstream_query_timeseries","before":{"type":"string","description":"Required handling workflow for an embedded binary result, including keeping base64 out of assistant-visible output, saving it once, and avoiding duplicate queries."},"detail":"Field `handling_guidance` was removed from `gribstream_query_timeseries` output; consumers reading it will break.","severity":"breaking"},{"kind":"output_property_removed","path":"outputSchema.properties.resource_encoding","tool":"gribstream_query_timeseries","before":{"type":"string","description":"Encoding of an embedded binary resource. Parquet uses base64 in resource.blob as required by MCP."},"detail":"Field `resource_encoding` was removed from `gribstream_query_timeseries` output; consumers reading it will break.","severity":"breaking"},{"kind":"output_property_added","path":"outputSchema.properties.cache_hit","tool":"gribstream_query_timeseries","after":{"type":"boolean","description":"Whether a URL-delivered artifact was served from the shared short-lived response cache."},"detail":"Field `cache_hit` was added to `gribstream_query_timeseries` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.delivery","tool":"gribstream_query_timeseries","after":{"type":"string","description":"Result delivery mode. URL-delivered results use url; text formats are inline when delivery is omitted."},"detail":"Field `delivery` was added to `gribstream_query_timeseries` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.generated_at","tool":"gribstream_query_timeseries","after":{"type":"string","description":"UTC timestamp at which a URL-delivered artifact was generated."},"detail":"Field `generated_at` was added to `gribstream_query_timeseries` output.","severity":"risky"},{"kind":"output_property_added","path":"outputSchema.properties.signed_url_expires_at","tool":"gribstream_query_timeseries","after":{"type":"string","description":"UTC expiration timestamp for an artifact resource link."},"detail":"Field `signed_url_expires_at` was added to `gribstream_query_timeseries` output.","severity":"risky"}],"published_at":"2026-08-17T14:53:17.031Z"}]