{
  "$comment": "Canonical MCP tool descriptors for mcp.smarterweather.com/mcp. Generated by services/sw-mcp/scripts/dump-tool-descriptors.ts in the private repo -- do not edit by hand.",
  "server": "io.github.smarterweather/weather",
  "endpoint": "https://mcp.smarterweather.com/mcp",
  "toolCount": 28,
  "tools": [
    {
      "name": "compare_locations",
      "title": "Compare locations",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "locations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "location": {
                  "type": "string",
                  "description": "Place name, ZIP, or \"lat,lon\" (e.g. \"Denver\", \"Boulder, CO\")."
                },
                "lat": {
                  "type": "number",
                  "minimum": -90,
                  "maximum": 90
                },
                "lon": {
                  "type": "number",
                  "minimum": -180,
                  "maximum": 180
                },
                "label": {
                  "type": "string",
                  "description": "Optional display label (e.g. \"Denver warehouse\")."
                }
              },
              "additionalProperties": false
            },
            "minItems": 2,
            "maxItems": 10,
            "description": "Locations to compare (2-10). Each takes location OR lat/lon, optional label."
          },
          "variables": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 10,
            "description": "Standard variable names (e.g. temperature_2m, precipitation)."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 168,
            "default": 24,
            "description": "Forecast hours. Default 24."
          },
          "dataset_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Dataset override. Default: auto-resolved NBM per location."
          }
        },
        "required": [
          "locations",
          "variables"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "variables": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "hours": {
            "type": "number"
          },
          "comparisons": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "location": {
                  "type": "object",
                  "properties": {
                    "lat": {
                      "type": "number"
                    },
                    "lon": {
                      "type": "number"
                    },
                    "name": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "lat",
                    "lon"
                  ],
                  "additionalProperties": false
                },
                "valid_times": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "data": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "required": [
                "location"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "variables",
          "hours",
          "comparisons"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Compare locations",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "describe_dataset",
      "title": "Describe dataset",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "dataset_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Pipeline dataset identifier (e.g. \"nbm_conus\", \"mrms_reflectivity_conus\"). Discover valid values with list_datasets; inspect variables with describe_dataset."
          }
        },
        "required": [
          "dataset_id"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "dataset_id": {
            "type": "string"
          },
          "detail": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "dataset_id",
          "detail"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Describe dataset",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "find_best_window",
      "title": "Find best weather window",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "units": {
            "type": "string",
            "enum": [
              "imperial",
              "metric",
              "si"
            ],
            "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."
          },
          "criteria": {
            "type": "object",
            "properties": {
              "max_precipitation_probability": {
                "type": "number",
                "minimum": 0,
                "maximum": 100,
                "description": "Maximum acceptable precipitation probability (0-100%)."
              },
              "min_temperature": {
                "type": "number",
                "description": "Minimum temperature in the selected units (°F / °C / K)."
              },
              "max_temperature": {
                "type": "number",
                "description": "Maximum temperature in the selected units (°F / °C / K)."
              },
              "max_wind_speed": {
                "type": "number",
                "description": "Maximum sustained wind in the selected units (mph / km/h / m/s)."
              },
              "max_wind_gust": {
                "type": "number",
                "description": "Maximum wind gust in the selected units (mph / km/h / m/s)."
              },
              "min_visibility": {
                "type": "number",
                "description": "Minimum visibility in the selected units (miles / km / m)."
              },
              "min_ceiling": {
                "type": "number",
                "description": "Minimum cloud ceiling in the selected units (feet / m / m)."
              }
            },
            "additionalProperties": false,
            "description": "Weather criteria defining acceptable conditions (all optional)."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 168,
            "default": 72,
            "description": "Hours to search. Default 72."
          },
          "activity_duration_hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 2,
            "description": "Minimum consecutive hours meeting criteria. Default 2."
          },
          "daylight_only": {
            "type": "boolean",
            "default": true,
            "description": "Only consider daylight hours (sunrise to sunset). Default true."
          }
        },
        "required": [
          "criteria"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "units": {
            "type": "string"
          },
          "windows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "start": {
                  "type": "string"
                },
                "end": {
                  "type": "string"
                },
                "hours": {
                  "type": "number"
                }
              },
              "required": [
                "start",
                "end",
                "hours"
              ],
              "additionalProperties": false
            }
          },
          "criteria_applied": {
            "type": "object",
            "additionalProperties": {}
          },
          "daylight_only": {
            "type": "boolean"
          },
          "activity_duration_hours": {
            "type": "number"
          },
          "sun_times": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "sunrise": {
                  "type": "string"
                },
                "sunset": {
                  "type": "string"
                }
              },
              "required": [
                "sunrise",
                "sunset"
              ],
              "additionalProperties": false
            }
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "location",
          "units",
          "windows",
          "criteria_applied",
          "daylight_only",
          "activity_duration_hours"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Find best weather window",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_air_quality",
      "title": "Get air quality",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "pollutants": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "aqi",
                "pm25",
                "ozone",
                "pm10"
              ]
            },
            "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,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "current": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "dataset_id": {
                  "type": "string"
                },
                "valid_times": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "data": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "required": [
                "dataset_id",
                "valid_times",
                "data"
              ],
              "additionalProperties": false
            }
          },
          "forecast": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "dataset_id": {
                  "type": "string"
                },
                "valid_times": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "data": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "required": [
                "dataset_id",
                "valid_times",
                "data"
              ],
              "additionalProperties": false
            }
          },
          "widget": {
            "type": "object",
            "properties": {
              "spec": {
                "type": "string",
                "const": "sw-ui-spec"
              },
              "entries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "component": {
                      "type": "string"
                    },
                    "props": {
                      "type": "object",
                      "additionalProperties": {}
                    }
                  },
                  "required": [
                    "component",
                    "props"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "spec",
              "entries"
            ],
            "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."
          }
        },
        "required": [
          "location",
          "current"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get air quality",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://weather-widget/v1/index.html"
        },
        "ui/resourceUri": "ui://weather-widget/v1/index.html"
      }
    },
    {
      "name": "get_alerts",
      "title": "Get NWS alerts",
      "description": "Active NWS watches, warnings, and advisories. Location mode returns all alerts in effect at a point (severity, urgency, certainty, timing, headline, description, instructions); an empty result means no active alerts -- not a failure. alert_id mode returns full detail (including geometry) for one alert previously returned by this tool. Examples: {\"location\": \"Miami\"} or {\"alert_id\": \"urn:oid:2.49.0.1.840...\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "alert_id": {
            "type": "string",
            "description": "Alert identifier for detail mode. When set, location is ignored."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "alert_id": {
            "type": "string"
          },
          "alerts": {},
          "alert": {
            "type": "object",
            "additionalProperties": {}
          },
          "widget": {
            "type": "object",
            "properties": {
              "spec": {
                "type": "string",
                "const": "sw-ui-spec"
              },
              "entries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "component": {
                      "type": "string"
                    },
                    "props": {
                      "type": "object",
                      "additionalProperties": {}
                    }
                  },
                  "required": [
                    "component",
                    "props"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "spec",
              "entries"
            ],
            "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,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get NWS alerts",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://weather-widget/v1/index.html"
        },
        "ui/resourceUri": "ui://weather-widget/v1/index.html"
      }
    },
    {
      "name": "get_climate_records",
      "title": "Get climate reports and records",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "reports",
              "records"
            ],
            "description": "reports = CLI daily climate reports; records = RER record events."
          },
          "wfo": {
            "type": "string",
            "minLength": 3,
            "maxLength": 4,
            "description": "WFO office filter (e.g. DMX, OUN)."
          },
          "station": {
            "type": "string",
            "description": "Station identifier filter (reports only)."
          },
          "record_type": {
            "type": "string",
            "description": "Record type filter (records only), e.g. HIGH, LOW, RAIN."
          },
          "date": {
            "type": "string",
            "description": "Single date, YYYY-MM-DD."
          },
          "start": {
            "type": "string",
            "description": "Range start date, YYYY-MM-DD."
          },
          "end": {
            "type": "string",
            "description": "Range end date, YYYY-MM-DD."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 168,
            "description": "Lookback window in hours (1-168) when no date/range is given."
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "results": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "type",
          "results"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get climate reports and records",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_current_conditions",
      "title": "Get current conditions",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "analysis": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "dataset_id": {
                    "type": "string"
                  },
                  "valid_times": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "data": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "array",
                      "items": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    }
                  }
                },
                "required": [
                  "dataset_id",
                  "valid_times",
                  "data"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "nearest_station": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "location",
          "analysis",
          "nearest_station"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get current conditions",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_forecast",
      "title": "Get forecast",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 14,
            "default": 10,
            "description": "Number of forecast days (1-14). Default 10."
          },
          "units": {
            "type": "string",
            "enum": [
              "imperial",
              "metric",
              "si"
            ],
            "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."
          },
          "detail_level": {
            "type": "string",
            "enum": [
              "standard",
              "detailed"
            ],
            "default": "standard",
            "description": "standard: compact response (~5-10KB). detailed: preserves CAPE, UV, day/night periods, extra hourly fields (~12-20KB)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "units": {
            "type": "string"
          },
          "forecast": {
            "type": "object",
            "additionalProperties": {}
          },
          "widget": {
            "type": "object",
            "properties": {
              "spec": {
                "type": "string",
                "const": "sw-ui-spec"
              },
              "entries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "component": {
                      "type": "string"
                    },
                    "props": {
                      "type": "object",
                      "additionalProperties": {}
                    }
                  },
                  "required": [
                    "component",
                    "props"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "spec",
              "entries"
            ],
            "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."
          }
        },
        "required": [
          "location",
          "units",
          "forecast"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get forecast",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://weather-widget/v1/index.html"
        },
        "ui/resourceUri": "ui://weather-widget/v1/index.html"
      }
    },
    {
      "name": "get_forecast_discussion",
      "title": "Get forecast discussion",
      "description": "Expert forecaster text products for a location. type=afd: Area Forecast Discussion (WFO forecasters explain reasoning, uncertainty, model disagreements). type=hwo: Hazardous Weather Outlook (7-day hazard summary). type=mcd: SPC Mesoscale Discussions (real-time severe weather analysis). summary_only=true returns the pipeline LLM summary without the full body (much smaller). Examples: {\"location\": \"Des Moines\", \"type\": \"afd\"} or {\"lat\": 41.6, \"lon\": -93.6, \"type\": \"mcd\", \"limit\": 3}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "type": {
            "type": "string",
            "enum": [
              "afd",
              "hwo",
              "mcd"
            ],
            "description": "Product type: afd (WFO discussion), hwo (hazard outlook), mcd (SPC mesoscale)."
          },
          "wfo": {
            "type": "string",
            "minLength": 3,
            "maxLength": 4,
            "description": "WFO identifier override (e.g. BOU). Default: resolved from the location."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 1,
            "description": "Number of recent products (1-10). Default 1 (latest)."
          },
          "summary_only": {
            "type": "boolean",
            "default": false,
            "description": "Return only the LLM summary + sections, omitting the full body text."
          }
        },
        "required": [
          "type"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "type": {
            "type": "string"
          },
          "products": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "type",
          "products"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get forecast discussion",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_forecast_distribution",
      "title": "Get forecast distribution",
      "description": "Probabilistic forecast guidance from NBM for one aspect of the weather: percentile ranges (p10-p90), exceedance probabilities, and ensemble spread. 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). Examples: {\"location\": \"Denver\", \"aspect\": \"snow\", \"hours\": 72} or {\"lat\": 32.9, \"lon\": -97.0, \"aspect\": \"severe\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "aspect": {
            "type": "string",
            "enum": [
              "precip",
              "snow",
              "ice",
              "temperature",
              "wind",
              "severe",
              "aviation",
              "confidence"
            ],
            "description": "Which distribution family to return (see tool description)."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 264,
            "description": "Forecast hours (1-264). Default varies by aspect (48-72)."
          }
        },
        "required": [
          "aspect"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "aspect": {
            "type": "string",
            "enum": [
              "precip",
              "snow",
              "ice",
              "temperature",
              "wind",
              "severe",
              "aviation",
              "confidence"
            ]
          },
          "hours": {
            "type": "number"
          },
          "series": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "dataset_id": {
                  "type": "string"
                },
                "valid_times": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "data": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "required": [
                "dataset_id",
                "valid_times",
                "data"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "location",
          "aspect",
          "hours",
          "series"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get forecast distribution",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_growing_degree_days",
      "title": "Get growing degree days",
      "description": "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?\".",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 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."
          },
          "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."
          },
          "days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 30,
            "description": "Forecast horizon in days (default 10)."
          },
          "day_definition": {
            "type": "string",
            "enum": [
              "nws",
              "local_calendar"
            ],
            "description": "Daily boundary: \"nws\" (default; NBM MaxT/MinT period extremes) or \"local_calendar\" (midnight-to-midnight local day)."
          },
          "unit": {
            "type": "string",
            "enum": [
              "imperial",
              "metric"
            ],
            "description": "Unit system for GDU + temps. Default imperial (°F-days)."
          },
          "base_temp_c": {
            "type": "number",
            "description": "Custom base threshold in °C. Required when crop=\"custom\"."
          },
          "upper_temp_c": {
            "type": "number",
            "description": "Custom upper cutoff in °C (enables the modified method). Optional."
          },
          "method": {
            "type": "string",
            "enum": [
              "simple",
              "modified"
            ],
            "description": "GDU method for custom crops. Defaults from whether upper_temp_c is set."
          },
          "include_milestones": {
            "type": "boolean",
            "description": "Include the crop's growth-stage GDU milestones in the response."
          }
        },
        "required": [
          "lat",
          "lon",
          "crop"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get growing degree days",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_hourly_forecast",
      "title": "Get hourly forecast",
      "description": "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. Accepts a place name directly. Example: {\"location\": \"Chicago\", \"days\": 2}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "days": {
            "type": "integer",
            "minimum": 1,
            "maximum": 7,
            "default": 2,
            "description": "Days of hourly data (1-7). Default 2 (48 hours)."
          },
          "units": {
            "type": "string",
            "enum": [
              "imperial",
              "metric",
              "si"
            ],
            "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."
          },
          "detail_level": {
            "type": "string",
            "enum": [
              "standard",
              "detailed"
            ],
            "default": "standard",
            "description": "standard: compact hourly data (sampled past 24h). detailed: preserves CAPE, ceiling, UV, gust, thunderstorm probability for the first 48h."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "units": {
            "type": "string"
          },
          "forecast": {
            "type": "object",
            "additionalProperties": {}
          },
          "widget": {
            "type": "object",
            "properties": {
              "spec": {
                "type": "string",
                "const": "sw-ui-spec"
              },
              "entries": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "component": {
                      "type": "string"
                    },
                    "props": {
                      "type": "object",
                      "additionalProperties": {}
                    }
                  },
                  "required": [
                    "component",
                    "props"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "spec",
              "entries"
            ],
            "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."
          }
        },
        "required": [
          "location",
          "units",
          "forecast"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get hourly forecast",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://weather-widget/v1/index.html"
        },
        "ui/resourceUri": "ui://weather-widget/v1/index.html"
      }
    },
    {
      "name": "get_lightning_activity",
      "title": "Get lightning activity",
      "description": "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. Only call when storms may be active or the user asks about lightning. Example: {\"location\": \"Tampa\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "lightning": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "location",
          "lightning"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get lightning activity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_map_snapshot",
      "title": "Get map snapshot",
      "description": "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\", 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). Returns the rendered image plus per-layer resolved valid times.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "product": {
            "type": "string",
            "description": "viz-catalog product_id or nexrad_l3:{SITE}:{KEY} (simple form)"
          },
          "zoom": {
            "type": "number",
            "minimum": 2,
            "maximum": 14,
            "default": 7,
            "description": "Map zoom (simple form)"
          },
          "time": {
            "type": "integer",
            "description": "Unix seconds; frame closest to this time (default: latest)"
          },
          "opacity": {
            "type": "number",
            "minimum": 0,
            "maximum": 1,
            "description": "Weather layer opacity"
          },
          "width": {
            "type": "integer",
            "minimum": 300,
            "maximum": 2000,
            "default": 900
          },
          "height": {
            "type": "integer",
            "minimum": 200,
            "maximum": 2000,
            "default": 560
          },
          "scene": {
            "type": "object",
            "additionalProperties": {},
            "description": "Full scene document (composed form). When set, product/location/zoom are ignored."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get map snapshot",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_observations",
      "title": "Get station observations",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "n": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 1,
            "description": "Number of nearest stations (1-10). Default 1. Ignored in station mode."
          },
          "station": {
            "type": "string",
            "minLength": 3,
            "maxLength": 4,
            "description": "ICAO station identifier (e.g. KJFK). Switches to station-history mode."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "description": "Hours of history in station mode (1-24)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "station": {
            "type": "string"
          },
          "observations": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "observations"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get station observations",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_outlooks",
      "title": "Get hazard outlooks",
      "description": "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=heat returns the NWS HeatRisk index at the point (0 none .. 4 extreme, days 1-3). include_narrative=true (severe only) adds the SPC forecaster narrative for the requested day. 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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "hazard": {
            "type": "string",
            "enum": [
              "severe",
              "fire",
              "heat"
            ],
            "default": "severe",
            "description": "Hazard family: severe = SPC convective, fire = SPC fire weather, heat = NWS HeatRisk index. (Excessive rain and winter impacts are planned expansions.)"
          },
          "day": {
            "type": "integer",
            "minimum": 1,
            "maximum": 3,
            "default": 1,
            "description": "Outlook day for the narrative filter (1-3). Default 1."
          },
          "include_narrative": {
            "type": "boolean",
            "default": false,
            "description": "Include the SPC outlook narrative text for the requested day."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "hazard": {
            "type": "string"
          },
          "day": {
            "type": "number"
          },
          "outlooks": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "heat_risk": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          },
          "narrative": {
            "anyOf": [
              {
                "type": "object",
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "location",
          "hazard",
          "day",
          "outlooks"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get hazard outlooks",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_period_totals",
      "title": "Get period totals",
      "description": "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\"}]}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "variable": {
            "type": "string",
            "description": "Standard variable name (e.g. precipitation, snowfall, temperature_2m, wind_speed_10m, cape)."
          },
          "aggregation": {
            "type": "string",
            "enum": [
              "sum",
              "max",
              "min",
              "avg"
            ],
            "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."
          },
          "periods": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "start": {
                  "type": "string",
                  "description": "ISO 8601 start time"
                },
                "end": {
                  "type": "string",
                  "description": "ISO 8601 end time"
                },
                "label": {
                  "type": "string",
                  "description": "Human label, e.g. \"Today\", \"Tomorrow\""
                }
              },
              "required": [
                "start",
                "end"
              ],
              "additionalProperties": false
            },
            "minItems": 1,
            "maxItems": 14,
            "description": "Time periods to aggregate over (1-14)."
          },
          "units": {
            "type": "string",
            "enum": [
              "imperial",
              "metric",
              "si"
            ],
            "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."
          },
          "dataset_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Dataset override. Default: auto-resolved NBM for the location."
          }
        },
        "required": [
          "variable",
          "periods"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "variable": {
            "type": "string"
          },
          "aggregation": {
            "type": "string"
          },
          "periods": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string"
                },
                "start": {
                  "type": "string"
                },
                "end": {
                  "type": "string"
                },
                "value": {
                  "type": "number"
                },
                "unit": {
                  "type": "string"
                },
                "hours_included": {
                  "type": "number"
                }
              },
              "required": [
                "start",
                "end",
                "value",
                "unit",
                "hours_included"
              ],
              "additionalProperties": false
            }
          },
          "message": {
            "type": "string"
          }
        },
        "required": [
          "location",
          "variable",
          "aggregation",
          "periods"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get period totals",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_population_exposure",
      "title": "Get population exposure",
      "description": "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}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "hazard": {
            "type": "string",
            "enum": [
              "heat"
            ],
            "description": "Hazard family (expands the day-1..3 product set). Currently: heat (HeatRisk)."
          },
          "product_id": {
            "type": "string",
            "description": "Explicit risk-zone product ID (overrides hazard), e.g. heatrisk_day1_conus."
          },
          "min_level": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 1,
            "description": "Minimum risk level to count (>=). Default 1 (any elevated risk)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "min_level": {
            "type": "number"
          },
          "summaries": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "product_id": {
                  "type": "string"
                },
                "population": {
                  "type": "number"
                },
                "feature_count": {
                  "type": "number"
                },
                "valid_time": {
                  "type": "string"
                },
                "error": {
                  "type": "string"
                }
              },
              "required": [
                "product_id"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "min_level",
          "summaries"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get population exposure",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_sounding",
      "title": "Get radiosonde sounding",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "n": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "default": 1,
            "description": "Number of nearest soundings (1-5). Default 1."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "soundings": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "location",
          "soundings"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get radiosonde sounding",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_sounding_chart",
      "title": "Get sounding chart",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "unit": {
            "type": "string",
            "enum": [
              "fahrenheit",
              "celsius"
            ],
            "default": "fahrenheit",
            "description": "Temperature axis display unit"
          },
          "scale": {
            "type": "number",
            "minimum": 1,
            "maximum": 3,
            "default": 2,
            "description": "Raster scale factor (2 = retina; higher = larger image payload)"
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get sounding chart",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_storm_cells",
      "title": "Get storm cells",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "include": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "tracks",
                "hail_index",
                "mesocyclone",
                "tvs"
              ]
            },
            "default": [
              "tracks",
              "hail_index",
              "mesocyclone",
              "tvs"
            ],
            "description": "Which detection families to include. Default: all."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "tracks": {
            "type": "object",
            "additionalProperties": {}
          },
          "detections": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "location",
          "detections"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get storm cells",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_storm_reports",
      "title": "Get storm reports",
      "description": "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. Example: {\"location\": \"Wichita\", \"hours\": 12, \"type\": \"H\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 24,
            "default": 6,
            "description": "Lookback window in hours (1-24). Default 6."
          },
          "type": {
            "type": "string",
            "description": "Report type filter: T=tornado, H=hail, W=wind, F=flood, D=damage, S=snow."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "hours": {
            "type": "number"
          },
          "reports": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "location",
          "hours",
          "reports"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get storm reports",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_time_context",
      "title": "Get time context",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "current_time": {
            "type": "object",
            "additionalProperties": {}
          },
          "daylight": {
            "type": "object",
            "additionalProperties": {}
          },
          "moon": {
            "type": "object",
            "additionalProperties": {}
          },
          "calendar": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "location",
          "current_time",
          "daylight",
          "moon",
          "calendar"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get time context",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "get_tropical",
      "title": "Get tropical activity",
      "description": "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. Example: {} or {\"include_geometry\": true}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "include_geometry": {
            "type": "boolean",
            "default": false,
            "description": "Include full GeoJSON geometries (cone/track polygons). Default false."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "feature_count": {
            "type": "number"
          },
          "features": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "active",
          "feature_count",
          "features"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Get tropical activity",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "list_datasets",
      "title": "List datasets",
      "description": "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\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "include_freshness": {
            "type": "boolean",
            "default": true,
            "description": "Include per-dataset data age and run times. Default true."
          }
        },
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "datasets": {
            "type": "object",
            "additionalProperties": {}
          },
          "freshness": {
            "type": "object",
            "additionalProperties": {}
          }
        },
        "required": [
          "location",
          "datasets"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "List datasets",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "query_dataset",
      "title": "Query dataset",
      "description": "Raw time series from a specific dataset for specific variables at a point. Power-user access to any gridded product (NBM, HRRR, 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. For blended forecasts use get_forecast instead. Examples: {\"location\": \"Denver\", \"dataset_id\": \"hrrr_surface\", \"variables\": [\"temperature_2m\"], \"hours\": 18} or {\"lat\": 41.4, \"lon\": -92.9, \"dataset_id\": \"rtma_conus\", \"variables\": [\"temperature_2m\"], \"latest\": true}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "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."
          },
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          },
          "dataset_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Dataset to query. Default: the NBM dataset for the location domain (nbm_conus/nbm_alaska/nbm_hawaii). Discover options with list_datasets."
          },
          "variables": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "maxItems": 20,
            "description": "Standard variable names (e.g. temperature_2m, precipitation). Discover with describe_dataset."
          },
          "hours": {
            "type": "integer",
            "minimum": 1,
            "maximum": 264,
            "description": "Forecast/lookahead hours from now (1-264). Default 24 when no other time mode set."
          },
          "time_start": {
            "type": "string",
            "description": "ISO 8601 window start (with time_end)."
          },
          "time_end": {
            "type": "string",
            "description": "ISO 8601 window end (with time_start)."
          },
          "latest": {
            "type": "boolean",
            "default": false,
            "description": "Return only the most recent value (analysis datasets like RTMA/MRMS)."
          },
          "reference_time": {
            "type": "string",
            "description": "Pin a specific model run (ISO 8601). Default: latest run."
          }
        },
        "required": [
          "variables"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "location": {
            "type": "object",
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              },
              "name": {
                "type": "string"
              }
            },
            "required": [
              "lat",
              "lon"
            ],
            "additionalProperties": false
          },
          "series": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "dataset_id": {
                  "type": "string"
                },
                "valid_times": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "data": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "array",
                    "items": {
                      "type": [
                        "number",
                        "null"
                      ]
                    }
                  }
                }
              },
              "required": [
                "dataset_id",
                "valid_times",
                "data"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "location",
          "series"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Query dataset",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "reverse_geocode",
      "title": "Reverse geocode",
      "description": "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.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number",
            "minimum": -90,
            "maximum": 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",
            "minimum": -180,
            "maximum": 180,
            "description": "Longitude in decimal degrees (-180 to 180). For continental US use negative values (west of the prime meridian)."
          }
        },
        "required": [
          "lat",
          "lon"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "lat": {
            "type": "number"
          },
          "lon": {
            "type": "number"
          },
          "place": {
            "type": "object",
            "properties": {
              "city": {
                "type": "string"
              },
              "nearest_city": {
                "type": "string"
              },
              "state": {
                "type": "string"
              },
              "county": {
                "type": "string"
              },
              "timezone": {
                "type": "string"
              }
            },
            "additionalProperties": true
          }
        },
        "required": [
          "lat",
          "lon",
          "place"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Reverse geocode",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    },
    {
      "name": "search_locations",
      "title": "Search locations",
      "description": "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 population.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Place query: city, \"city, state\", ZIP, or partial text with fuzzy=true."
          },
          "fuzzy": {
            "type": "boolean",
            "default": false,
            "description": "Autosuggest mode for partial/misspelled input. Default false (exact search)."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10,
            "default": 5,
            "description": "Maximum candidates to return (1-10). Default 5."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "candidates": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string"
                },
                "state": {
                  "type": "string"
                },
                "zip": {
                  "type": "string"
                },
                "lat": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "lon": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "timezone": {
                  "type": "string"
                },
                "type": {
                  "type": "string"
                }
              },
              "additionalProperties": false
            }
          }
        },
        "required": [
          "query",
          "candidates"
        ],
        "additionalProperties": false,
        "$schema": "http://json-schema.org/draft-07/schema#"
      },
      "annotations": {
        "title": "Search locations",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      },
      "execution": {
        "taskSupport": "forbidden"
      }
    }
  ]
}
