Serveur MCP

Smarter Weather

io.github.smarterweather/weather

Ce que fait ce MCP

Provides weather forecasts, observations, alerts, air quality, climate data, severe-weather analysis, maps, and gridded meteorological datasets.

compare_locations
Compare locations
Compare forecast variables across multiple locations side-by-side in one batched call. Returns a distilled per-location series matrix for direct comparison -- prefer this over N sequential forecast calls. Locations accept place names directly. Example: {"locations": [{"location": "Denver"}, {"location": "Boulder, CO"}], "variables": ["temperature_2m", "precipitation_probability"], "hours": 48}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['locations', 'variables'], 'properties': {'hours': {'type': 'integer', 'default': 24, 'maximum': 168, 'minimum': 1, 'description': 'Forecast hours. Default 24.'}, 'locations': {'type': 'array', 'items': {'type': 'object', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180}, 'label': {'type': 'string', 'description': 'Optional display label (e.g. "Denver warehouse").'}, 'location': {'type': 'string', 'description': 'Place name, ZIP, or "lat,lon" (e.g. "Denver", "Boulder, CO").'}}, 'additionalProperties': False}, 'maxItems': 10, 'minItems': 2, 'description': 'Locations to compare (2-10). Each takes location OR lat/lon, optional label.'}, 'variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 10, 'minItems': 1, 'description': 'Standard variable names (e.g. temperature_2m, precipitation).'}, 'dataset_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Dataset override. Default: auto-resolved NBM per location.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['variables', 'hours', 'comparisons'], 'properties': {'hours': {'type': 'number'}, 'variables': {'type': 'array', 'items': {'type': 'string'}}, 'comparisons': {'type': 'array', 'items': {'type': 'object', 'required': ['location'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}}}, 'additionalProperties': False}
describe_dataset
Describe dataset
Variables available in a dataset, with standard names, units, descriptions, and the time range of available data. Use before query_dataset to discover valid variable names. Example: {"dataset_id": "nbm_conus"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['dataset_id'], 'properties': {'dataset_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Pipeline dataset identifier (e.g. "nbm_conus", "mrms_reflectivity_conus"). Discover valid values with list_datasets; inspect variables with describe_dataset.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['dataset_id', 'detail'], 'properties': {'detail': {'type': 'object', 'additionalProperties': {}}, 'dataset_id': {'type': 'string'}}, 'additionalProperties': False}
find_best_window
Find best weather window
Find the optimal time window for an activity based on weather criteria. Scans the forecast and returns daylight-aware periods matching all conditions. Criteria are expressed in the selected `units` system (default imperial: °F, mph, miles, feet). Example: {"location": "Boulder, CO", "criteria": {"min_temperature": 55, "max_wind_speed": 15, "max_precipitation_probability": 20}, "hours": 72, "activity_duration_hours": 3}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['criteria'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'hours': {'type': 'integer', 'default': 72, 'maximum': 168, 'minimum': 1, 'description': 'Hours to search. Default 72.'}, 'units': {'enum': ['imperial', 'metric', 'si'], 'type': 'string', 'default': 'imperial', 'description': 'Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial.'}, 'activity': {'type': 'string', 'maxLength': 200, 'description': 'Free-form activity to rate the windows for (e.g. "afternoon golf"). Accepted even when rating is off so clients can send it.'}, 'criteria': {'type': 'object', 'properties': {'min_ceiling': {'type': 'number', 'description': 'Minimum cloud ceiling in the selected units (feet / m / m).'}, 'max_wind_gust': {'type': 'number', 'description': 'Maximum wind gust in the selected units (mph / km/h / m/s).'}, 'max_wind_speed': {'type': 'number', 'description': 'Maximum sustained wind in the selected units (mph / km/h / m/s).'}, 'min_visibility': {'type': 'number', 'description': 'Minimum visibility in the selected units (miles / km / m).'}, 'max_temperature': {'type': 'number', 'description': 'Maximum temperature in the selected units (°F / °C / K).'}, 'min_temperature': {'type': 'number', 'description': 'Minimum temperature in the selected units (°F / °C / K).'}, 'max_precipitation_probability': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Maximum acceptable precipitation probability (0-100%).'}}, 'description': 'Weather criteria defining acceptable conditions (all optional).', 'additionalProperties': False}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'daylight_only': {'type': 'boolean', 'default': True, 'description': 'Only consider daylight hours (sunrise to sunset). Default true.'}, 'activity_duration_hours': {'type': 'integer', 'default': 2, 'maximum': 24, 'minimum': 1, 'description': 'Minimum consecutive hours meeting criteria. Default 2.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'units', 'windows', 'criteria_applied', 'daylight_only', 'activity_duration_hours'], 'properties': {'units': {'type': 'string'}, 'message': {'type': 'string'}, 'windows': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end', 'hours'], 'properties': {'end': {'type': 'string'}, 'hours': {'type': 'number'}, 'start': {'type': 'string'}, 'rating': {'enum': ['unworkable', 'poor', 'workable', 'good', 'ideal'], 'type': 'string'}, 'limiting_factor': {'enum': ['wind', 'precip', 'temperature', 'visibility', 'storms', 'none'], 'type': 'string'}}, 'additionalProperties': False}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'sun_times': {'type': 'array', 'items': {'type': 'object', 'required': ['sunrise', 'sunset'], 'properties': {'sunset': {'type': 'string'}, 'sunrise': {'type': 'string'}}, 'additionalProperties': False}}, 'daylight_only': {'type': 'boolean'}, 'criteria_applied': {'type': 'object', 'additionalProperties': {}}, 'activity_duration_hours': {'type': 'number'}}, 'additionalProperties': False}
get_air_quality
Get air quality
AirNow air quality at a location (CONUS): current overall AQI plus per-pollutant detail (PM2.5, ozone, PM10 concentrations) and the AirNow AQI forecast. AQI scale: 0-50 good, 51-100 moderate, 101-150 unhealthy for sensitive groups, 151-200 unhealthy, 201-300 very unhealthy, 301+ hazardous. pollutants=["aqi"] (default) is the cheap headline call; add pollutant keys or include_forecast=true when the user digs in. Example: {"location": "Boise", "pollutants": ["aqi", "pm25"], "include_forecast": true}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'pollutants': {'type': 'array', 'items': {'enum': ['aqi', 'pm25', 'ozone', 'pm10'], 'type': 'string'}, 'default': ['aqi'], 'description': 'Which measurements to return. aqi = combined AQI index. Default: ["aqi"].'}, 'include_forecast': {'type': 'boolean', 'default': False, 'description': 'Also return the AirNow next-day AQI forecast.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'current'], 'properties': {'widget': {'type': 'object', 'required': ['spec', 'entries'], 'properties': {'spec': {'type': 'string', 'const': 'sw-ui-spec'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['component', 'props'], 'properties': {'props': {'type': 'object', 'additionalProperties': {}}, 'component': {'type': 'string'}}, 'additionalProperties': False}}}, 'description': 'sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.', 'additionalProperties': False}, 'current': {'type': 'array', 'items': {'type': 'object', 'required': ['dataset_id', 'valid_times', 'data'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'dataset_id': {'type': 'string'}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}}, 'forecast': {'type': 'array', 'items': {'type': 'object', 'required': ['dataset_id', 'valid_times', 'data'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'dataset_id': {'type': 'string'}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}}, 'additionalProperties': False}
get_alerts
Get NWS alerts
NWS watches, warnings, advisories. Point (city/ZIP/lat+lon): containing polygons. BBox or US state/DC/CONUS (codes, full names, US/national): intersecting polygons. A city miss is not a statewide all-clear — query the state or a bbox; never say regional inventory is impossible. NY/WA and "New York State"/"Washington State" are states; "New York"/"Washington" stay cities. Omit at for now; at (ISO-8601 UTC) is the snapshot then. Empty = all-clear or purged (~24h). alert_id = detail+geometry, ignores at. Ex: {"location":"WI","events":["Tornado Warning"]}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'at': {'type': 'string', 'description': 'ISO-8601 UTC past instant for the in-effect snapshot. Ignored with alert_id.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'bbox': {'type': 'object', 'required': ['west', 'south', 'east', 'north'], 'properties': {'east': {'$ref': '#/properties/lon'}, 'west': {'$ref': '#/properties/lon'}, 'north': {'$ref': '#/properties/lat'}, 'south': {'$ref': '#/properties/lat'}}, 'description': 'Bounding box {west,south,east,north}. Skips geocoding; intersecting polygons.', 'additionalProperties': False}, 'events': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional event-name filter, e.g. ["Tornado Warning"].'}, 'alert_id': {'type': 'string', 'description': 'Alert identifier for detail mode. When set, location is ignored.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'alert': {'type': 'object', 'additionalProperties': {}}, 'alerts': {}, 'widget': {'type': 'object', 'required': ['spec', 'entries'], 'properties': {'spec': {'type': 'string', 'const': 'sw-ui-spec'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['component', 'props'], 'properties': {'props': {'type': 'object', 'additionalProperties': {}}, 'component': {'type': 'string'}}, 'additionalProperties': False}}}, 'description': 'sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.', 'additionalProperties': False}, 'alert_id': {'type': 'string'}, 'location': {'type': 'object', 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'valid_time': {'type': 'string', 'description': 'Echo of at when an as-of snapshot was requested.'}}, 'additionalProperties': False}
get_climate_normals
Get climate normals
Day-of-year climate normals (NCEI 1991-2020 30-year averages) for a US location, from the nearest station with a record. Returns normal high, normal low, and normal mean for each date in the window, plus the station and how far away it is. Use this whenever a question needs a baseline rather than a forecast: "is this warm for October?", "what is a typical high here in January?", "how does this week compare to normal?". Pair it with get_forecast to say how far above or below normal the coming days run. Covers dates by day of year, so it answers for any date, past or future -- these are long-period averages, not a forecast and not observed history for a specific year.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lat', 'lon'], 'properties': {'end': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Inclusive range end as YYYY-MM-DD. Must be supplied with start.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'days': {'type': 'integer', 'maximum': 366, 'minimum': 1, 'description': 'Range length in days when start/end are omitted; the window opens today (default 14).'}, 'unit': {'enum': ['imperial', 'metric'], 'type': 'string', 'description': 'Unit system for the normals. Default imperial (°F).'}, 'start': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Inclusive range start as YYYY-MM-DD. Must be supplied with end.'}}, 'additionalProperties': False}
get_climate_records
Get climate reports and records
NWS daily climate data: type=reports returns CLI daily climate reports (observed high/low/precip vs normals per station); type=records returns RER record event reports (record highs/lows/rainfall actually set). Filter by wfo (3-letter office, e.g. DMX), station, date (YYYY-MM-DD), start/end range, or hours lookback. Examples: {"type": "records", "hours": 48} or {"type": "reports", "wfo": "DMX", "date": "2026-07-04"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type'], 'properties': {'end': {'type': 'string', 'description': 'Range end date, YYYY-MM-DD.'}, 'wfo': {'type': 'string', 'maxLength': 4, 'minLength': 3, 'description': 'WFO office filter (e.g. DMX, OUN).'}, 'date': {'type': 'string', 'description': 'Single date, YYYY-MM-DD.'}, 'type': {'enum': ['reports', 'records'], 'type': 'string', 'description': 'reports = CLI daily climate reports; records = RER record events.'}, 'hours': {'type': 'integer', 'maximum': 168, 'minimum': 1, 'description': 'Lookback window in hours (1-168) when no date/range is given.'}, 'start': {'type': 'string', 'description': 'Range start date, YYYY-MM-DD.'}, 'station': {'type': 'string', 'description': 'Station identifier filter (reports only).'}, 'record_type': {'type': 'string', 'description': 'Record type filter (records only), e.g. HIGH, LOW, RAIN.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type', 'results'], 'properties': {'type': {'type': 'string'}, 'results': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_current_conditions
Get current conditions
Current weather right now at a location from two independent sources in one call: the RTMA gridded analysis (exact-point values, updated sub-hourly) and the nearest METAR station observation (ground truth with raw METAR, flight category). Use the analysis for point-accurate values and the station for verification. For a forecast, use get_forecast. Example: {"location": "Pella, IA"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'analysis', 'nearest_station'], 'properties': {'analysis': {'anyOf': [{'type': 'object', 'required': ['dataset_id', 'valid_times', 'data'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'dataset_id': {'type': 'string'}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}, {'type': 'null'}]}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'nearest_station': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}}, 'additionalProperties': False}
get_forecast
Get forecast
Complete weather overview for a location: current conditions, daily forecast (day/night periods, SPC threats, severity, CAPE, UV), active alerts, and convective outlooks in one call. Data is pre-aggregated across NBM, HRRR, GFS, RTMA, and SPC and unit-converted server-side. This is the primary weather tool; reach for lower-level tools only when you need raw observations or a specific dataset. Accepts a place name directly. Examples: {"location": "Denver"} or {"location": "Portland, OR", "days": 5} or {"lat": 41.4, "lon": -92.9}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'days': {'type': 'integer', 'default': 10, 'maximum': 14, 'minimum': 1, 'description': 'Number of forecast days (1-14). Default 10.'}, 'units': {'enum': ['imperial', 'metric', 'si'], 'type': 'string', 'default': 'imperial', 'description': 'Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial.'}, 'include': {'type': 'string', 'default': 'current,daily,alerts,outlooks', 'description': 'Comma-separated sections: current, daily, hourly, alerts, outlooks. Default "current,daily,alerts,outlooks". Use get_hourly_forecast for hourly detail.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'detail_level': {'enum': ['standard', 'detailed'], 'type': 'string', 'default': 'standard', 'description': 'standard: compact response (~5-10KB); daily includes day_precip_probability / night_precip_probability when available (precip_probability is max of day/night). detailed: also preserves CAPE, UV, full day/night period objects, extra hourly fields (~12-20KB).'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'units', 'forecast'], 'properties': {'units': {'type': 'string'}, 'widget': {'type': 'object', 'required': ['spec', 'entries'], 'properties': {'spec': {'type': 'string', 'const': 'sw-ui-spec'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['component', 'props'], 'properties': {'props': {'type': 'object', 'additionalProperties': {}}, 'component': {'type': 'string'}}, 'additionalProperties': False}}}, 'description': 'sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.', 'additionalProperties': False}, 'forecast': {'type': 'object', 'additionalProperties': {}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'data_status': {'type': 'object', 'description': 'Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document.', 'additionalProperties': {}}}, 'additionalProperties': False}
get_forecast_discussion
Get forecast discussion
Expert forecaster text products. type=afd: Area Forecast Discussion. type=hwo: Hazardous Weather Outlook. type=now: WFO short-term NOW. type=fwf/hls/esf: local fire weather / hurricane local statement / hydrologic discussion. type=mcd: SPC Mesoscale Discussion. type=mpd: WPC Mesoscale Precipitation Discussion (flash flood). type=swo/fwd/ero: national outlook discussions. type=tcd/tcp/tcm/twd/two: NHC tropical text (type=two is the text TWO, not GIS nhc_two). type=pmd: WPC/CPC desk discussion (pass awips_id for a specific desk, e.g. PMDSPD). type=pwo: SPC public weather outlook. National types (swo/fwd/ero/tcd/tcp/tcm/twd/two/pmd/pwo) need no location; `day` selects the outlook day for swo and fwd. summary_only=true returns the pipeline LLM summary without the full body. Examples: {"location": "Des Moines", "type": "afd"} or {"type": "swo", "day": 2, "summary_only": true}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type'], 'properties': {'day': {'type': 'integer', 'default': 1, 'maximum': 8, 'minimum': 1, 'description': 'Outlook day for type=swo or type=fwd (1-8). Ignored for the other types; WPC files ERO days 1-3 under one product.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'wfo': {'type': 'string', 'maxLength': 4, 'minLength': 3, 'description': 'WFO identifier override (e.g. BOU). Default: resolved from the location.'}, 'type': {'enum': ['afd', 'hwo', 'now', 'fwf', 'hls', 'esf', 'mcd', 'mpd', 'swo', 'fwd', 'ero', 'tcd', 'tcp', 'tcm', 'twd', 'two', 'pmd', 'pwo'], 'type': 'string', 'description': 'Product type: afd (WFO discussion), hwo (hazard outlook), now (short-term NOW), fwf/hls/esf (local WFO), mcd (SPC mesoscale), mpd (WPC precipitation discussion), swo (SPC convective outlook), fwd (SPC fire weather), ero (WPC excessive rainfall), tcd/tcp/tcm/twd/two (NHC tropical text; two is text TWO not GIS), pmd (desk discussion), pwo (SPC public outlook).'}, 'limit': {'type': 'integer', 'default': 1, 'maximum': 10, 'minimum': 1, 'description': 'Number of recent products (1-10). Default 1 (latest).'}, 'awips_id': {'type': 'string', 'maxLength': 12, 'minLength': 3, 'description': 'Full AWIPS identifier (e.g. TCDAT1, PMDSPD). More specific than type + location. Exact source_ref match.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'summary_only': {'type': 'boolean', 'default': False, 'description': 'Return only the LLM summary + sections, omitting the full body text.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['type', 'products'], 'properties': {'type': {'type': 'string'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'products': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}}, 'additionalProperties': False}
get_forecast_distribution
Get forecast distribution
Probabilistic forecast guidance from NBM for one aspect of the weather: percentile ranges (p10-p90), exceedance probabilities, and ensemble spread. Use this for any question about odds, ranges, potential or confidence ("how much could we get", "worst case for the wind", "how sure is this") -- a deterministic forecast value cannot answer one. Reading the percentiles: p50 is the most likely outcome, p90 is the reasonable worst case when the risk is the high end (snow totals, wind, rainfall), and p10 is the reasonable worst case when the risk is the low end (cold, minimum visibility, ceiling). A single percentile is not the forecast -- report the likely value with the tail that matters, and label which is which. Aspects: precip (PoP, QPF + percentiles), snow (accumulation percentiles, >1/2/4in probabilities, snow level), ice (freezing rain, accretion), temperature (temp/dewpoint + stddev), wind (speed/gust percentiles), severe (hail/tornado/damaging-wind probabilities), aviation (LIFR/IFR/MVFR visibility + ceiling probabilities), confidence (ensemble stddev; low spread = settled forecast, high spread = details still in play). Examples: {"location": "Denver", "aspect": "snow", "hours": 72} or {"lat": 32.9, "lon": -97.0, "aspect": "severe"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['aspect'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'hours': {'type': 'integer', 'maximum': 264, 'minimum': 1, 'description': 'Forecast hours (1-264). Default varies by aspect (48-72).'}, 'aspect': {'enum': ['precip', 'snow', 'ice', 'temperature', 'wind', 'severe', 'aviation', 'confidence'], 'type': 'string', 'description': 'Which distribution family to return (see tool description).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'aspect', 'hours', 'series'], 'properties': {'hours': {'type': 'number'}, 'aspect': {'enum': ['precip', 'snow', 'ice', 'temperature', 'wind', 'severe', 'aviation', 'confidence'], 'type': 'string'}, 'series': {'type': 'array', 'items': {'type': 'object', 'required': ['dataset_id', 'valid_times', 'data'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'dataset_id': {'type': 'string'}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': False}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}}, 'additionalProperties': False}
get_forecast_skill
Get forecast skill
How accurate our forecasts have actually been near a location, measured against observed analysis truth. Returns bias (positive = the model runs high), mean absolute error, RMSE, and a skill score against local climatology, per model, weather variable, and forecast lead time; continuous and vector entries also carry persistenceSkillScore, skill against the analysis at forecast issue time (null means not enough persist pairs, not zero skill -- do not compare it to skillScore as if they shared a denominator), and analysisDisagreementMae, the analyses' own disagreement at that lead -- a floor on how good the forecast can look, not a skill score and not an excuse (null means the sibling row is missing or below minimumSamples); for probability forecasts, the Brier score and a reliability breakdown. Use this to qualify a forecast rather than assert it -- "NBM has been running 1.8F warm at 3-day leads near you, so treat that 72 as around 70" -- and to answer "how much should I trust this forecast", "is the model biased here", or "how accurate were you last month". Evidence is reported at three scopes side by side: the exact point (strongest, slowest to accumulate), the ~50km neighborhood, and the ~300km region. Prefer the most specific scope that has samples. Metrics below minimumSamples observations are withheld and listed under insufficientHistory with their count -- say that history is still accumulating rather than treating thin numbers as evidence. Coverage is a rolling recent window over verified US variables, not all of history. Entries are per model and their samples are not matched, so never conclude that one model beats another by comparing their numbers here. Each entry states the truth field it was measured against -- one designated analysis per variable -- so never compare numbers carrying different truth values either. Each entry also states the regime it was measured under: ALL for every observation regardless of weather, or a conditioned tier such as SEA:DJF (winter), SCN1:WINDY / SCN1:WET / SCN1:QUIET (what the forecast was showing), or JC1:NW (a circulation pattern). Pass the regime parameter to ask for a conditioned track record. It falls back, so asking for SCN1:WINDY and getting back regime ALL is a successful answer, not a missing one -- always read the regime field and qualify the claim with it, because "NBM runs warm here when it shows windy" and "NBM runs warm here" are different statements. Regimes overlap by construction across families, so entries under different regimes are alternative answers to one question and must never be compared or added; within SCN1: the labels are mutually exclusive. Entries with a categorical block answer a yes/no question instead of an error magnitude -- did it rain, at the thresholdMm stated on the entry -- with pod (of the times it happened, how often we called it), far (of the times we called it, how often it did not happen), and frequencyBias (above 1 = we call it too often). Use these for "will it actually rain" questions, where a small average error means nothing if the rain lands in the wrong hour. A null rate means the sample cannot answer it -- the event has not happened, or been forecast, enough times to divide by -- and must be reported as unknown, never as zero. The counts beside it are still evidence, and for a rare event they are often the whole answer: "it has only rained twice here in the record" is a useful thing to say.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'unit': {'enum': ['imperial', 'metric', 'si'], 'type': 'string', 'description': 'Units for the error magnitudes. Default imperial (bias/MAE/RMSE in °F, mph, in).'}, 'model': {'type': 'string', 'description': 'Narrow to one model, e.g. nbm or rrfs.'}, 'truth': {'type': 'string', 'description': 'Measure against a named truth source instead of the default one for each variable, e.g. urma. Only pass this if the user asked which analysis was used or named one; the default is already the designated source, and the analyses disagree, so switching changes the numbers.'}, 'regime': {'type': 'string', 'description': 'Ask for a track record measured only under particular conditions, as a comma-separated preference chain, most specific first, e.g. "SCN1:WINDY,SEA:JJA". SEA: is the meteorological season (DJF, MAM, JJA, SON); SCN1: is a forecast-conditioned scenario (WINDY, WET, QUIET â\x80\x94 mutually exclusive within the family); JC1: is a circulation pattern. The most specific tier with enough observations answers and the unconditioned record is the last resort, so this never empties a result the way truth does -- it degrades. Read the regime field on each entry to see which tier actually answered. Pass this when the question is conditional ("is it worse in winter", "how does it do when the model shows windy"); omit it otherwise, since conditioned tiers are thinner and slower to earn numbers.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'variable': {'type': 'string', 'description': 'Narrow to one variable, e.g. temperature_2m, dew_point_2m, wind_speed_10m, wind_gusts_10m, wind_vector_10m, cloud_cover, precipitation, precipitation_probability, or a thresholded rain event such as precipitation_gt_0p254mm (any measurable rain) or precipitation_gt_2p54mm. Omit for everything measured at the location.'}, 'lead_hours': {'type': 'integer', 'minimum': 1, 'description': 'Narrow to the lead time being asked about, in hours; the containing lead bucket is selected for you (60 gives the 48-72h bucket). Use the lead of the forecast you are qualifying: ~24 for tomorrow, ~72 for three days out. Never approximated -- a lead we have not verified returns no entries rather than a nearby bucket, so an empty result means we cannot speak to that range.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'units', 'minimumSamples', 'tracked', 'skill', 'insufficientHistory'], 'properties': {'cells': {'type': 'object', 'additionalProperties': {'type': 'string'}}, 'skill': {'type': 'array', 'items': {'type': 'object', 'required': ['model', 'variable', 'leadBucketHours', 'scope', 'metric'], 'properties': {'unit': {'type': 'string'}, 'model': {'type': 'string'}, 'scope': {'enum': ['point', 'neighborhood', 'region'], 'type': 'string'}, 'truth': {'type': 'string'}, 'metric': {'type': 'string'}, 'regime': {'type': 'string'}, 'vector': {'type': 'object', 'required': ['samples', 'vectorRmse'], 'properties': {'samples': {'type': 'number'}, 'skillScore': {'type': ['number', 'null']}, 'vectorRmse': {'type': 'number'}, 'persistenceSkillScore': {'type': ['number', 'null']}, 'analysisDisagreementMae': {'type': ['number', 'null']}, 'analysisDisagreementSamples': {'type': ['number', 'null']}}, 'additionalProperties': False}, 'variable': {'type': 'string'}, 'continuous': {'type': 'object', 'required': ['samples', 'bias', 'mae', 'rmse', 'meanObserved', 'observedVariance'], 'properties': {'mae': {'type': 'number'}, 'bias': {'type': 'number'}, 'rmse': {'type': 'number'}, 'samples': {'type': 'number'}, 'skillScore': {'type': ['number', 'null']}, 'meanObserved': {'type': 'number'}, 'observedVariance': {'type': 'number'}, 'persistenceSkillScore': {'type': ['number', 'null']}, 'analysisDisagreementMae': {'type': ['number', 'null']}, 'analysisDisagreementSamples': {'type': ['number', 'null']}}, 'additionalProperties': False}, 'categorical': {'type': 'object', 'required': ['samples', 'thresholdMm', 'hits', 'misses', 'falseAlarms', 'correctNegatives', 'baseRate'], 'properties': {'csi': {'type': ['number', 'null']}, 'ets': {'type': ['number', 'null']}, 'far': {'type': ['number', 'null']}, 'pod': {'type': ['number', 'null']}, 'hits': {'type': 'number'}, 'misses': {'type': 'number'}, 'samples': {'type': 'number'}, 'baseRate': {'type': 'number'}, 'falseAlarms': {'type': 'number'}, 'thresholdMm': {'type': 'number'}, 'baseVariable': {'type': 'string'}, 'frequencyBias': {'type': ['number', 'null']}, 'correctNegatives': {'type': 'number'}}, 'additionalProperties': False}, 'probabilistic': {'type': 'object', 'required': ['samples', 'brier', 'baseRate', 'reliability'], 'properties': {'brier': {'type': 'number'}, 'samples': {'type': 'number'}, 'baseRate': {'type': 'number'}, 'skillScore': {'type': ['number', 'null']}, 'reliability': {'type': 'array', 'items': {'type': 'object', 'required': ['bin', 'samples', 'meanForecast', 'observedFrequency'], 'properties': {'bin': {'type': 'number'}, 'samples': {'type': 'number'}, 'meanForecast': {'type': 'number'}, 'observedFrequency': {'type': 'number'}}, 'additionalProperties': False}}}, 'additionalProperties': False}, 'leadBucketHours': {'type': 'number'}}, 'additionalProperties': True}}, 'units': {'type': 'string'}, 'tracked': {'type': 'boolean', 'description': 'Whether this exact coordinate is one the verification pipeline tracks.'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'minimumSamples': {'type': 'number'}, 'insufficientHistory': {'type': 'array', 'items': {'type': 'object', 'required': ['model', 'variable', 'leadBucketHours', 'scope', 'samples'], 'properties': {'model': {'type': 'string'}, 'scope': {'enum': ['point', 'neighborhood', 'region'], 'type': 'string'}, 'truth': {'type': 'string'}, 'regime': {'type': 'string'}, 'samples': {'type': 'number'}, 'variable': {'type': 'string'}, 'leadBucketHours': {'type': 'number'}}, 'additionalProperties': True}}}, 'additionalProperties': False}
get_forecast_skill_map
Get forecast skill map
Measured forecast skill as a map of res-4 hexes inside a bounding box, sliced from the public skill map. Use this when the question is spatial ("where is NBM temperature skill weak across Colorado"), not "how good is the forecast at this point" — that is get_forecast_skill. Requires model, variable, lead_hours, and bbox {west,south,east,north}. lead_hours selects the containing published bucket (20 → NBM 24); a lead we have not published returns no slices rather than a nearby one. A hex is included when its center is inside the box; edge-overlapping hexes are dropped. The box cannot wrap the dateline. Each cell is [h3, samples, skill_score]; skill_score is unitless (fraction of climatological variance explained) and already gated at n ≥ 30. withheld lists hexes still accumulating. Do not compare slices across models or truths. This is CELL# only — never treat a hex as a person.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['bbox', 'model', 'variable', 'lead_hours'], 'properties': {'bbox': {'type': 'object', 'required': ['west', 'south', 'east', 'north'], 'properties': {'east': {'$ref': '#/properties/bbox/properties/west'}, 'west': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'north': {'$ref': '#/properties/bbox/properties/south'}, 'south': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}}, 'description': 'Bounding box {west,south,east,north}. Hexes whose H3 center falls inside are returned.', 'additionalProperties': False}, 'model': {'type': 'string', 'description': 'Model id, e.g. nbm, gfs, hrrr, or rrfs.'}, 'domain': {'type': 'string', 'description': 'Optional domain (conus, alaska, hawaii). Omit unless you already know it.'}, 'variable': {'type': 'string', 'description': 'Verified variable, e.g. temperature_2m, dew_point_2m, precipitation, or precipitation_gt_0p254mm.'}, 'lead_hours': {'type': 'integer', 'minimum': 1, 'description': 'Lead time in hours; the containing published bucket is selected. Never approximated.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['generated_at', 'atom_resolution', 'minimum_samples', 'bbox', 'slices'], 'properties': {'bbox': {'type': 'object', 'required': ['west', 'south', 'east', 'north'], 'properties': {'east': {'$ref': '#/properties/bbox/properties/west'}, 'west': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'north': {'$ref': '#/properties/bbox/properties/south'}, 'south': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}}, 'additionalProperties': False}, 'slices': {'type': 'array', 'items': {'type': 'object', 'required': ['model', 'domain', 'variable', 'lead_bucket_hours', 'metric', 'truth', 'cells', 'withheld'], 'properties': {'cells': {'type': 'array', 'items': {'type': 'array', 'items': {}}}, 'model': {'type': 'string'}, 'truth': {'type': 'string'}, 'domain': {'type': 'string'}, 'metric': {'type': 'string'}, 'variable': {'type': 'string'}, 'withheld': {'type': 'array', 'items': {'type': 'array', 'items': {}}}, 'threshold_mm': {'type': 'number'}, 'base_variable': {'type': 'string'}, 'lead_bucket_hours': {'type': 'number'}}, 'additionalProperties': True}}, 'generated_at': {'type': 'string'}, 'atom_resolution': {'type': 'number'}, 'minimum_samples': {'type': 'number'}}, 'additionalProperties': False}
get_growing_degree_days
Get growing degree days
Growing Degree Units (GDU / GDD) for a US location (CONUS, Alaska, Hawaii), computed from daily max/min temperatures. Pass a crop id (e.g. "corn", "soybean", "wheat") to use calibrated base/upper thresholds, or crop="custom" with base_temp_c (and optional upper_temp_c / method). Without season_start you get per-day GDU across the forecast horizon; WITH season_start (YYYY-MM-DD) you get the cumulative season-to-date total (observed history + today + forecast) plus a per-day cumulative series -- the number a grower tracks against crop milestones. Answers "how many growing degree days has my corn accumulated since May 1?" and "what's the GDU forecast this week?".
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lat', 'lon', 'crop'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'crop': {'type': 'string', 'description': 'Crop id from the catalog (e.g. "corn", "soybean", "wheat") or "custom" to supply your own thresholds via base_temp_c.'}, 'days': {'type': 'integer', 'maximum': 30, 'minimum': 1, 'description': 'Forecast horizon in days (default 10).'}, 'unit': {'enum': ['imperial', 'metric'], 'type': 'string', 'description': 'Unit system for GDU + temps. Default imperial (°F-days).'}, 'method': {'enum': ['simple', 'modified'], 'type': 'string', 'description': 'GDU method for custom crops. Defaults from whether upper_temp_c is set.'}, 'base_temp_c': {'type': 'number', 'description': 'Custom base threshold in °C. Required when crop="custom".'}, 'season_start': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$', 'description': 'Season/planting start as YYYY-MM-DD (local date). Presence switches the response to a cumulative season-to-date GDU total. Must be within the ~180-day observed window.'}, 'upper_temp_c': {'type': 'number', 'description': 'Custom upper cutoff in °C (enables the modified method). Optional.'}, 'day_definition': {'enum': ['nws', 'local_calendar'], 'type': 'string', 'description': 'Daily boundary: "nws" (default; NBM MaxT/MinT period extremes) or "local_calendar" (midnight-to-midnight local day).'}, 'include_milestones': {'type': 'boolean', 'description': "Include the crop's growth-stage GDU milestones in the response."}}, 'additionalProperties': False}
get_hourly_forecast
Get hourly forecast
Blended hourly forecast: temperature, feels-like, humidity, wind, precipitation probability/amount, conditions, and icon per hour. Snapped to the current hour so hourly[0] is "now". Timestamps are UTC ISO 8601; convert to the local timezone before presenting. Ask for the days you need up front -- one call with days: 4 beats four calls. ALWAYS check hourly_coverage before answering about a specific hour: it reports first_time and last_time (the window the rows actually span), sample_interval_hours (past the first day rows are every 2-3h, not every hour), and truncated: true when upstream returned less than you asked for. If the hour the user cares about is after last_time, say the forecast does not reach that far yet rather than answering from the nearest row you do have. For one stretch of time ask for that stretch with hours_from/hours_to: it comes back hour by hour even where the full range would be sampled. Accepts a place name or coordinates. Examples: {"location": "Portland, OR", "days": 2} or {"lat": 41.88, "lon": -87.63, "hours_from": 36, "hours_to": 48}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'days': {'type': 'integer', 'default': 2, 'maximum': 7, 'minimum': 1, 'description': 'Days of hourly data (1-7). Default 2. Widened when hours_to reaches further.'}, 'units': {'enum': ['imperial', 'metric', 'si'], 'type': 'string', 'default': 'imperial', 'description': 'Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial.'}, 'hours_to': {'type': 'integer', 'maximum': 168, 'minimum': 1, 'description': 'Window end, in hours from now, exclusive. 36 to 48 is hours 36-47.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'hours_from': {'type': 'integer', 'maximum': 168, 'minimum': 0, 'description': 'Window start, in hours from now (0 = the current hour).'}, 'detail_level': {'enum': ['standard', 'detailed'], 'type': 'string', 'default': 'standard', 'description': 'standard: compact hourly data (sampled past 24h). detailed: preserves CAPE, ceiling, UV, gust, thunderstorm probability for the first 48h.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'units', 'forecast'], 'properties': {'units': {'type': 'string'}, 'widget': {'type': 'object', 'required': ['spec', 'entries'], 'properties': {'spec': {'type': 'string', 'const': 'sw-ui-spec'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['component', 'props'], 'properties': {'props': {'type': 'object', 'additionalProperties': {}}, 'component': {'type': 'string'}}, 'additionalProperties': False}}}, 'description': 'sw-ui-spec widget block rendered by the MCP Apps weather widget (ui://weather-widget/v1/index.html). Additive; safe to ignore.', 'additionalProperties': False}, 'forecast': {'type': 'object', 'additionalProperties': {}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'data_status': {'type': 'object', 'description': 'Present only when the platform reports degraded/outage data sources: overall state, a caveat note, and the affected sources. Absent means no advisory was available -- not a freshness guarantee. See get_platform_status for the full document.', 'additionalProperties': {}}}, 'additionalProperties': False}
get_lightning_activity
Get lightning activity
Real-time lightning near a location: GLM satellite flash count (30km/10min) and MRMS ground-truth lightning density + 30-minute probability. The summary field is ready-to-use. A zero flash count means no lightning inside that window -- report it as a quiet observation scoped to the window in `scope`, never as a data gap. Only call when storms may be active or the user asks about lightning. Example: {"location": "Tampa"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'scope', 'lightning'], 'properties': {'scope': {'type': 'string', 'description': 'Area and time window searched, so a zero count is unambiguous to report.'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'lightning': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_map_snapshot
Get map snapshot
Render a weather map image for visual analysis. Simple form: pass `product` (a viz-catalog product_id like "mrms_qpe_01h_pass2_conus", "goes_truecolor_conus", "spc_day1_categorical", "hrrr_precip_hybrid_derived_conus" (future radar), "hrrr_subhourly_conus" (15-min Future Radar), "mrms_radar_nowcast_conus", "rtma_conus", "nbm_daily_temps", or "nexrad_l3:{SITE}:{PRODUCT}" for single-site radar, e.g. "nexrad_l3:TLX:N0B") plus a location and zoom (5=regional, 8=metro, 10=city). Composed form: pass `scene` -- a declarative scene document layering basemap + multiple weather products + active alerts + storm features + inline GeoJSON in one image (layers draw bottom-to-top, under basemap labels). Example scene: {"scene":"1.0","view":{"center":{"lat":43.8,"lon":-91.2},"zoom":8},"layers":[{"type":"weather","product":"goes_truecolor_conus"},{"type":"weather","product":"nexrad_l3:ARX:N0B"},{"type":"alerts","filter":{"events":["Tornado Warning"]},"onError":"skip"}]}. Alert filters (all optional, AND-combined): `ids` (specific alerts), `events`, `severities`, `minSeverity` (Extreme>Severe>Moderate>Minor>Unknown). Single-site radar keys: the address is `nexrad_l3:{SITE}:{KEY}` where KEY is `N{tilt}{measurement}` and tilt 0 is the 0.5 degree sweep -- N0B reflectivity (dBZ, where and how heavy), N0G base velocity (knots toward/away from the radar), N0S storm-relative velocity (storm motion removed, so a couplet is rotation rather than translation -- prefer it for rotation questions), N0C correlation coefficient (0-1, debris and hail), N0X differential reflectivity (dB). Legacy codes (N0V, N0R, N0Q) are accepted as aliases. Not every site produces every key; when a render reports which keys a site has, retry with one of those. Optional `time` (unix seconds): closest frame. Forecast (HRRR/nowcast/NBM) honors future times; analysis (MRMS/NEXRAD/RTMA/GOES) clamps to latest past. Pass `time` for future-radar asks — do not claim that capability is missing. Product ids must be real viz-catalog entries -- shorthand like "radar" or "reflectivity" is not one. Omit `product` for the default hybrid precip still. For Alaska and Hawaii prefer a local site or `mrms_precip_hybrid_derived_alaska` over CONUS mosaics, which do not cover them. Returns the rendered image plus per-layer resolved valid times.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'time': {'type': 'integer', 'description': 'Unix seconds; closest frame (default: latest). Forecasts honor future times.'}, 'zoom': {'type': 'number', 'default': 7, 'maximum': 14, 'minimum': 2, 'description': 'Map zoom (simple form)'}, 'scene': {'type': 'object', 'description': 'Full scene document (composed form). When set, product/location/zoom are ignored.', 'additionalProperties': {}}, 'width': {'type': 'integer', 'default': 720, 'maximum': 2000, 'minimum': 300}, 'height': {'type': 'integer', 'default': 440, 'maximum': 2000, 'minimum': 200}, 'opacity': {'type': 'number', 'maximum': 1, 'minimum': 0, 'description': 'Weather layer opacity'}, 'product': {'type': 'string', 'description': 'viz-catalog product_id or nexrad_l3:{SITE}:{KEY} (simple form)'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
get_observations
Get station observations
METAR surface observations from weather stations: temperature, wind, visibility, ceiling, flight category, raw METAR. Nearest mode (default) returns the closest N stations to a location; station mode returns history for a specific ICAO identifier. Examples: {"location": "Denver", "n": 3} or {"station": "KJFK", "hours": 6}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'n': {'type': 'integer', 'default': 1, 'maximum': 10, 'minimum': 1, 'description': 'Number of nearest stations (1-10). Default 1. Ignored in station mode.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'hours': {'type': 'integer', 'maximum': 24, 'minimum': 1, 'description': 'Hours of history in station mode (1-24).'}, 'station': {'type': 'string', 'maxLength': 4, 'minLength': 3, 'description': 'ICAO station identifier (e.g. KJFK). Switches to station-history mode.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['observations'], 'properties': {'station': {'type': 'string'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'observations': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_outlooks
Get hazard outlooks
Hazard outlooks affecting a location. hazard=severe returns SPC convective outlooks (Day 1-8 categorical risk + tornado/wind/hail probabilities); hazard=fire returns SPC fire weather outlooks; hazard=rain returns WPC Excessive Rainfall Outlook polygons (days 1-3); hazard=heat returns the NWS HeatRisk index at the point (0 none .. 4 extreme, days 1-3). include_narrative=true adds the forecaster discussion for severe (SWO), fire (FWD), or rain (QPF/QPFERD; one PIL for all days). An empty result means no outlook covers the point -- not a failure. Examples: {"location": "Moore, OK", "hazard": "severe", "include_narrative": true} or {"location": "Phoenix", "hazard": "heat"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'day': {'type': 'integer', 'default': 1, 'maximum': 8, 'minimum': 1, 'description': 'Outlook day for the narrative filter (1-8). Default 1.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'hazard': {'enum': ['severe', 'fire', 'rain', 'heat'], 'type': 'string', 'default': 'severe', 'description': 'Hazard family: severe = SPC convective, fire = SPC fire weather, rain = WPC excessive rainfall, heat = NWS HeatRisk index. (Winter/WSSI is a planned expansion.)'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'include_narrative': {'type': 'boolean', 'default': False, 'description': 'Include the forecaster narrative for the requested day (severe, fire, and rain).'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'hazard', 'day', 'outlooks'], 'properties': {'day': {'type': 'number'}, 'hazard': {'type': 'string'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'outlooks': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'heat_risk': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'narrative': {'anyOf': [{'type': 'object', 'additionalProperties': {}}, {'type': 'null'}]}}, 'additionalProperties': False}
get_path_exposure
Get path exposure
Civic POIs (schools, hospitals, airports, …) inside a caller-supplied GeoJSON Polygon or MultiPolygon. Clip first — do not pass a CONUS HeatRisk dissolve. For an NWS alert use get_alerts({alert_id}) (already includes pois). Optional classes filters the civic allowlist. Example: {"geometry":{"type":"Polygon","coordinates":[[[-88.15,41.77],[-88.14,41.77],[-88.14,41.78],[-88.15,41.78],[-88.15,41.77]]]},"classes":["school"]}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['geometry'], 'properties': {'classes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Optional civic classes: airport, station, hospital, school, university, library, museum, stadium, cemetery, place_of_worship, camp_site, golf, attraction.'}, 'geometry': {'type': 'object', 'required': ['type', 'coordinates'], 'properties': {'type': {'enum': ['Polygon', 'MultiPolygon'], 'type': 'string'}, 'coordinates': {'type': 'array'}}, 'description': 'GeoJSON Polygon or MultiPolygon. Clip national outlooks first.', 'additionalProperties': False}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['counts', 'features'], 'properties': {'counts': {'type': 'object', 'additionalProperties': {'type': 'number'}}, 'features': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'class'], 'properties': {'id': {'type': 'string'}, 'name': {'type': 'string'}, 'class': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
get_period_totals
Get period totals
Aggregate a weather variable over one or more time periods. Returns server-computed totals, maxima, minima, or averages per period. Period start/end times should use the user's local timezone boundaries (not UTC midnight). Response includes the converted value and unit per period. Ideal for questions like "total rainfall today and tomorrow" or "peak wind speed this weekend". Accepts a place name directly. Example: {"location": "Portland, OR", "variable": "precipitation", "aggregation": "sum", "periods": [{"start": "2026-07-08T07:00:00Z", "end": "2026-07-09T07:00:00Z", "label": "Today"}]}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['variable', 'periods'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'units': {'enum': ['imperial', 'metric', 'si'], 'type': 'string', 'default': 'imperial', 'description': 'Unit system for all values in the request and response: imperial (°F, mph, inches), metric (°C, km/h, mm), or si (K, m/s, mm). Defaults to imperial.'}, 'periods': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end'], 'properties': {'end': {'type': 'string', 'description': 'ISO 8601 end time'}, 'label': {'type': 'string', 'description': 'Human label, e.g. "Today", "Tomorrow"'}, 'start': {'type': 'string', 'description': 'ISO 8601 start time'}}, 'additionalProperties': False}, 'maxItems': 14, 'minItems': 1, 'description': 'Time periods to aggregate over (1-14).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'variable': {'type': 'string', 'description': 'Standard variable name (e.g. precipitation, snowfall, temperature_2m, wind_speed_10m, cape).'}, 'dataset_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Dataset override. Default: auto-resolved NBM for the location.'}, 'aggregation': {'enum': ['sum', 'max', 'min', 'avg'], 'type': 'string', 'default': 'sum', 'description': 'Aggregation function. Default sum. Use sum for precipitation/snowfall, max for temperature/wind, min for low temperatures, avg for humidity/cloud cover.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'variable', 'aggregation', 'periods'], 'properties': {'message': {'type': 'string'}, 'periods': {'type': 'array', 'items': {'type': 'object', 'required': ['start', 'end', 'value', 'unit', 'hours_included'], 'properties': {'end': {'type': 'string'}, 'unit': {'type': 'string'}, 'label': {'type': 'string'}, 'start': {'type': 'string'}, 'value': {'type': 'number'}, 'hours_included': {'type': 'number'}}, 'additionalProperties': False}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'variable': {'type': 'string'}, 'aggregation': {'type': 'string'}}, 'additionalProperties': False}
get_platform_status
Get platform status
Current data-freshness status of the weather platform: overall state, per-source states (ok / degraded / outage / no_signal), open incidents with cause attribution (provider outage vs internal processing delay), and active provider advisories. Use this when a user asks whether data is current, when other tools return surprisingly stale data, or before presenting time-critical weather. If a source is degraded or in outage, tell the user their data may be stale rather than presenting it as live. No inputs. Refreshed about every 5 minutes.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'include_ok': {'type': 'boolean', 'default': False, 'description': 'true: list every monitored source including healthy ones. false (default): only sources that are not ok, keeping the response compact.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['overall'], 'properties': {'note': {'type': 'string'}, 'overall': {'enum': ['ok', 'degraded', 'outage', 'no_signal', 'unknown'], 'type': 'string', 'description': 'Worst state across customer-facing data sources; "unknown" when status is unavailable.'}, 'sources': {'type': 'array', 'items': {'type': 'object', 'required': ['source_id', 'state'], 'properties': {'name': {'type': 'string'}, 'state': {'enum': ['ok', 'degraded', 'outage', 'no_signal'], 'type': 'string'}, 'warming': {'type': 'boolean', 'description': 'true when no_signal only means monitoring is still warming up (not an outage).'}, 'incident': {'type': 'object', 'properties': {'cause': {'type': 'string'}, 'since': {'type': ['string', 'number']}, 'status': {'type': 'string'}}, 'additionalProperties': True}, 'severity': {'type': 'string'}, 'source_id': {'type': 'string'}, 'provider_id': {'type': 'string'}}, 'additionalProperties': True}}, 'advisories': {'type': 'array', 'items': {'type': 'object', 'properties': {'url': {'type': 'string'}, 'title': {'type': 'string'}, 'provider_id': {'type': 'string'}, 'published_at': {'type': 'string'}}, 'additionalProperties': True}}, 'generated_at': {'type': 'string', 'description': 'When the status document was generated (UTC).'}}, 'additionalProperties': False}
get_population_exposure
Get population exposure
National population-exposure headline for a risk-zone outlook product: how many people are inside risk bands at or above min_level. Powers headlines like "~57M people under major heat risk tomorrow". hazard=heat covers NWS HeatRisk days 1-3 (levels: 1 minor, 2 moderate, 3 major, 4 extreme). Pass product_id directly for other risk-zone products. Example: {"hazard": "heat", "min_level": 3}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'hazard': {'enum': ['heat'], 'type': 'string', 'description': 'Hazard family (expands the day-1..3 product set). Currently: heat (HeatRisk).'}, 'min_level': {'type': 'integer', 'default': 1, 'maximum': 5, 'minimum': 1, 'description': 'Minimum risk level to count (>=). Default 1 (any elevated risk).'}, 'product_id': {'type': 'string', 'description': 'Explicit risk-zone product ID (overrides hazard), e.g. heatrisk_day1_conus.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['min_level', 'summaries'], 'properties': {'min_level': {'type': 'number'}, 'summaries': {'type': 'array', 'items': {'type': 'object', 'required': ['product_id'], 'properties': {'error': {'type': 'string'}, 'population': {'type': 'number'}, 'product_id': {'type': 'string'}, 'valid_time': {'type': 'string'}, 'feature_count': {'type': 'number'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
get_sounding
Get radiosonde sounding
Nearest RAOB (radiosonde) vertical soundings to a point. Each sounding carries: profile (pressure-indexed thermodynamics: pressure_hpa, height_m, temperature_c, dewpoint_c, wind arrays), wind_profile (height-indexed winds for hodographs/shear), and derived indices (sbcape/mucape/mlcape + cin, lifted_index, k_index, total_totals, pwat_mm, freezing_level_m, lcl/lfc/el, bulk_shear_0_6km_kt). Soundings launch at 00Z/12Z so data can be hours old. Example: {"location": "Norman, OK"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'n': {'type': 'integer', 'default': 1, 'maximum': 5, 'minimum': 1, 'description': 'Number of nearest soundings (1-5). Default 1.'}, 'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'soundings'], 'properties': {'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'soundings': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_sounding_chart
Get sounding chart
Render the nearest RAOB (radiosonde) sounding as a Skew-T log-P + hodograph chart image for visual analysis: temperature/dewpoint traces, wind barbs, height-banded hodograph, and a derived-indices table (CAPE/CIN, lifted index, PWAT, shear, LCL). Soundings launch at 00Z/12Z so data can be hours old. Use get_sounding for the raw profile numbers. Example: {"location": "Norman, OK"}.
Lecture seule Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'unit': {'enum': ['fahrenheit', 'celsius'], 'type': 'string', 'default': 'fahrenheit', 'description': 'Temperature axis display unit'}, 'scale': {'type': 'number', 'default': 2, 'maximum': 3, 'minimum': 1, 'description': 'Raster scale factor (2 = retina; higher = larger image payload)'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
get_storm_cells
Get storm cells
Radar-identified storm cells near a location, merging NEXRAD Level III algorithm output from the nearest radar site: storm tracks (cell position, movement, forecast positions), hail index (probability of hail/severe hail + max expected size), mesocyclone detections (rotation), and TVS (tornado vortex signatures). Use during active convection to see what the radar algorithms flag. An empty result means no detected cells -- common outside active storms. Example: {"location": "Norman, OK"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'include': {'type': 'array', 'items': {'enum': ['tracks', 'hail_index', 'mesocyclone', 'tvs'], 'type': 'string'}, 'default': ['tracks', 'hail_index', 'mesocyclone', 'tvs'], 'description': 'Which detection families to include. Default: all.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'summary', 'detections'], 'properties': {'tracks': {'type': 'object', 'additionalProperties': {}}, 'summary': {'type': 'string', 'description': 'Ready-to-use one-liner. States explicitly when nothing was detected.'}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'detections': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_storm_reports
Get storm reports
Recent NWS Local Storm Reports (LSRs) -- verified reports of tornadoes, hail, damaging winds, flooding near a location. Use to confirm severe weather occurrence or assess reported damage. valid_time is event occurrence (UTC); cite in local time. Example: {"location": "Wichita", "hours": 12, "type": "H"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'type': {'type': 'string', 'description': 'Report type filter: T=tornado, H=hail, W=wind, F=flood, D=damage, S=snow.'}, 'hours': {'type': 'integer', 'default': 6, 'maximum': 24, 'minimum': 1, 'description': 'Lookback window in hours (1-24). Default 6.'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'hours', 'reports'], 'properties': {'hours': {'type': 'number'}, 'reports': {'type': 'object', 'additionalProperties': {}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}}, 'additionalProperties': False}
get_time_context
Get time context
Complete temporal context for a location: local time, timezone, 14-day calendar with day names and Today/Tomorrow offsets, sunrise/sunset/solar times (from the weather pipeline's astro product), and moon phase. Use whenever you need to reason about dates, times, or daylight for a location -- including "what time is sunset?", "is it dark there now?", or "what day of the week is the 4th-day forecast?". Accepts a place name directly. Example: {"location": "Seattle"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'current_time', 'daylight', 'moon', 'calendar'], 'properties': {'moon': {'type': 'object', 'additionalProperties': {}}, 'calendar': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'daylight': {'type': 'object', 'additionalProperties': {}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'current_time': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
get_tropical
Get tropical activity
Active NHC (National Hurricane Center) tropical systems: forecast cones, track lines, forecast points, coastal watches/warnings, and 7-day Tropical Weather Outlook formation areas -- Atlantic + East Pacific. Each feature carries a kind (cone | track | points | watch_warning | outlook_area) plus storm name, intensity, and timing properties. include_geometry=true adds full GeoJSON geometries (large). An empty result means no active tropical activity. Aircraft reconnaissance fixes and flight-level observations are in `get_tropical_observations`. Example: {} or {"include_geometry": true}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'include_geometry': {'type': 'boolean', 'default': False, 'description': 'Include full GeoJSON geometries (cone/track polygons). Default false.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['active', 'feature_count', 'features'], 'properties': {'active': {'type': 'boolean'}, 'features': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'feature_count': {'type': 'number'}}, 'additionalProperties': False}
get_tropical_observations
Get tropical observations
Hurricane Hunter aircraft reconnaissance for active tropical systems: vortex data message (VDM) center fixes — pressure, max flight-level wind, eye — and high-density (HDOB) flight-level observations. These are aircraft measurements, not surface weather stations (use `get_observations` for METAR). Use `get_tropical` for NHC cones, tracks, and watches; this tool is what the aircraft measured. kind=hdob returns the newest 200 records (about 1–2 h of flight; `truncated` says when more exist). Empty when no aircraft has flown in the window.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'kind': {'enum': ['vdm', 'hdob', 'all'], 'type': 'string', 'default': 'vdm', 'description': 'vdm = vortex fixes; hdob = flight-level obs; all = both. Default vdm.'}, 'hours': {'type': 'integer', 'default': 24, 'maximum': 72, 'minimum': 1, 'description': 'Lookback window in hours (1-72). Default 24.'}, 'storm': {'type': 'string', 'maxLength': 32, 'description': 'ATCF id (al14) or storm name (polo). Unnumbered USAF missions never match.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['active', 'storms', 'feature_count', 'truncated', 'features'], 'properties': {'active': {'type': 'boolean'}, 'storms': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'features': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': {}}}, 'truncated': {'type': 'boolean'}, 'feature_count': {'type': 'number'}}, 'additionalProperties': False}
list_datasets
List datasets
Discover the datasets (model grids, analyses, observations) available at a location, with per-dataset freshness (data age, latest model run). Datasets vary by domain (CONUS/Alaska/Hawaii). Use this to find dataset_id values for query_dataset and describe_dataset, or to assess whether data is current before making decisions. Example: {"location": "Anchorage"}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'include_freshness': {'type': 'boolean', 'default': True, 'description': 'Include per-dataset data age and run times. Default true.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'datasets'], 'properties': {'datasets': {'type': 'object', 'additionalProperties': {}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}, 'freshness': {'type': 'object', 'additionalProperties': {}}}, 'additionalProperties': False}
query_dataset
Query dataset
Raw time series from a specific dataset for specific variables at a point. Power-user access to any gridded product (NBM, HRRR, RRFS, GFS, RTMA, MRMS, air quality, ...). Time modes: hours (next N hours, default 24), time_start+time_end (explicit ISO-8601 window), or latest=true (single most-recent value). reference_time pins a specific model run, and each returned series reports the run that served it (reference_time, or reference_times when a series mixes runs) — check it before comparing two runs, since a run older than about 48 hours may no longer be available. For blended forecasts use get_forecast instead. Examples: {"location": "Denver", "dataset_id": "rrfs_surface", "variables": ["temperature_2m"], "hours": 18} or {"lat": 41.4, "lon": -92.9, "dataset_id": "rtma_conus", "variables": ["temperature_2m"], "latest": true}.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['variables'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}, 'hours': {'type': 'integer', 'maximum': 264, 'minimum': 1, 'description': 'Forecast/lookahead hours from now (1-264). Default 24 when no other time mode set.'}, 'latest': {'type': 'boolean', 'default': False, 'description': 'Return only the most recent value (analysis datasets like RTMA/MRMS).'}, 'location': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Free-text place: city ("Denver"), city+state ("Portland, OR"), US ZIP ("50219"), or "lat,lon" ("39.74,-104.99"). Provide either this OR explicit lat+lon, not both.'}, 'time_end': {'type': 'string', 'description': 'ISO 8601 window end (with time_start).'}, 'variables': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 20, 'minItems': 1, 'description': 'Standard variable names (e.g. temperature_2m, precipitation). Discover with describe_dataset.'}, 'dataset_id': {'type': 'string', 'maxLength': 80, 'minLength': 1, 'description': 'Dataset to query. Default: the NBM dataset for the location domain (nbm_conus/nbm_alaska/nbm_hawaii). Discover options with list_datasets.'}, 'time_start': {'type': 'string', 'description': 'ISO 8601 window start (with time_end).'}, 'reference_time': {'type': 'string', 'description': 'Pin a specific model run (ISO 8601). Default: latest run.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['location', 'series'], 'properties': {'series': {'type': 'array', 'items': {'type': 'object', 'required': ['dataset_id', 'valid_times', 'data'], 'properties': {'data': {'type': 'object', 'additionalProperties': {'type': 'array', 'items': {'type': ['number', 'null']}}}, 'dataset_id': {'type': 'string'}, 'valid_times': {'type': 'array', 'items': {'type': 'string'}}, 'reference_time': {'type': 'string', 'description': 'Model run behind every value in this series.'}, 'reference_times': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Distinct runs, when this series mixes more than one.'}}, 'additionalProperties': False}}, 'location': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'name': {'type': 'string'}}, 'additionalProperties': False}}, 'additionalProperties': False}
reverse_geocode
Reverse geocode
Resolve coordinates to a human-readable place (city, state, county, timezone). Use when you have lat/lon but need a display name or the local timezone. Example: {"lat": 39.74, "lon": -104.99} -> Denver, Colorado, America/Denver.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Latitude in decimal degrees (-90 to 90). Most tools also accept a `location` place-name string instead of lat/lon.'}, 'lon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian).'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['lat', 'lon', 'place'], 'properties': {'lat': {'type': 'number'}, 'lon': {'type': 'number'}, 'place': {'type': 'object', 'properties': {'city': {'type': 'string'}, 'state': {'type': 'string'}, 'county': {'type': 'string'}, 'timezone': {'type': 'string'}, 'nearest_city': {'type': 'string'}}, 'additionalProperties': True}}, 'additionalProperties': False}
search_locations
Search locations
Resolve a place query to candidate locations with coordinates. Accepts city names ("Denver"), city+state ("Portland, OR" via query), ZIP codes ("50219"), or partial input with fuzzy=true for autosuggest-style matching ("bost" -> Boston). Returns ranked candidates with lat/lon. Most weather tools accept a `location` string directly and geocode internally -- use this tool only to disambiguate ("which Springfield?") or to present location choices to the user. Example: {"query": "Springfield"} returns all major Springfields ranked by place importance.
Lecture seule Accès externe Idempotent
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'fuzzy': {'type': 'boolean', 'default': False, 'description': 'Autosuggest mode for partial/misspelled input. Default false (exact search).'}, 'limit': {'type': 'integer', 'default': 5, 'maximum': 10, 'minimum': 1, 'description': 'Maximum candidates to return (1-10). Default 5.'}, 'query': {'type': 'string', 'maxLength': 200, 'minLength': 1, 'description': 'Place query: city, "city, state", ZIP, or partial text with fuzzy=true.'}}, 'additionalProperties': False}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query', 'candidates'], 'properties': {'query': {'type': 'string'}, 'candidates': {'type': 'array', 'items': {'type': 'object', 'properties': {'lat': {'type': ['number', 'null']}, 'lon': {'type': ['number', 'null']}, 'zip': {'type': 'string'}, 'name': {'type': 'string'}, 'type': {'type': 'string'}, 'state': {'type': 'string'}, 'place_id': {'type': 'string'}, 'timezone': {'type': 'string'}}, 'additionalProperties': True}}}, 'additionalProperties': False}
Ajouté
get_tropical_observations
27 September 2026 02:49
Modifié
get_tropical
27 September 2026 02:49
Modifié
find_best_window
23 September 2026 02:49
Ajouté
get_path_exposure
21 September 2026 02:56
Ajouté
get_platform_status
17 September 2026 12:52
Ajouté
get_sounding_chart
17 September 2026 12:52
Ajouté
get_map_snapshot
17 September 2026 12:52
Ajouté
get_air_quality
17 September 2026 12:52
Ajouté
get_storm_cells
17 September 2026 12:52
Ajouté
get_climate_records
17 September 2026 12:52
Ajouté
get_population_exposure
17 September 2026 12:52
Ajouté
get_tropical
17 September 2026 12:52
Ajouté
get_forecast_skill_map
17 September 2026 12:52
Ajouté
get_forecast_skill
17 September 2026 12:52
Ajouté
get_climate_normals
17 September 2026 12:52
Ajouté
get_growing_degree_days
17 September 2026 12:52
Ajouté
query_dataset
17 September 2026 12:52
Ajouté
describe_dataset
17 September 2026 12:52
Ajouté
list_datasets
17 September 2026 12:52
Ajouté
get_observations
17 September 2026 12:52
Ajouté
get_current_conditions
17 September 2026 12:52
Ajouté
get_forecast_distribution
17 September 2026 12:52
Ajouté
get_sounding
17 September 2026 12:52
Ajouté
get_lightning_activity
17 September 2026 12:52
Ajouté
get_storm_reports
17 September 2026 12:52
Ajouté
get_forecast_discussion
17 September 2026 12:52
Ajouté
get_outlooks
17 September 2026 12:52
Ajouté
find_best_window
17 September 2026 12:52
Ajouté
compare_locations
17 September 2026 12:52
Ajouté
get_period_totals
17 September 2026 12:52

UK Environmental Intelligence MCP Server from MCPBundles

com.mcpbundles/uk-environmental-intelligence

Provides UK environmental intelligence covering flood warnings, river and groundwater readings, bathing water quality, ecology ob…

Meteoswiss

io.github.pipeworx-io/meteoswiss

Discovers and searches Swiss weather stations and federal geospatial datasets from MeteoSwiss and swisstopo, with links to data a…

Global Forest Watch

io.github.pipeworx-io/global-forest-watch

Browses and queries Global Forest Watch datasets covering forest loss and gain, alerts, fires, carbon, protected areas and relate…

Global Fishing Watch

io.github.pipeworx-io/global-fishing-watch

Searches Global Fishing Watch vessel identities and AIS-derived events, and aggregates apparent fishing effort by location, date,…

DeepMap AI -- Earth Grounding

com.deepmapai/earth-grounding

Provides evidence-backed, location-specific information on water availability, ground stability, seismic and space-weather hazard…

Atlas Data Exchange

com.atlasipholdingsllc.app/atlas-data-exchange

Discovers, samples, evaluates, purchases, and monitors spatial datasets covering infrastructure, hazards, logistics, commodities,…

MAD Synapse · World

art.maddegen.agent/synapse-world

Provides geocoding, weather, exchange rates, holidays, time-zone conversion, astronomical data, country facts, and earthquake inf…

DeepPVMapper

io.github.gabrielkasmi/deeppvmapper

Queries and aggregates a French registry of rooftop solar detections, including locations, estimated capacity, imagery validation…