BaroclineBarocline

interactive_map_app

Weather & Hazard Map

Render an INTERACTIVE map (MCP App iframe): severe-weather contours, hurricane tracks, or custom GeoJSON, with pan/zoom, hover popups, legends, POI search, and time sliders.

**Routing:** if the MCP client supports MCP Apps (e.g. Claude Desktop / claude.ai), this is the PREFERRED tool for any map request ('show me a hail map', 'map this storm', 'plot these locations'). If the client cannot render MCP apps, use the static image tools on aa-s3 instead: generate_severe_weather_quicklook, generate_hurricane_quicklook, or generate_geojson_quicklook.

Pick one mode via `map_peril`:

**Severe weather** — `map_peril` in {HAIL, WIND_GUST, TORNADIC_STORM, RAINFALL, SNOWFALL, FREEZING_RAIN}. REQUIRES `date` (MM/DD/YYYY or YYYY-MM-DD). Optional `state` (two-letter) filters to one state; omit for CONUS.

On-demand severe-weather layers — SPC ground-truth storm reports (`spc_reports`) and NWS post-storm tornado damage surveys (`tor_survey`) — are OFF by default. Enable one ONLY when the user explicitly asks for that layer by name (e.g. 'show the NWS tornado surveys', 'add SPC reports'). A plain contour/map request — including 'show tornado contours' or 'map the tornadoes' — must NOT enable them; leave `tor_survey` and `spc_reports` off. When the user does ask, turn it on AT OPEN via `display_defaults` — e.g. display_defaults={"tor_survey": true} or {"spc_reports": true}. Do NOT open the map and then call set_map_display to enable it; that is a redundant round-trip.

To render pre-existing contours with this peril's native styling instead of re-fetching CONUS from Dexter, also pass `geojson_url` (Athenium S3 only) — e.g. the `clipped_geojson_url` returned by severe_weather_multiday_intensity for a single-day clip; `date` still labels the layer.

**Hurricane** — `map_peril=HURRICANE`. REQUIRES `storm_id` (ATCFID, e.g. 'AL092025'). Optional `initial_time` (YYYYMMDDHH, default 'latest') pins a specific forecast run; `forecast_type` is 'track' (default), 'wind' (adds wind swath), or 'precip'. Optional `ensemble` picks forecast tracks: 'official'=Athenium Official (default), 'ai_enhanced'=AI Enhanced, 'model_means'=per-system model means; comma-separate to combine (e.g. 'official,ai_enhanced,model_means'; legacy numeric codes 888/999/777 also accepted). The map always includes the storm's observed history trail and a current-position marker, plus a Saffir-Simpson intensity colorbar. Wind/precip swaths exist for official/ai_enhanced only, and both appear in the display manifest so they can be toggled onto an already-open map (user layer menu or set_map_display) without re-opening.

**Custom GeoJSON** — `map_peril=CUSTOM`. Pass geometry via `geojson_inline` (a GeoJSON FeatureCollection passed in-band — the default for Claude/user-authored geometry, ≤500 KB) OR `geojson_url` (URLs previously returned by this server's data tools only; other hosts are rejected). Optional `geojson_label` for the legend. Layer type is auto-detected from feature geometry, or set `layer_type='station_model'` for point observations to render meteorological station plots (wind barb + temp/dewpoint/pressure; expects station_historical_data field names like windSpeedKts, windDirectionDegrees, surfaceTemperatureFahrenheit — short aliases tempF/dewpointF/windDirDeg/windMph/gustMph/cloudPct also work).

**Data-driven coloring** (CUSTOM/station_model): `value_field` names a feature property to color by — numeric values get a continuous ramp; string/categorical values (e.g. 'LOW'/'HIGH') are auto-colored as categories sampled from the same ramp. `ramp` picks a registry ramp (cividis [default], viridis, turbo, RdYlBu, RdYlBu_r [blue→red, temperature convention], nws_reflectivity, flight_category); optional `domain` is [min, max] to fix a numeric scale range. A populated color legend is returned in the summary.

All modes accept optional `title`, `center_lat`, `center_lon`, `zoom`. Aliases accepted: tornado→TORNADIC_STORM, wind→WIND_GUST, rain→RAINFALL, snow→SNOWFALL, ice→FREEZING_RAIN, tc/tropical_cyclone→HURRICANE.

**Display manifest:** the result's `display.layers[]` lists every layer this map can show. `active:true` = currently on the map; `available:true` = a legal move you (or the user, via the map's layer menu) can toggle on; `available:false` entries carry an `unavailable_reason`. `user_touched:true` means the user set that layer manually — do not change those unless the user asks. To change what an OPEN map displays without re-opening it, call `set_map_display` with the returned `display.session` id; re-run this tool only for a different date/peril/storm. To SEED the display at open, pass `display_defaults` ({layer_id: bool}) — e.g. {"ui_title": false, "ui_search": false, "ui_time_slider": false} for a maximally clean map window, or {"hurricane_swath_wind": true} to open with an on-demand layer already active. Interface chrome ids: ui_search, ui_title, ui_time_slider. `time_defaults` seeds the time slider (bin/mode/show_all/playing/speed_ms) — e.g. {"playing": true, "mode": "cumulative", "speed_ms": 300} opens straight into an animation. Post-open, set_map_display also accepts `camera` ({bbox} or {center, zoom}) and `time` directives — combine them for zoomed animations.
https://mcp.barocline.com/mcp
https://mcpkey.barocline.com/weather-risk/mcp
https://mcpoauth.barocline.com/mcp
Idempotent

Parameters

NameTypeRequiredDefault
map_perilstringYes-
datestringNo""
statestringNo""
storm_idstringNo""
initial_timestringNo"latest"
forecast_typestringNo"track"
ensemblestringNo"official"
geojson_urlstringNo""
geojson_labelstringNo""
geojson_inlineobject | nullNonull
layer_typestringNo"auto"
value_fieldstringNo""
rampstringNo""
domainarray | nullNonull
titlestringNo""
center_latnumber | nullNonull
center_lonnumber | nullNonull
zoominteger | nullNonull
display_defaultsobject | nullNonull
time_defaultsobject | nullNonull

Sample input

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "interactive_map_app",
    "arguments": {
      "map_peril": "value",
      "date": "",
      "state": "",
      "storm_id": "",
      "initial_time": "latest",
      "forecast_type": "track",
      "ensemble": "official",
      "geojson_url": "",
      "geojson_label": "",
      "layer_type": "auto",
      "value_field": "",
      "ramp": "",
      "title": ""
    }
  }
}
{
  "name": "interactive_map_app",
  "arguments": {
    "map_peril": "value",
    "date": "",
    "state": "",
    "storm_id": "",
    "initial_time": "latest",
    "forecast_type": "track",
    "ensemble": "official",
    "geojson_url": "",
    "geojson_label": "",
    "layer_type": "auto",
    "value_field": "",
    "ramp": "",
    "title": ""
  }
}