
NOAA and ECMWF weather forecast MCP for discovery, validation, and GribStream OAuth queries.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
NO AUTH / PUBLIC / READ-ONLY. Build and validate a runnable /runs API request and curl command without sending it. Use gribstream_query_runs to retrieve model-run comparisons directly; a separate build call is optional. Use catalog selectors in request.variables and points in request.coordinates or one request.grid.
Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma.
Runs request body. Use timesList for exact UTC model run times, or the half-open range forecastedFrom+forecastedUntil where forecastedFrom is inclusive, forecastedUntil is exclusive, and forecastedFrom must be earlier than forecastedUntil. Equal bounds select no times. Coordinates must be in request.coordinates, and variable selectors must be in request.variables.
Desired response format for the eventual HTTP request. Prefer application/vnd.apache.parquet for dense grids and large typed tabular results.
NO AUTH / PUBLIC / READ-ONLY. Build and validate a runnable /runs API request and curl command without sending it. Use gribstream_query_runs to retrieve model-run comparisons directly; a separate build call is optional. Use catalog selectors in request.variables and points in request.coordinates or one request.grid.
| Argument | Type | Description |
|---|---|---|
| accept | string | Desired response format for the eventual HTTP request. Prefer application/vnd.apache.parquet for dense grids and large typed tabular results. |
| dataset* | string | Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma. |
| request* | object | Runs request body. Use timesList for exact UTC model run times, or the half-open range forecastedFrom+forecastedUntil where forecastedFrom is inclusive, forecastedUntil is exclusive, and forecastedFrom must be earlier than forecastedUntil. Equal bounds select no times. Coordinates must be in request.coordinates, and variable selectors must be in request.variables. |
{
"type": "object",
"required": [
"dataset",
"request"
],
"properties": {
"accept": {
"enum": [
"text/csv",
"application/json",
"application/ndjson",
"application/x-ndjson",
"application/vnd.apache.parquet",
"application/x-parquet",
"application/parquet"
],
"type": "string",
"description": "Desired response format for the eventual HTTP request. Prefer application/vnd.apache.parquet for dense grids and large typed tabular results."
},
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma."
},
"request": {
"type": "object",
"properties": {
"asOf": {
"type": "string",
"description": "Do not set asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Omit asOf for latest or best-available forecasts because it filters out forecast runs newer than the cutoff and can make recent data look missing. This is a UTC model-run-time cutoff for /timeseries, not a live API availability timestamp."
},
"grid": {
"type": "object",
"required": [
"minLatitude",
"maxLatitude",
"minLongitude",
"maxLongitude",
"step"
],
"properties": {
"step": {
"type": "number",
"description": "Requested sampling step in degrees, greater than 0. Finer sampling does not increase forecast resolution. Native latitude and longitude steps can differ; projected and unstructured grids have no single degree step."
},
"maxLatitude": {
"type": "number"
},
"minLatitude": {
"type": "number"
},
"maxLongitude": {
"type": "number"
},
"minLongitude": {
"type": "number"
}
},
"description": "Optional regular latitude/longitude grid. Use this instead of or in addition to coordinates. The API preserves the requested step and does not silently coarsen fine grids. The default limit is 120000 expanded coordinates; account-specific plan or token settings may set a different maximum up to 1050000, enough for a full native 0.25-degree global GFS grid, and an oversized-response error reports the applicable maximum. Use URL delivery for dense grids before considering spatial tiling.",
"additionalProperties": false
},
"filter": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Optional row filter expression evaluated from variable aliases.",
"additionalProperties": true
},
"members": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional ensemble member numbers."
},
"fromTime": {
"type": "string",
"description": "Inclusive UTC valid-time range start for /timeseries, for example 2025-05-01T00:00:00Z. Must be earlier than untilTime; use timesList for one exact valid time."
},
"timesList": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact UTC valid times for /timeseries, or exact UTC model run times for /runs. Use this for one exact time instead of setting range bounds equal."
},
"untilTime": {
"type": "string",
"description": "Exclusive UTC valid-time range end for /timeseries, for example 2025-05-01T06:00:00Z. Must be later than fromTime; equal bounds select no times."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"level",
"info"
],
"properties": {
"info": {
"type": "string",
"description": "Exact info string. Use an empty string when the catalog selector has no info value."
},
"name": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example TMP."
},
"alias": {
"type": "string",
"description": "Optional response field name. Strongly recommended."
},
"level": {
"type": "string",
"description": "Exact level string, for example 2 m above ground."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide intermediate variables used only by expressions."
}
},
"additionalProperties": false
},
"description": "Variable selectors. This exact field name is required. Do not use parameters, parameter, variable, selector, or selectors. Values must be exact case-sensitive selector tuples discovered from catalog tools."
},
"maxHorizon": {
"type": "integer",
"description": "Optional maximum lead time in hours."
},
"minHorizon": {
"type": "integer",
"description": "Optional minimum lead time in hours."
},
"coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees."
},
"name": {
"type": "string",
"description": "Optional coordinate label copied into the response."
}
},
"additionalProperties": false
},
"description": "Point coordinates. This exact field name is required. Do not use location, coord, coords, latitude/longitude at top level, or any singular replacement."
},
"expressions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Expression object.",
"additionalProperties": true
},
"description": "Optional derived variables evaluated from variable aliases."
},
"forecastedFrom": {
"type": "string",
"description": "Inclusive UTC model-run-time range start for /runs. Must be earlier than forecastedUntil; use timesList for one exact model run time."
},
"forecastedUntil": {
"type": "string",
"description": "Exclusive UTC model-run-time range end for /runs. Must be later than forecastedFrom; equal bounds select no times."
},
"includeMetadata": {
"type": "array",
"items": {
"enum": [
"index_updated_at",
"native_coordinate"
],
"type": "string"
},
"description": "Optional additional row metadata: native_coordinate adds native_lat/native_lon for mapping requested sampling onto source cells; index_updated_at adds index freshness. Do not request forecasted_at or forecasted_time here; both are regular response columns returned automatically."
}
},
"description": "Runs request body. Use timesList for exact UTC model run times, or the half-open range forecastedFrom+forecastedUntil where forecastedFrom is inclusive, forecastedUntil is exclusive, and forecastedFrom must be earlier than forecastedUntil. Equal bounds select no times. Coordinates must be in request.coordinates, and variable selectors must be in request.variables.",
"additionalProperties": true
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Build and validate a runnable /timeseries API request and curl command without sending it. Use gribstream_query_timeseries to retrieve data directly; a separate build call is optional. Use catalog selectors in request.variables and points in request.coordinates or one request.grid. Omit asOf for latest forecasts.
| Argument | Type | Description |
|---|---|---|
| accept | string | Desired response format for the eventual HTTP request. Prefer application/vnd.apache.parquet for dense grids and large typed tabular results. |
| dataset* | string | Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma. |
| request* | object | Timeseries request body. Use timesList for exact UTC valid times, or the half-open range fromTime+untilTime where fromTime is inclusive, untilTime is exclusive, and fromTime must be earlier than untilTime. Equal bounds select no times. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Coordinates must be in request.coordinates, and variable selectors must be in request.variables. |
{
"type": "object",
"required": [
"dataset",
"request"
],
"properties": {
"accept": {
"enum": [
"text/csv",
"application/json",
"application/ndjson",
"application/x-ndjson",
"application/vnd.apache.parquet",
"application/x-parquet",
"application/parquet"
],
"type": "string",
"description": "Desired response format for the eventual HTTP request. Prefer application/vnd.apache.parquet for dense grids and large typed tabular results."
},
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma."
},
"request": {
"type": "object",
"properties": {
"asOf": {
"type": "string",
"description": "Do not set asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Omit asOf for latest or best-available forecasts because it filters out forecast runs newer than the cutoff and can make recent data look missing. This is a UTC model-run-time cutoff for /timeseries, not a live API availability timestamp."
},
"grid": {
"type": "object",
"required": [
"minLatitude",
"maxLatitude",
"minLongitude",
"maxLongitude",
"step"
],
"properties": {
"step": {
"type": "number",
"description": "Requested sampling step in degrees, greater than 0. Finer sampling does not increase forecast resolution. Native latitude and longitude steps can differ; projected and unstructured grids have no single degree step."
},
"maxLatitude": {
"type": "number"
},
"minLatitude": {
"type": "number"
},
"maxLongitude": {
"type": "number"
},
"minLongitude": {
"type": "number"
}
},
"description": "Optional regular latitude/longitude grid. Use this instead of or in addition to coordinates. The API preserves the requested step and does not silently coarsen fine grids. The default limit is 120000 expanded coordinates; account-specific plan or token settings may set a different maximum up to 1050000, enough for a full native 0.25-degree global GFS grid, and an oversized-response error reports the applicable maximum. Use URL delivery for dense grids before considering spatial tiling.",
"additionalProperties": false
},
"filter": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Optional row filter expression evaluated from variable aliases.",
"additionalProperties": true
},
"members": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional ensemble member numbers."
},
"fromTime": {
"type": "string",
"description": "Inclusive UTC valid-time range start for /timeseries, for example 2025-05-01T00:00:00Z. Must be earlier than untilTime; use timesList for one exact valid time."
},
"timesList": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact UTC valid times for /timeseries, or exact UTC model run times for /runs. Use this for one exact time instead of setting range bounds equal."
},
"untilTime": {
"type": "string",
"description": "Exclusive UTC valid-time range end for /timeseries, for example 2025-05-01T06:00:00Z. Must be later than fromTime; equal bounds select no times."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"level",
"info"
],
"properties": {
"info": {
"type": "string",
"description": "Exact info string. Use an empty string when the catalog selector has no info value."
},
"name": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example TMP."
},
"alias": {
"type": "string",
"description": "Optional response field name. Strongly recommended."
},
"level": {
"type": "string",
"description": "Exact level string, for example 2 m above ground."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide intermediate variables used only by expressions."
}
},
"additionalProperties": false
},
"description": "Variable selectors. This exact field name is required. Do not use parameters, parameter, variable, selector, or selectors. Values must be exact case-sensitive selector tuples discovered from catalog tools."
},
"maxHorizon": {
"type": "integer",
"description": "Optional maximum lead time in hours."
},
"minHorizon": {
"type": "integer",
"description": "Optional minimum lead time in hours."
},
"coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees."
},
"name": {
"type": "string",
"description": "Optional coordinate label copied into the response."
}
},
"additionalProperties": false
},
"description": "Point coordinates. This exact field name is required. Do not use location, coord, coords, latitude/longitude at top level, or any singular replacement."
},
"expressions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Expression object.",
"additionalProperties": true
},
"description": "Optional derived variables evaluated from variable aliases."
},
"forecastedFrom": {
"type": "string",
"description": "Inclusive UTC model-run-time range start for /runs. Must be earlier than forecastedUntil; use timesList for one exact model run time."
},
"forecastedUntil": {
"type": "string",
"description": "Exclusive UTC model-run-time range end for /runs. Must be later than forecastedFrom; equal bounds select no times."
},
"includeMetadata": {
"type": "array",
"items": {
"enum": [
"index_updated_at",
"native_coordinate"
],
"type": "string"
},
"description": "Optional additional row metadata: native_coordinate adds native_lat/native_lon for mapping requested sampling onto source cells; index_updated_at adds index freshness. Do not request forecasted_at or forecasted_time here; both are regular response columns returned automatically."
}
},
"description": "Timeseries request body. Use timesList for exact UTC valid times, or the half-open range fromTime+untilTime where fromTime is inclusive, untilTime is exclusive, and fromTime must be earlier than untilTime. Equal bounds select no times. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Coordinates must be in request.coordinates, and variable selectors must be in request.variables.",
"additionalProperties": true
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Inspect archive coverage, cadence, horizon, members, and native_grid geometry for one dataset. The native coordinate URL requires authentication and geographic bounds; geometry does not prove variable availability.
| Argument | Type | Description |
|---|---|---|
| dataset* | string | Dataset code, for example gfs, nbm, ifsoper, hrrr, urma. |
{
"type": "object",
"required": [
"dataset"
],
"properties": {
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, nbm, ifsoper, hrrr, urma."
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Get expression syntax, alias rules, examples, and supported func.* math functions for derived weather signals.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Gets detailed metadata and exact selector variations for one already-known dataset-native parameter code. Parameter codes are case-sensitive. For a common natural-language concept such as 2 metre temperature, use gribstream_resolve_shared_parameter before guessing a native code.
| Argument | Type | Description |
|---|---|---|
| dataset* | string | Dataset code, for example ifsoper. |
| parameter* | string | Exact case-sensitive parameter short name, for example 100u, 2t, TMP, or APCP. |
{
"type": "object",
"required": [
"dataset",
"parameter"
],
"properties": {
"dataset": {
"type": "string",
"description": "Dataset code, for example ifsoper."
},
"parameter": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example 100u, 2t, TMP, or APCP."
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Find candidate datasets for a region and weather variable. Filter by provider, region, forecast_time, shared_parameter and is_ensemble; sort_by=resolution ranks nominal resolution in km. With shared_parameter, each result includes a validated request fragment and exact/approximate match. Use it directly in one gribstream_query_timeseries call. Coverage envelopes and forecast horizons are catalog hints, not live availability guarantees. No weather values are fetched.
| Argument | Type | Description |
|---|---|---|
| tag | any | Tag or list of tags. Multiple tags use AND semantics in the API. |
| code | any | Dataset code or list of dataset codes, for example gfs or ["gfs", "ifsoper"]. |
| limit | integer | Maximum candidates to return; omit to inspect alternatives including unknown coverage. |
| family | string | Dataset family filter, for example gfs, ifs, nbm, hrrr, rap, rtma, urma. |
| region | object | |
| sort_by | string | Sort candidates by nominal source resolution, finest first; unknown coverage/resolution sorts last. Read coverage_kind before claiming a winner. |
| provider | string | Case-insensitive provider substring, e.g. Met Office, ECMWF, NOAA, DWD. |
NO AUTH / PUBLIC / READ-ONLY. Lists parameter summaries for one dataset. Use this before selecting exact case-sensitive parameter codes.
| Argument | Type | Description |
|---|---|---|
| dataset* | string | Dataset code, for example ifsoper. |
{
"type": "object",
"required": [
"dataset"
],
"properties": {
"dataset": {
"type": "string",
"description": "Dataset code, for example ifsoper."
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Lists normalized shared parameter presets that can map one logical signal across datasets. Use this only when the shared parameter code is uncertain; when a common code such as temperature_2m is already clear, call gribstream_resolve_shared_parameter directly.
| Argument | Type | Description |
|---|---|---|
| dataset | any | Optional dataset code or list of dataset codes to filter supported shared parameters. |
| dataset_mode | string | Whether every listed dataset must support the preset or any one may support it. |
{
"type": "object",
"properties": {
"dataset": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Optional dataset code or list of dataset codes to filter supported shared parameters."
},
"dataset_mode": {
"enum": [
"any",
"all"
],
"type": "string",
"description": "Whether every listed dataset must support the preset or any one may support it."
}
},
"additionalProperties": false
}AUTH REQUIRED / DATA QUERY. Fetch or retrieve weather values across model runs to compare changing forecasts. timesList selects exact model run times, not valid times; minHorizon/maxHorizon constrain lead hours. Use discovered request.variables with coordinates or one grid. CSV is the default; use delivery=url for large results. Response rows are unsorted; sort by location, forecasted_at and forecasted_time before plotting. When a live query returns a resource_link, the exact signed HTTPS URL is the result: download it directly once with an available HTTPS or file-download capability, without an API token. This consumes the selected GribStream MCP result; it is not a direct GribStream API call or a connector bypass. Do not look for an MCP resources/read tool, and do not repeat the query merely to obtain the file bytes.
| Argument | Type | Description |
|---|---|---|
| accept | string | Desired response format. Defaults to text/csv for compatibility. For dense grids and large tabular analysis, use application/vnd.apache.parquet only when a compatible reader is already known to be available. If reader availability is unknown, do not probe or install packages; use text/csv with delivery=url immediately. |
| dataset* | string | Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma. |
| request* | object | Runs request body. Use timesList for exact UTC model run times, or the half-open range forecastedFrom+forecastedUntil where forecastedFrom is inclusive, forecastedUntil is exclusive, and forecastedFrom must be earlier than forecastedUntil. Equal bounds select no times. Coordinates must be in request.coordinates, and variable selectors must be in request.variables. |
| delivery | string |
AUTH REQUIRED / DATA QUERY. Fetch or retrieve weather values for maps, heatmaps and analysis at selected valid times. Use discovered request.variables with coordinates or one grid; no separate build/validate call is needed. CSV is the default; use delivery=url for large results and render the downloaded file locally. Prefer Parquet only with an available reader. Use timesList for one exact UTC valid time; omit asOf for latest forecasts. Requested sampling does not increase native resolution. Response rows are unsorted; sort rows before plotting. When a live query returns a resource_link, the exact signed HTTPS URL is the result: download it directly once with an available HTTPS or file-download capability, without an API token. This consumes the selected GribStream MCP result; it is not a direct GribStream API call or a connector bypass. Do not look for an MCP resources/read tool, and do not repeat the query merely to obtain the file bytes.
| Argument | Type | Description |
|---|---|---|
| accept | string | Desired response format. Defaults to text/csv for compatibility. For dense grids and large tabular analysis, use application/vnd.apache.parquet only when a compatible reader is already known to be available. If reader availability is unknown, do not probe or install packages; use text/csv with delivery=url immediately. |
| dataset* | string | Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma. |
| request* | object | Timeseries request body. Use timesList for exact UTC valid times, or the half-open range fromTime+untilTime where fromTime is inclusive, untilTime is exclusive, and fromTime must be earlier than untilTime. Equal bounds select no times. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Coordinates must be in request.coordinates, and variable selectors must be in request.variables. |
NO AUTH / PUBLIC / READ-ONLY. Resolves a weather concept to validated native variables/expressions and an exact or approximate match label. Use resolved_request directly in /timeseries or /runs; read resolved_match for height differences and native statistics. Use this first for common natural-language concepts such as 2 metre temperature or 10 metre wind instead of guessing dataset-native codes such as TMP.
| Argument | Type | Description |
|---|---|---|
| alias | string | Optional output alias for the resolved request. |
| dataset | string | Optional dataset code to resolve the shared parameter against. |
| parameter* | string | Shared parameter code, for example temperature_2m, wind_speed_10m, mean_sea_level_pressure, or wind_speed_500hpa. |
{
"type": "object",
"required": [
"parameter"
],
"properties": {
"alias": {
"type": "string",
"description": "Optional output alias for the resolved request."
},
"dataset": {
"type": "string",
"description": "Optional dataset code to resolve the shared parameter against."
},
"parameter": {
"type": "string",
"description": "Shared parameter code, for example temperature_2m, wind_speed_10m, mean_sea_level_pressure, or wind_speed_500hpa."
}
},
"additionalProperties": false
}NO AUTH / PUBLIC / READ-ONLY. Validates the basic shape, exact selector tuples, and expression syntax of a proposed GribStream /timeseries or /runs request without sending it. Use this before returning any hand-edited curl or when changing a request from one dataset to another.
| Argument | Type | Description |
|---|---|---|
| dataset* | string | Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma. |
| request* | object | Request body to validate. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff for /timeseries. Use request.coordinates for point coordinates and request.variables for variable selectors. |
| endpoint* | string | Endpoint to validate. |
{
"type": "object",
"required": [
"endpoint",
"dataset",
"request"
],
"properties": {
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma."
},
"request": {
"type": "object",
"properties": {
"asOf": {
"type": "string",
"description": "Do not set asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Omit asOf for latest or best-available forecasts because it filters out forecast runs newer than the cutoff and can make recent data look missing. This is a UTC model-run-time cutoff for /timeseries, not a live API availability timestamp."
},
"grid": {
"type": "object",
"required": [
"minLatitude",
"maxLatitude",
"minLongitude",
"maxLongitude",
"step"
],
"properties": {
"step": {
"type": "number",
"description": "Requested sampling step in degrees, greater than 0. Finer sampling does not increase forecast resolution. Native latitude and longitude steps can differ; projected and unstructured grids have no single degree step."
},
"maxLatitude": {
"type": "number"
},
"minLatitude": {
"type": "number"
},
"maxLongitude": {
"type": "number"
},
"minLongitude": {
"type": "number"
}
},
"description": "Optional regular latitude/longitude grid. Use this instead of or in addition to coordinates. The API preserves the requested step and does not silently coarsen fine grids. The default limit is 120000 expanded coordinates; account-specific plan or token settings may set a different maximum up to 1050000, enough for a full native 0.25-degree global GFS grid, and an oversized-response error reports the applicable maximum. Use URL delivery for dense grids before considering spatial tiling.",
"additionalProperties": false
},
"filter": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Optional row filter expression evaluated from variable aliases.",
"additionalProperties": true
},
"members": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional ensemble member numbers."
},
"fromTime": {
"type": "string",
"description": "Inclusive UTC valid-time range start for /timeseries, for example 2025-05-01T00:00:00Z. Must be earlier than untilTime; use timesList for one exact valid time."
},
"timesList": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact UTC valid times for /timeseries, or exact UTC model run times for /runs. Use this for one exact time instead of setting range bounds equal."
},
"untilTime": {
"type": "string",
"description": "Exclusive UTC valid-time range end for /timeseries, for example 2025-05-01T06:00:00Z. Must be later than fromTime; equal bounds select no times."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"level",
"info"
],
"properties": {
"info": {
"type": "string",
"description": "Exact info string. Use an empty string when the catalog selector has no info value."
},
"name": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example TMP."
},
"alias": {
"type": "string",
"description": "Optional response field name. Strongly recommended."
},
"level": {
"type": "string",
"description": "Exact level string, for example 2 m above ground."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide intermediate variables used only by expressions."
}
},
"additionalProperties": false
},
"description": "Variable selectors. This exact field name is required. Do not use parameters, parameter, variable, selector, or selectors. Values must be exact case-sensitive selector tuples discovered from catalog tools."
},
"maxHorizon": {
"type": "integer",
"description": "Optional maximum lead time in hours."
},
"minHorizon": {
"type": "integer",
"description": "Optional minimum lead time in hours."
},
"coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees."
},
"name": {
"type": "string",
"description": "Optional coordinate label copied into the response."
}
},
"additionalProperties": false
},
"description": "Point coordinates. This exact field name is required. Do not use location, coord, coords, latitude/longitude at top level, or any singular replacement."
},
"expressions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Expression object.",
"additionalProperties": true
},
"description": "Optional derived variables evaluated from variable aliases."
},
"forecastedFrom": {
"type": "string",
"description": "Inclusive UTC model-run-time range start for /runs. Must be earlier than forecastedUntil; use timesList for one exact model run time."
},
"forecastedUntil": {
"type": "string",
"description": "Exclusive UTC model-run-time range end for /runs. Must be later than forecastedFrom; equal bounds select no times."
},
"includeMetadata": {
"type": "array",
"items": {
"enum": [
"index_updated_at",
"native_coordinate"
],
"type": "string"
},
"description": "Optional additional row metadata: native_coordinate adds native_lat/native_lon for mapping requested sampling onto source cells; index_updated_at adds index freshness. Do not request forecasted_at or forecasted_time here; both are regular response columns returned automatically."
}
},
"description": "Request body to validate. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff for /timeseries. Use request.coordinates for point coordinates and request.variables for variable selectors.",
"additionalProperties": true
},
"endpoint": {
"enum": [
"timeseries",
"runs"
],
"type": "string",
"description": "Endpoint to validate."
}
},
"additionalProperties": false
}| is_ensemble | boolean | Filter to ensemble datasets when true, or deterministic datasets when false. |
| forecast_time | string | Optional RFC3339 valid time with offset, e.g. 2026-10-16T12:00:00-03:00. Response normalizes to UTC. Filters nominal horizon, not live run availability. Resolve place and local timezone first; never assume local noon is UTC noon. |
| shared_parameter | string | Weather concept code, e.g. temperature_2m. Return only validated equivalents, including request fragments and approximation labels. |
{
"type": "object",
"properties": {
"tag": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Tag or list of tags. Multiple tags use AND semantics in the API."
},
"code": {
"oneOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Dataset code or list of dataset codes, for example gfs or [\"gfs\", \"ifsoper\"]."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Maximum candidates to return; omit to inspect alternatives including unknown coverage."
},
"family": {
"type": "string",
"description": "Dataset family filter, for example gfs, ifs, nbm, hrrr, rap, rtma, urma."
},
"region": {
"type": "object",
"required": [
"minLat",
"maxLat",
"minLon",
"maxLon"
],
"properties": {
"maxLat": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"maxLon": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"minLat": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"minLon": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
"sort_by": {
"enum": [
"resolution"
],
"type": "string",
"description": "Sort candidates by nominal source resolution, finest first; unknown coverage/resolution sorts last. Read coverage_kind before claiming a winner."
},
"provider": {
"type": "string",
"description": "Case-insensitive provider substring, e.g. Met Office, ECMWF, NOAA, DWD."
},
"is_ensemble": {
"type": "boolean",
"description": "Filter to ensemble datasets when true, or deterministic datasets when false."
},
"forecast_time": {
"type": "string",
"description": "Optional RFC3339 valid time with offset, e.g. 2026-10-16T12:00:00-03:00. Response normalizes to UTC. Filters nominal horizon, not live run availability. Resolve place and local timezone first; never assume local noon is UTC noon."
},
"shared_parameter": {
"type": "string",
"description": "Weather concept code, e.g. temperature_2m. Return only validated equivalents, including request fragments and approximation labels."
}
},
"additionalProperties": false
}| Optional result delivery mode. Set inline for CSV, JSON, or NDJSON in the MCP result, or url for a short-lived signed resource link. Omission defaults to inline for text formats; Parquet always uses URL delivery and rejects delivery=inline. For a resource_link blocked by client network policy, do not retry URL delivery: if a text artifact is at most 10000000 bytes, retry the same request at most once with delivery=inline; otherwise reduce it using the documented split order first. |
| max_bytes | integer | Maximum inline response bytes to return through MCP for CSV/JSON/NDJSON. Default and server-side maximum are 10000000. This setting does not limit artifacts delivered by signed URL. 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 only when a compatible Parquet reader is already known to be available. If reader availability is unknown, do not spend tool calls probing or installing packages; use text/csv with delivery=url immediately. Use one grid request, process the downloaded 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. |
{
"type": "object",
"required": [
"dataset",
"request"
],
"properties": {
"accept": {
"enum": [
"text/csv",
"application/json",
"application/ndjson",
"application/x-ndjson",
"application/vnd.apache.parquet",
"application/x-parquet",
"application/parquet"
],
"type": "string",
"description": "Desired response format. Defaults to text/csv for compatibility. For dense grids and large tabular analysis, use application/vnd.apache.parquet only when a compatible reader is already known to be available. If reader availability is unknown, do not probe or install packages; use text/csv with delivery=url immediately."
},
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma."
},
"request": {
"type": "object",
"properties": {
"asOf": {
"type": "string",
"description": "Do not set asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Omit asOf for latest or best-available forecasts because it filters out forecast runs newer than the cutoff and can make recent data look missing. This is a UTC model-run-time cutoff for /timeseries, not a live API availability timestamp."
},
"grid": {
"type": "object",
"required": [
"minLatitude",
"maxLatitude",
"minLongitude",
"maxLongitude",
"step"
],
"properties": {
"step": {
"type": "number",
"description": "Requested sampling step in degrees, greater than 0. Finer sampling does not increase forecast resolution. Native latitude and longitude steps can differ; projected and unstructured grids have no single degree step."
},
"maxLatitude": {
"type": "number"
},
"minLatitude": {
"type": "number"
},
"maxLongitude": {
"type": "number"
},
"minLongitude": {
"type": "number"
}
},
"description": "Optional regular latitude/longitude grid. Use this instead of or in addition to coordinates. The API preserves the requested step and does not silently coarsen fine grids. The default limit is 120000 expanded coordinates; account-specific plan or token settings may set a different maximum up to 1050000, enough for a full native 0.25-degree global GFS grid, and an oversized-response error reports the applicable maximum. Use URL delivery for dense grids before considering spatial tiling.",
"additionalProperties": false
},
"filter": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Optional row filter expression evaluated from variable aliases.",
"additionalProperties": true
},
"members": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional ensemble member numbers."
},
"fromTime": {
"type": "string",
"description": "Inclusive UTC valid-time range start for /timeseries, for example 2025-05-01T00:00:00Z. Must be earlier than untilTime; use timesList for one exact valid time."
},
"timesList": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact UTC valid times for /timeseries, or exact UTC model run times for /runs. Use this for one exact time instead of setting range bounds equal."
},
"untilTime": {
"type": "string",
"description": "Exclusive UTC valid-time range end for /timeseries, for example 2025-05-01T06:00:00Z. Must be later than fromTime; equal bounds select no times."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"level",
"info"
],
"properties": {
"info": {
"type": "string",
"description": "Exact info string. Use an empty string when the catalog selector has no info value."
},
"name": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example TMP."
},
"alias": {
"type": "string",
"description": "Optional response field name. Strongly recommended."
},
"level": {
"type": "string",
"description": "Exact level string, for example 2 m above ground."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide intermediate variables used only by expressions."
}
},
"additionalProperties": false
},
"description": "Variable selectors. This exact field name is required. Do not use parameters, parameter, variable, selector, or selectors. Values must be exact case-sensitive selector tuples discovered from catalog tools."
},
"maxHorizon": {
"type": "integer",
"description": "Optional maximum lead time in hours."
},
"minHorizon": {
"type": "integer",
"description": "Optional minimum lead time in hours."
},
"coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees."
},
"name": {
"type": "string",
"description": "Optional coordinate label copied into the response."
}
},
"additionalProperties": false
},
"description": "Point coordinates. This exact field name is required. Do not use location, coord, coords, latitude/longitude at top level, or any singular replacement."
},
"expressions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Expression object.",
"additionalProperties": true
},
"description": "Optional derived variables evaluated from variable aliases."
},
"forecastedFrom": {
"type": "string",
"description": "Inclusive UTC model-run-time range start for /runs. Must be earlier than forecastedUntil; use timesList for one exact model run time."
},
"forecastedUntil": {
"type": "string",
"description": "Exclusive UTC model-run-time range end for /runs. Must be later than forecastedFrom; equal bounds select no times."
},
"includeMetadata": {
"type": "array",
"items": {
"enum": [
"index_updated_at",
"native_coordinate"
],
"type": "string"
},
"description": "Optional additional row metadata: native_coordinate adds native_lat/native_lon for mapping requested sampling onto source cells; index_updated_at adds index freshness. Do not request forecasted_at or forecasted_time here; both are regular response columns returned automatically."
}
},
"description": "Runs request body. Use timesList for exact UTC model run times, or the half-open range forecastedFrom+forecastedUntil where forecastedFrom is inclusive, forecastedUntil is exclusive, and forecastedFrom must be earlier than forecastedUntil. Equal bounds select no times. Coordinates must be in request.coordinates, and variable selectors must be in request.variables.",
"additionalProperties": true
},
"delivery": {
"enum": [
"inline",
"url"
],
"type": "string",
"description": "Optional result delivery mode. Set inline for CSV, JSON, or NDJSON in the MCP result, or url for a short-lived signed resource link. Omission defaults to inline for text formats; Parquet always uses URL delivery and rejects delivery=inline. For a resource_link blocked by client network policy, do not retry URL delivery: if a text artifact is at most 10000000 bytes, retry the same request at most once with delivery=inline; otherwise reduce it using the documented split order first."
},
"max_bytes": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "Maximum inline response bytes to return through MCP for CSV/JSON/NDJSON. Default and server-side maximum are 10000000. This setting does not limit artifacts delivered by signed URL. 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 only when a compatible Parquet reader is already known to be available. If reader availability is unknown, do not spend tool calls probing or installing packages; use text/csv with delivery=url immediately. Use one grid request, process the downloaded 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."
}
},
"additionalProperties": false
}| delivery | string | Optional result delivery mode. Set inline for CSV, JSON, or NDJSON in the MCP result, or url for a short-lived signed resource link. Omission defaults to inline for text formats; Parquet always uses URL delivery and rejects delivery=inline. For a resource_link blocked by client network policy, do not retry URL delivery: if a text artifact is at most 10000000 bytes, retry the same request at most once with delivery=inline; otherwise reduce it using the documented split order first. |
| max_bytes | integer | Maximum inline response bytes to return through MCP for CSV/JSON/NDJSON. Default and server-side maximum are 10000000. This setting does not limit artifacts delivered by signed URL. 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 only when a compatible Parquet reader is already known to be available. If reader availability is unknown, do not spend tool calls probing or installing packages; use text/csv with delivery=url immediately. Use one grid request, process the downloaded 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. |
{
"type": "object",
"required": [
"dataset",
"request"
],
"properties": {
"accept": {
"enum": [
"text/csv",
"application/json",
"application/ndjson",
"application/x-ndjson",
"application/vnd.apache.parquet",
"application/x-parquet",
"application/parquet"
],
"type": "string",
"description": "Desired response format. Defaults to text/csv for compatibility. For dense grids and large tabular analysis, use application/vnd.apache.parquet only when a compatible reader is already known to be available. If reader availability is unknown, do not probe or install packages; use text/csv with delivery=url immediately."
},
"dataset": {
"type": "string",
"description": "Dataset code, for example gfs, ifsoper, nbm, hrrr, or urma."
},
"request": {
"type": "object",
"properties": {
"asOf": {
"type": "string",
"description": "Do not set asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Omit asOf for latest or best-available forecasts because it filters out forecast runs newer than the cutoff and can make recent data look missing. This is a UTC model-run-time cutoff for /timeseries, not a live API availability timestamp."
},
"grid": {
"type": "object",
"required": [
"minLatitude",
"maxLatitude",
"minLongitude",
"maxLongitude",
"step"
],
"properties": {
"step": {
"type": "number",
"description": "Requested sampling step in degrees, greater than 0. Finer sampling does not increase forecast resolution. Native latitude and longitude steps can differ; projected and unstructured grids have no single degree step."
},
"maxLatitude": {
"type": "number"
},
"minLatitude": {
"type": "number"
},
"maxLongitude": {
"type": "number"
},
"minLongitude": {
"type": "number"
}
},
"description": "Optional regular latitude/longitude grid. Use this instead of or in addition to coordinates. The API preserves the requested step and does not silently coarsen fine grids. The default limit is 120000 expanded coordinates; account-specific plan or token settings may set a different maximum up to 1050000, enough for a full native 0.25-degree global GFS grid, and an oversized-response error reports the applicable maximum. Use URL delivery for dense grids before considering spatial tiling.",
"additionalProperties": false
},
"filter": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Optional row filter expression evaluated from variable aliases.",
"additionalProperties": true
},
"members": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Optional ensemble member numbers."
},
"fromTime": {
"type": "string",
"description": "Inclusive UTC valid-time range start for /timeseries, for example 2025-05-01T00:00:00Z. Must be earlier than untilTime; use timesList for one exact valid time."
},
"timesList": {
"type": "array",
"items": {
"type": "string"
},
"description": "Exact UTC valid times for /timeseries, or exact UTC model run times for /runs. Use this for one exact time instead of setting range bounds equal."
},
"untilTime": {
"type": "string",
"description": "Exclusive UTC valid-time range end for /timeseries, for example 2025-05-01T06:00:00Z. Must be later than fromTime; equal bounds select no times."
},
"variables": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"level",
"info"
],
"properties": {
"info": {
"type": "string",
"description": "Exact info string. Use an empty string when the catalog selector has no info value."
},
"name": {
"type": "string",
"description": "Exact case-sensitive parameter short name, for example TMP."
},
"alias": {
"type": "string",
"description": "Optional response field name. Strongly recommended."
},
"level": {
"type": "string",
"description": "Exact level string, for example 2 m above ground."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide intermediate variables used only by expressions."
}
},
"additionalProperties": false
},
"description": "Variable selectors. This exact field name is required. Do not use parameters, parameter, variable, selector, or selectors. Values must be exact case-sensitive selector tuples discovered from catalog tools."
},
"maxHorizon": {
"type": "integer",
"description": "Optional maximum lead time in hours."
},
"minHorizon": {
"type": "integer",
"description": "Optional minimum lead time in hours."
},
"coordinates": {
"type": "array",
"items": {
"type": "object",
"required": [
"lat",
"lon"
],
"properties": {
"lat": {
"type": "number",
"description": "Latitude in decimal degrees."
},
"lon": {
"type": "number",
"description": "Longitude in decimal degrees."
},
"name": {
"type": "string",
"description": "Optional coordinate label copied into the response."
}
},
"additionalProperties": false
},
"description": "Point coordinates. This exact field name is required. Do not use location, coord, coords, latitude/longitude at top level, or any singular replacement."
},
"expressions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"alias": {
"type": "string",
"description": "Output field name for the expression."
},
"hidden": {
"type": "boolean",
"description": "Optional: hide this expression from the response output."
},
"expression": {
"type": "string",
"description": "Expression text. Reference variable aliases, not raw selector names."
}
},
"description": "Expression object.",
"additionalProperties": true
},
"description": "Optional derived variables evaluated from variable aliases."
},
"forecastedFrom": {
"type": "string",
"description": "Inclusive UTC model-run-time range start for /runs. Must be earlier than forecastedUntil; use timesList for one exact model run time."
},
"forecastedUntil": {
"type": "string",
"description": "Exclusive UTC model-run-time range end for /runs. Must be later than forecastedFrom; equal bounds select no times."
},
"includeMetadata": {
"type": "array",
"items": {
"enum": [
"index_updated_at",
"native_coordinate"
],
"type": "string"
},
"description": "Optional additional row metadata: native_coordinate adds native_lat/native_lon for mapping requested sampling onto source cells; index_updated_at adds index freshness. Do not request forecasted_at or forecasted_time here; both are regular response columns returned automatically."
}
},
"description": "Timeseries request body. Use timesList for exact UTC valid times, or the half-open range fromTime+untilTime where fromTime is inclusive, untilTime is exclusive, and fromTime must be earlier than untilTime. Equal bounds select no times. Omit asOf unless the user explicitly asks for backtesting, time travel, what was known then, or a historical model-run cutoff. Coordinates must be in request.coordinates, and variable selectors must be in request.variables.",
"additionalProperties": true
},
"delivery": {
"enum": [
"inline",
"url"
],
"type": "string",
"description": "Optional result delivery mode. Set inline for CSV, JSON, or NDJSON in the MCP result, or url for a short-lived signed resource link. Omission defaults to inline for text formats; Parquet always uses URL delivery and rejects delivery=inline. For a resource_link blocked by client network policy, do not retry URL delivery: if a text artifact is at most 10000000 bytes, retry the same request at most once with delivery=inline; otherwise reduce it using the documented split order first."
},
"max_bytes": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "Maximum inline response bytes to return through MCP for CSV/JSON/NDJSON. Default and server-side maximum are 10000000. This setting does not limit artifacts delivered by signed URL. 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 only when a compatible Parquet reader is already known to be available. If reader availability is unknown, do not spend tool calls probing or installing packages; use text/csv with delivery=url immediately. Use one grid request, process the downloaded 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."
}
},
"additionalProperties": false
}