nws-weather-mcp-server

Get US weather forecasts, active alerts, and current observations.

¿Debería usar esto?

Calidad y seguridad

A
Calidad de la descripción
100%
Integridad del esquema
82%
Calidad de los nombres
80%
Riesgo de envenenamiento
100%
Coincidencia de permisos
100%
Cumplimiento del protocolo
100%

Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.

Costo de contexto

~9,537Tokens (definiciones de herramientas)
~12.5 KBTamaño de respuesta típico
Impacto significativo en la atención (7.45% del contexto de 128k)

Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.

Instalar

Instalación con un clic

Agrega esto a tu archivo `claude_desktop_config.json`:

{
  "mcpServers": {
    "nws-weather-mcp-server": {
      "command": "bun",
      "args": [
        "@cyanheads/nws-weather-mcp-server"
      ]
    }
  }
}

Paquetes ejecutables

npm@cyanheads/nws-weather-mcp-server0.10.0streamable-http

Puntos de conexión remotos

https://nws.caseyjhand.com/mcpstreamable-http

Qué puede hacer

Inventario de herramientas

Herramientas (9)

🟢 Solo lectura🟡 Escritura🔴 Eliminación⚪ Desconocido
🟢nws_get_forecast(latitude, longitude, hourly, cursor)

Get the weather forecast for a US location. Returns either named 12-hour periods (default) or hourly breakdowns.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "latitude": {
      "type": "number",
      "minimum": -90,
      "maximum": 90,
      "description": "Latitude in decimal degrees (e.g., 47.6062)."
    },
    "longitude": {
      "type": "number",
      "minimum": -180,
      "maximum": 180,
      "description": "Longitude in decimal degrees (e.g., -122.3321)."
    },
    "hourly": {
      "default": false,
      "description": "If true, returns hourly forecast (48 one-hour periods per page, ~156 available) instead of 12-hour named periods (14 periods). Hourly includes dewpoint and relative humidity.",
      "type": "boolean"
    },
    "cursor": {
      "description": "Opaque continuation token from a previous response's nextCursor, to retrieve the next 48 periods. Omit for the first page. Every call re-fetches the forecast, so consecutive periods are contiguous within one response; NWS reissues forecasts through the day, so a later call can window a regenerated period array.",
      "type": "string"
    }
  },
  "required": [
    "latitude",
    "longitude"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "location": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string",
          "description": "City name"
        },
        "state": {
          "type": "string",
          "description": "State name"
        },
        "office": {
          "type": "string",
          "description": "NWS Weather Forecast Office code"
        },
        "timeZone": {
          "type": "string",
          "description": "IANA time zone"
        },
        "forecastZone": {
          "type": "string",
          "description": "Forecast zone code for chaining to nws_search_alerts"
        },
        "county": {
          "type": "string",
          "description": "County zone code for chaining to nws_search_alerts"
        }
      },
      "required": [
        "city",
        "state",
        "office",
        "timeZone",
        "forecastZone",
        "county"
      ],
      "additionalProperties": false,
      "description": "Resolved location metadata"
    },
    "generatedAt": {
      "type": "string",
      "description": "When the forecast was generated (ISO 8601)"
    },
    "periods": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Period name (e.g., \"Today\", \"Tonight\") or hour label"
          },
          "startTime": {
            "type": "string",
            "description": "Period start (ISO 8601)"
          },
          "endTime": {
            "type": "string",
            "description": "Period end (ISO 8601)"
          },
          "temperature": {
            "type": "number",
            "description": "Temperature value"
          },
          "temperatureUnit": {
            "type": "string",
            "description": "Temperature unit (F or C)"
          },
          "windSpeed": {
            "type": "string",
            "description": "Wind speed (e.g., \"10 mph\")"
          },
          "windDirection": {
            "type": "string",
            "description": "Wind direction (e.g., \"NW\")"
          },
          "shortForecast": {
            "type": "string",
            "description": "Brief forecast (e.g., \"Mostly Sunny\")"
          },
          "detailedForecast": {
            "type": "string",
            "description": "Full narrative forecast"
          },
          "precipChancePct": {
            "description": "Probability of precipitation in percent (0-100)",
            "type": [
              "number",
              "null"
            ]
          },
          "dewpointC": {
            "description": "Dewpoint in Celsius (hourly only)",
            "type": [
              "number",
              "null"
            ]
          },
          "relativeHumidityPct": {
            "description": "Relative humidity in percent (0-100, hourly only)",
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "name",
          "startTime",
          "endTime",
          "temperature",
          "temperatureUnit",
          "windSpeed",
          "windDirection",
          "shortForecast",
          "detailedForecast",
          "precipChancePct",
          "dewpointC",
          "relativeHumidityPct"
        ],
        "additionalProperties": false,
        "description": "Single forecast period with time range, conditions, and narrative"
      },
      "description": "Forecast periods"
    },
    "totalCount": {
      "type": "number",
      "description": "Total forecast periods available upstream before the page window was applied — NOT the number in this page, which is shown. Compare it against shown to tell whether periods were withheld."
    },
    "shown": {
      "type": "number",
      "description": "Number of forecast periods in this page (at most 48)."
    },
    "mode": {
      "type": "string",
      "description": "Forecast mode: \"hourly\" or \"7-day\""
    },
    "nextCursor": {
      "description": "Opaque token for the next page of periods — pass it back as `cursor`. Omitted when this is the last page.",
      "type": "string"
    },
    "notice": {
      "description": "Set when periods remain beyond this page, or when the supplied cursor points past the end of the period array.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage. `marine_forecast_unsupported`: Coordinates fall in a marine area, where NWS publishes no point forecast. `no_forecast_grid`: Coordinates are on land in a forecast zone NWS serves no forecast grid for (e.g., interior Northern Mariana Islands). Other values are possible when a failure originates below the handler.",
              "examples": [
                "out_of_scope",
                "marine_forecast_unsupported",
                "no_forecast_grid"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "location",
        "generatedAt",
        "periods",
        "totalCount",
        "shown",
        "mode"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_search_alerts(area, point, zone, region_type, region, ...)

Search active weather alerts (watches, warnings, advisories) across the US. Filter by state, coordinates, zone, land/marine region, event type, severity, urgency, or certainty. area, point, zone, region_type, and region are mutually exclusive — provide at most one. Omit all filters for a national search.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "area": {
      "description": "US state/territory code (e.g., \"WA\", \"OK\", \"PR\") or marine area code (e.g., \"GM\"). Mutually exclusive with point and zone.",
      "type": "string"
    },
    "point": {
      "description": "Coordinates as \"lat,lon\" (e.g., \"47.6,-122.3\"). Returns alerts whose geometry contains this point. Mutually exclusive with area and zone.",
      "type": "string"
    },
    "zone": {
      "description": "NWS forecast zone (e.g., \"WAZ558\") or county zone (e.g., \"WAC033\"). Mutually exclusive with area and point.",
      "type": "string"
    },
    "region_type": {
      "description": "Restrict to land-based or marine alerts. Mutually exclusive with area, point, zone, and region.",
      "type": "string",
      "enum": [
        "Land",
        "Marine"
      ]
    },
    "region": {
      "description": "Restrict to NWS marine region groups: \"AL\" (Alaska waters), \"AT\" (Atlantic Ocean), \"GL\" (Great Lakes), \"GM\" (Gulf of Mexico), \"PA\" (Eastern Pacific and US West Coast), \"PI\" (Central and Western Pacific). Marine alerts only — a land alert never matches. Mutually exclusive with area, point, zone, and region_type.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "AL",
          "AT",
          "GL",
          "GM",
          "PA",
          "PI"
        ]
      }
    },
    "event": {
      "description": "Filter to specific event types (e.g., [\"Tornado Warning\"]). Matches are case-insensitive and partial, so \"tornado\" matches both \"Tornado Warning\" and \"Tornado Watch\". Use nws_list_alert_types to discover valid names.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "severity": {
      "description": "Filter by severity level.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Extreme",
          "Severe",
          "Moderate",
          "Minor",
          "Unknown"
        ]
      }
    },
    "urgency": {
      "description": "Filter by urgency level.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Immediate",
          "Expected",
          "Future",
          "Past"
        ]
      }
    },
    "certainty": {
      "description": "Filter by certainty level.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Observed",
          "Likely",
          "Possible",
          "Unlikely",
          "Unknown"
        ]
      }
    },
    "status": {
      "description": "Alert status filter. Default \"Actual\". Use a different value only when you specifically need non-live alerts.",
      "default": "Actual",
      "type": "string",
      "enum": [
        "Actual",
        "Exercise",
        "System",
        "Test",
        "Draft"
      ]
    },
    "limit": {
      "default": 25,
      "description": "Maximum number of alerts to include in this page (1-25, default 25). totalCount still reports the full number of distinct matches, so a small limit returns a digest of broad or national searches without dropping the total; pass the returned nextCursor as cursor to reach the rest.",
      "type": "integer",
      "minimum": 1,
      "maximum": 25
    },
    "cursor": {
      "description": "Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the active-alert feed, so alerts are contiguous within one response but not across calls — the active set changes continuously as alerts are issued and expire, so a continued page covers the collection as it stands at that moment.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "alerts": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Alert ID"
          },
          "event": {
            "type": "string",
            "description": "Event type (e.g., \"Tornado Warning\")"
          },
          "headline": {
            "description": "Alert headline",
            "type": [
              "string",
              "null"
            ]
          },
          "description": {
            "description": "Full alert description; null when NWS publishes the alert without one",
            "type": [
              "string",
              "null"
            ]
          },
          "instruction": {
            "description": "Recommended actions",
            "type": [
              "string",
              "null"
            ]
          },
          "severity": {
            "type": "string",
            "description": "Severity level"
          },
          "urgency": {
            "type": "string",
            "description": "Urgency level"
          },
          "certainty": {
            "type": "string",
            "description": "Certainty level"
          },
          "areaDesc": {
            "type": "string",
            "description": "Affected area description"
          },
          "sent": {
            "type": "string",
            "description": "Message issuance time (ISO 8601) — when the office transmitted this CAP message. Describes the message, not the hazard: use it to judge how stale the report is."
          },
          "effective": {
            "type": "string",
            "description": "Message effective time (ISO 8601) — when this version of the CAP message takes effect. A property of the message, not of the hazard: distinct from onset (when the hazard begins) and from expires (when a superseding message is due). Usually equals sent."
          },
          "onset": {
            "description": "Expected hazard onset (ISO 8601). When the hazard is expected to begin.",
            "type": [
              "string",
              "null"
            ]
          },
          "ends": {
            "description": "Hazard end (ISO 8601) — when the hazard is expected to end; null when open-ended (\"until further notice\"). Distinct from expires, which is the message-refresh time.",
            "type": [
              "string",
              "null"
            ]
          },
          "expires": {
            "description": "Message expiration (ISO 8601) — when NWS will issue a superseding statement. NOT when the hazard ends; the hazard window is described in the headline.",
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "description": "This alert's own CAP status as reported by NWS (\"Actual\", \"Exercise\", \"System\", \"Test\", \"Draft\"). Distinct from the status input filter, which selects which alerts are searched — with the default filter every returned alert reads \"Actual\"."
          },
          "messageType": {
            "type": "string",
            "description": "CAP message type: \"Alert\" for an original issuance, \"Update\" for a revision of an earlier message, \"Cancel\" for a cancellation."
          },
          "references": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "identifier": {
                  "type": "string",
                  "description": "CAP identifier of the superseded message"
                },
                "sent": {
                  "type": "string",
                  "description": "When the superseded message was issued (ISO 8601)"
                }
              },
              "required": [
                "identifier",
                "sent"
              ],
              "additionalProperties": false,
              "description": "One prior message this alert supersedes"
            },
            "description": "Prior alert messages this one supersedes, newest first. Empty for an original issuance — never inferred when NWS reports none."
          },
          "senderName": {
            "type": "string",
            "description": "Issuing office"
          },
          "affectedZones": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "code": {
                  "type": "string",
                  "description": "Zone code, e.g. \"WAZ558\" (forecast) or \"WAC033\" (county)"
                },
                "type": {
                  "type": "string",
                  "description": "NWS zone type: \"forecast\", \"county\", or \"fire\" (\"unknown\" when upstream reports a shape this server cannot type). Only \"forecast\" codes have a zone text forecast — pass those to nws_get_zone_forecast. All types are valid values for this tool's own zone filter."
                }
              },
              "required": [
                "code",
                "type"
              ],
              "additionalProperties": false,
              "description": "Affected zone with its NWS zone type"
            },
            "description": "Affected zones, each with the zone type that decides where it can chain"
          }
        },
        "required": [
          "id",
          "event",
          "headline",
          "description",
          "instruction",
          "severity",
          "urgency",
          "certainty",
          "areaDesc",
          "sent",
          "effective",
          "onset",
          "ends",
          "expires",
          "status",
          "messageType",
          "references",
          "senderName",
          "affectedZones"
        ],
        "additionalProperties": false,
        "description": "Single active alert with event, severity, area, and timing"
      },
      "description": "Matching alerts for this page (at most the requested limit, max 25)"
    },
    "totalCount": {
      "type": "number",
      "description": "Total distinct alerts matching the filters in this fetch, before the page window is applied. NWS repeats some alerts verbatim within one response; the copies are collapsed on id, so this counts each alert once. Compare against shown to tell whether matches were withheld from this page."
    },
    "shown": {
      "type": "number",
      "description": "Number of alerts included in this response"
    },
    "appliedFilters": {
      "type": "string",
      "description": "Summary of applied search filters"
    },
    "nextCursor": {
      "description": "Opaque token for the next page of matches — pass it back as `cursor`. Omitted when this is the last page.",
      "type": "string"
    },
    "notice": {
      "description": "Guidance when no alerts matched (echoes applied filters and suggests how to broaden), when matches remain beyond this page, or when the supplied cursor points past the end of the match set.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `mutually_exclusive_filters`: More than one of area, point, zone, region_type, or region provided. `invalid_area_code`: Area code is not a recognized US state, territory, or marine area. `invalid_point`: Point coordinates are malformed or outside valid bounds. `invalid_zone`: Zone code does not match the NWS zone-code shape. Other values are possible when a failure originates below the handler.",
              "examples": [
                "mutually_exclusive_filters",
                "invalid_area_code",
                "invalid_point",
                "invalid_zone"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "alerts",
        "totalCount",
        "shown",
        "appliedFilters"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_get_alert_counts

Count active weather alerts nationwide, per state/territory or marine area, and per marine region, in one small response — the answer to "how many alerts are active, and where" without fetching the alerts themselves. Counts cover every message status, Test and Exercise included, so totalAlerts can run above the totalCount a national nws_search_alerts search reports under its default status of Actual. An alert counts once in each area its zones fall in, so the area counts can sum past totalAlerts; landAlerts plus marineAlerts equals totalAlerts. Takes no filters. For counts per zone or under a filter, call nws_search_alerts with that zone or filter and read its totalCount.

Esquema de entrada

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "totalAlerts": {
      "type": "number",
      "description": "Active alerts nationwide across every message status (Actual, Exercise, System, Test, Draft). Can exceed the totalCount of a national nws_search_alerts search, which counts status Actual by default."
    },
    "landAlerts": {
      "type": "number",
      "description": "Active alerts affecting land zones."
    },
    "marineAlerts": {
      "type": "number",
      "description": "Active alerts affecting marine zones. landAlerts + marineAlerts = totalAlerts."
    },
    "areas": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      },
      "description": "Active alert counts keyed by state/territory code (e.g., \"WA\", \"PR\") or marine area code (e.g., \"PZ\", \"GM\"). Only areas with an active alert appear. An alert counts once in each area its zones fall in, so these can sum past totalAlerts. Area \"AL\" is Alabama; Alaska waters are region \"AL\" in regions."
    },
    "regions": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "number"
      },
      "description": "Active marine alert counts keyed by marine region: \"AL\" (Alaska waters), \"AT\" (Atlantic Ocean), \"GL\" (Great Lakes), \"GM\" (Gulf of Mexico), \"PA\" (Eastern Pacific and US West Coast), \"PI\" (Central and Western Pacific). Only regions with an active alert appear, so the map is empty when no marine alert is active."
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "totalAlerts",
        "landAlerts",
        "marineAlerts",
        "areas",
        "regions"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_get_observations(latitude, longitude, station_id)

Get current weather observations (actual measured conditions). Accepts coordinates (resolves nearest station automatically) or a station ID directly (e.g., "KSEA").

Esquema de entrada

{
  "type": "object",
  "properties": {
    "latitude": {
      "description": "Latitude for automatic station resolution. Use with longitude. Ignored if station_id is provided.",
      "type": "number",
      "minimum": -90,
      "maximum": 90
    },
    "longitude": {
      "description": "Longitude for automatic station resolution. Use with latitude. Ignored if station_id is provided.",
      "type": "number",
      "minimum": -180,
      "maximum": 180
    },
    "station_id": {
      "description": "Station identifier directly (e.g., \"KSEA\", \"KORD\"). Use nws_find_stations to discover station IDs.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "stationId": {
      "type": "string",
      "description": "Observation station ID"
    },
    "stationName": {
      "type": "string",
      "description": "Station name"
    },
    "timestamp": {
      "type": "string",
      "description": "Observation time (ISO 8601)"
    },
    "timeZone": {
      "description": "Station time zone when known",
      "type": [
        "string",
        "null"
      ]
    },
    "textDescription": {
      "type": "string",
      "description": "Conditions summary (e.g., \"Mostly Cloudy\")"
    },
    "temperatureC": {
      "description": "Temperature in Celsius",
      "type": [
        "number",
        "null"
      ]
    },
    "dewpointC": {
      "description": "Dewpoint in Celsius",
      "type": [
        "number",
        "null"
      ]
    },
    "windSpeedKmh": {
      "description": "Wind speed in km/h",
      "type": [
        "number",
        "null"
      ]
    },
    "windDirectionDeg": {
      "description": "Wind direction in degrees (0-360)",
      "type": [
        "number",
        "null"
      ]
    },
    "windGustKmh": {
      "description": "Wind gust in km/h",
      "type": [
        "number",
        "null"
      ]
    },
    "barometricPressurePa": {
      "description": "Barometric pressure in Pascals",
      "type": [
        "number",
        "null"
      ]
    },
    "visibilityM": {
      "description": "Visibility in meters",
      "type": [
        "number",
        "null"
      ]
    },
    "relativeHumidityPct": {
      "description": "Relative humidity in percent (0-100)",
      "type": [
        "number",
        "null"
      ]
    },
    "heatIndexC": {
      "description": "Heat index in Celsius",
      "type": [
        "number",
        "null"
      ]
    },
    "windChillC": {
      "description": "Wind chill in Celsius",
      "type": [
        "number",
        "null"
      ]
    },
    "cloudLayers": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "amount": {
            "type": "string",
            "description": "Cloud cover (e.g., \"FEW\", \"SCT\", \"BKN\", \"OVC\")"
          },
          "baseM": {
            "description": "Cloud base height in meters",
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "amount",
          "baseM"
        ],
        "additionalProperties": false,
        "description": "Single cloud layer with cover amount and base height"
      },
      "description": "Cloud layer information"
    },
    "station": {
      "type": "string",
      "description": "Station ID that served the observation (e.g., \"KSEA\")"
    },
    "observedAt": {
      "type": "string",
      "description": "Observation timestamp (ISO 8601)"
    },
    "notice": {
      "description": "Guidance when the latest observation is more than 2 hours old — data may not reflect current conditions.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `missing_input`: Neither station_id nor a (latitude, longitude) pair was provided. `station_not_found`: Station ID does not exist in the NWS network. `no_observations`: Station has no recent observations available. `no_stations_nearby`: No observation stations exist near the requested coordinates. `out_of_scope`: Coordinates fall outside US National Weather Service coverage. Other values are possible when a failure originates below the handler.",
              "examples": [
                "missing_input",
                "station_not_found",
                "no_observations",
                "no_stations_nearby",
                "out_of_scope"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "stationId",
        "stationName",
        "timestamp",
        "timeZone",
        "textDescription",
        "temperatureC",
        "dewpointC",
        "windSpeedKmh",
        "windDirectionDeg",
        "windGustKmh",
        "barometricPressurePa",
        "visibilityM",
        "relativeHumidityPct",
        "heatIndexC",
        "windChillC",
        "cloudLayers",
        "station",
        "observedAt"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_get_observation_history(station_id, start, end, limit, cursor)

Get a station's recent observation history, newest first — the trend behind the single latest reading nws_get_observations returns (is pressure falling, is the wind picking up). NWS keeps about the last 7 days per station, and a busy airport station reports as often as every 5 minutes, so a day can run past 100 observations: narrow with start (inclusive) and end (exclusive), and page back to older observations with nextCursor. Takes a station ID; use nws_find_stations to find one near a coordinate.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "station_id": {
      "type": "string",
      "minLength": 1,
      "description": "Observation station ID (e.g., \"KSEA\"), case-insensitive. Use nws_find_stations to discover station IDs near a coordinate."
    },
    "start": {
      "description": "Earliest observation time to include (inclusive), as an ISO 8601 date-time with seconds and an offset (e.g., \"2026-09-30T00:00:00Z\" or \"2026-09-29T17:00:00-07:00\"). Omit to reach back as far as NWS keeps, about 7 days.",
      "type": "string"
    },
    "end": {
      "description": "Time to stop before (exclusive), in the same format as start. Omit to start from the most recent observation.",
      "type": "string"
    },
    "limit": {
      "default": 24,
      "description": "Observations per page (1-100), newest first. When a page fills the limit, pass its nextCursor back as cursor for older observations.",
      "type": "integer",
      "minimum": 1,
      "maximum": 100
    },
    "cursor": {
      "description": "Opaque continuation token from a previous response's nextCursor. Omit for the first page. It carries that query's start, end, and limit, so those inputs apply to the first page only. Each page continues from just before the oldest observation of the one before it, so pages neither repeat nor skip an observation.",
      "type": "string"
    }
  },
  "required": [
    "station_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "stationId": {
      "type": "string",
      "description": "Observation station ID, uppercased"
    },
    "stationName": {
      "type": "string",
      "description": "Station name"
    },
    "timeZone": {
      "description": "Station time zone when known",
      "type": [
        "string",
        "null"
      ]
    },
    "observations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "description": "Observation time (ISO 8601)"
          },
          "textDescription": {
            "type": "string",
            "description": "Conditions summary (e.g., \"Mostly Cloudy\"); empty when not reported"
          },
          "temperatureC": {
            "description": "Temperature in Celsius",
            "type": [
              "number",
              "null"
            ]
          },
          "dewpointC": {
            "description": "Dewpoint in Celsius",
            "type": [
              "number",
              "null"
            ]
          },
          "windSpeedKmh": {
            "description": "Wind speed in km/h",
            "type": [
              "number",
              "null"
            ]
          },
          "windDirectionDeg": {
            "description": "Wind direction in degrees (0-360)",
            "type": [
              "number",
              "null"
            ]
          },
          "windGustKmh": {
            "description": "Wind gust in km/h",
            "type": [
              "number",
              "null"
            ]
          },
          "barometricPressurePa": {
            "description": "Barometric pressure in Pascals",
            "type": [
              "number",
              "null"
            ]
          },
          "visibilityM": {
            "description": "Visibility in meters",
            "type": [
              "number",
              "null"
            ]
          },
          "relativeHumidityPct": {
            "description": "Relative humidity in percent (0-100)",
            "type": [
              "number",
              "null"
            ]
          },
          "heatIndexC": {
            "description": "Heat index in Celsius",
            "type": [
              "number",
              "null"
            ]
          },
          "windChillC": {
            "description": "Wind chill in Celsius",
            "type": [
              "number",
              "null"
            ]
          },
          "cloudLayers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "amount": {
                  "type": "string",
                  "description": "Cloud cover (e.g., \"FEW\", \"SCT\", \"BKN\", \"OVC\")"
                },
                "baseM": {
                  "description": "Cloud base height in meters",
                  "type": [
                    "number",
                    "null"
                  ]
                }
              },
              "required": [
                "amount",
                "baseM"
              ],
              "additionalProperties": false,
              "description": "Single cloud layer with cover amount and base height"
            },
            "description": "Cloud layer information"
          }
        },
        "required": [
          "timestamp",
          "textDescription",
          "temperatureC",
          "dewpointC",
          "windSpeedKmh",
          "windDirectionDeg",
          "windGustKmh",
          "barometricPressurePa",
          "visibilityM",
          "relativeHumidityPct",
          "heatIndexC",
          "windChillC",
          "cloudLayers"
        ],
        "additionalProperties": false,
        "description": "One observation; a measurement the station did not report is null, never 0"
      },
      "description": "Observations in the window, newest first"
    },
    "shown": {
      "type": "number",
      "description": "Number of observations returned in this page"
    },
    "truncated": {
      "description": "True when this page filled the limit and older observations in the window may remain; continue with nextCursor.",
      "type": "boolean"
    },
    "cap": {
      "description": "The page limit this page filled, when truncated is true",
      "type": "number"
    },
    "nextCursor": {
      "description": "Opaque token for the next, older page — pass it back as cursor. Present only when this page filled the limit; omitted on the last page.",
      "type": "string"
    },
    "notice": {
      "description": "Guidance when the window held no observations (NWS keeps about the last 7 days), or when this page filled the limit and older observations may remain.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: Station ID is malformed or does not exist in the NWS network. `invalid_time_window`: start or end is not a valid ISO 8601 date-time with seconds and an offset, or start is not before end. Other values are possible when a failure originates below the handler.",
              "examples": [
                "station_not_found",
                "invalid_time_window"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "stationId",
        "stationName",
        "timeZone",
        "observations",
        "shown"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_find_stations(latitude, longitude, limit, cursor)

Find weather observation stations near a location. Returns stations sorted by proximity with distance and bearing. Use to discover station IDs for nws_get_observations.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "latitude": {
      "type": "number",
      "minimum": -90,
      "maximum": 90,
      "description": "Center latitude for proximity search."
    },
    "longitude": {
      "type": "number",
      "minimum": -180,
      "maximum": 180,
      "description": "Center longitude for proximity search."
    },
    "limit": {
      "default": 10,
      "description": "Max stations per page (1-50). totalCount still reports every station near the point, so pass the returned nextCursor as cursor to reach the rest.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "cursor": {
      "description": "Opaque continuation token from a previous response's nextCursor. Omit for the first page. The token carries its own page size, so limit applies to the first page only. Every call re-fetches the station list, so pages are contiguous within one response; the registry changes rarely, but a later call can window an updated list.",
      "type": "string"
    }
  },
  "required": [
    "latitude",
    "longitude"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "stations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "stationId": {
            "type": "string",
            "description": "Station identifier (e.g., \"KSEA\")"
          },
          "name": {
            "type": "string",
            "description": "Station name"
          },
          "distanceKm": {
            "type": "number",
            "description": "Distance from query point in kilometers"
          },
          "bearing": {
            "type": "string",
            "description": "Compass bearing from query point (e.g., \"NW\")"
          },
          "elevationM": {
            "description": "Elevation in meters",
            "type": [
              "number",
              "null"
            ]
          },
          "timeZone": {
            "type": "string",
            "description": "IANA time zone"
          },
          "county": {
            "type": "string",
            "description": "County zone code (e.g., \"WAC033\")"
          },
          "forecastZone": {
            "type": "string",
            "description": "Forecast zone code (e.g., \"WAZ315\")"
          }
        },
        "required": [
          "stationId",
          "name",
          "distanceKm",
          "bearing",
          "elevationM",
          "timeZone",
          "county",
          "forecastZone"
        ],
        "additionalProperties": false,
        "description": "Observation station record with identity, location, and zone codes"
      },
      "description": "Nearby stations sorted by distance"
    },
    "totalCount": {
      "type": "number",
      "description": "Total observation stations available near this location before the page limit was applied — NOT the number returned in this page, which is shown. Same value on every page of one query; compare it against shown to tell whether stations were withheld."
    },
    "shown": {
      "type": "number",
      "description": "Number of stations returned in this page"
    },
    "nextCursor": {
      "description": "Opaque token for the next page of stations — pass it back as `cursor`. Omitted when this is the last page.",
      "type": "string"
    },
    "notice": {
      "description": "Guidance when no stations were found near the requested coordinates, when stations remain beyond this page, or when the supplied cursor points past the end of the list.",
      "type": "string"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `out_of_scope`: Coordinates fall outside US National Weather Service coverage. Other values are possible when a failure originates below the handler.",
              "examples": [
                "out_of_scope"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "stations",
        "totalCount",
        "shown"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_list_alert_types

List all valid NWS alert event type names. Use to discover valid values for the event filter in nws_search_alerts, or to browse alert categories. No parameters required.

Esquema de entrada

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "count": {
      "type": "number",
      "description": "Number of event types"
    },
    "eventTypes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Alert event type names sorted alphabetically"
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode."
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "count",
        "eventTypes"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_get_office_discussion(office, product_type)

Get the latest narrative forecast product from a Weather Forecast Office (WFO). The default product is AFD (Area Forecast Discussion), which explains the meteorological reasoning behind the forecast — synoptic setup, model guidance, and forecaster confidence. Other types: HWO (Hazardous Weather Outlook, 1-7 day severe/flood/winter outlook), ZFP (Zone Forecast Product, zone-by-zone text), SPS (Special Weather Statement, short-fuse advisory). The office code is the 3-letter WFO identifier returned as the "office" field by nws_get_forecast.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "office": {
      "type": "string",
      "minLength": 1,
      "description": "Three-letter Weather Forecast Office (WFO) code (e.g., \"SEW\" for Seattle, \"LOX\" for Los Angeles). Returned as the \"office\" field in nws_get_forecast output."
    },
    "product_type": {
      "description": "Product type code. AFD (Area Forecast Discussion) — meteorological reasoning, model analysis, forecaster confidence. HWO (Hazardous Weather Outlook) — 1-7 day outlook for severe weather, flooding, winter weather. ZFP (Zone Forecast Product) — detailed zone-by-zone text forecast. SPS (Special Weather Statement) — short-fuse advisory for notable non-warning weather.",
      "default": "AFD",
      "type": "string",
      "enum": [
        "AFD",
        "HWO",
        "ZFP",
        "SPS"
      ]
    }
  },
  "required": [
    "office"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "issuanceTime": {
      "type": "string",
      "description": "When the product was issued (ISO 8601), e.g., \"2026-05-30T10:33:00+00:00\"."
    },
    "issuingOffice": {
      "type": "string",
      "description": "Issuing office call sign (e.g., \"KSEW\"). Includes the K/P prefix, unlike the input office code."
    },
    "productCode": {
      "type": "string",
      "description": "Product type code (e.g., \"AFD\")."
    },
    "productName": {
      "type": "string",
      "description": "Full product name (e.g., \"Area Forecast Discussion\")."
    },
    "productText": {
      "type": "string",
      "description": "Full narrative product text as issued by the forecaster. AFDs are typically 1,000-3,000 words covering synoptic setup, model guidance, and period-by-period reasoning."
    },
    "wmoCollectiveId": {
      "type": "string",
      "description": "WMO collective identifier (e.g., \"FXUS66\"). Identifies the product family in international message routing."
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `no_products`: Office code is unknown, or a valid office has no current product of the requested type (episodic types like SPS and HWO are commonly empty). Other values are possible when a failure originates below the handler.",
              "examples": [
                "no_products"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "issuanceTime",
        "issuingOffice",
        "productCode",
        "productName",
        "productText",
        "wmoCollectiveId"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}
🟢nws_get_zone_forecast(zone_id)

Get the text forecast for a public NWS forecast zone. Returns named forecast periods (e.g., "Today", "Tonight", "Monday") with detailed narrative text — the human-readable, zone-level forecast written by local forecasters. Completes the alert-to-forecast chain: nws_search_alerts returns each affected zone in "affectedZones" as a code plus a type, and nws_find_stations returns codes in the "forecastZone" column. Only affectedZones entries with type "forecast" work here; entries typed "county" or "fire" have no text forecast upstream and will not resolve, and neither do marine forecast zones (e.g., "PZZ251", "GMZ056"). Zone codes follow the pattern XXZ### (e.g., "WAZ315" for Western Washington lowlands).

Esquema de entrada

{
  "type": "object",
  "properties": {
    "zone_id": {
      "type": "string",
      "minLength": 1,
      "description": "NWS public forecast zone code (e.g., \"WAZ315\" for the Western Washington lowlands including Seattle). Returned as \"forecastZone\" by nws_get_forecast and nws_find_stations, or as the \"code\" of an \"affectedZones\" entry with type \"forecast\" in nws_search_alerts. Format: two-letter state + \"Z\" + three-digit number."
    }
  },
  "required": [
    "zone_id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false
}

Esquema de salida

{
  "type": "object",
  "properties": {
    "zoneId": {
      "type": "string",
      "description": "Zone ID, uppercased (e.g., \"WAZ315\" for input \"waz315\")."
    },
    "updated": {
      "type": "string",
      "description": "When the zone forecast was last updated (ISO 8601 with timezone offset)."
    },
    "periods": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "number": {
            "type": "number",
            "description": "Period sequence number, starting at 1."
          },
          "name": {
            "type": "string",
            "description": "Period name (e.g., \"Today\", \"Tonight\", \"Monday\")."
          },
          "detailedForecast": {
            "type": "string",
            "description": "Full narrative forecast for this period, written by local forecasters (e.g., \"Partly cloudy. Highs in the upper 60s. Southwest winds 10 to 15 mph.\")."
          }
        },
        "required": [
          "number",
          "name",
          "detailedForecast"
        ],
        "additionalProperties": false,
        "description": "Single forecast period with name and narrative"
      },
      "description": "Forecast periods in chronological order, typically covering 7 days."
    },
    "periodCount": {
      "type": "number",
      "description": "Number of forecast periods returned."
    },
    "error": {
      "description": "Present when the call failed. Absent on success.",
      "type": "object",
      "properties": {
        "code": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991,
          "description": "JSON-RPC error code for this failure."
        },
        "message": {
          "type": "string",
          "description": "Human-readable description of what went wrong."
        },
        "data": {
          "type": "object",
          "properties": {
            "reason": {
              "type": "string",
              "description": "Machine-readable failure mode. Declared by this tool: `zone_not_found`: Zone code is not a valid public forecast zone. `zone_forecast_unavailable`: Zone is a valid public forecast zone, but NWS has no text forecast for it. `marine_forecast_unsupported`: Zone is a marine forecast zone, for which NWS publishes no text forecast. Other values are possible when a failure originates below the handler.",
              "examples": [
                "zone_not_found",
                "zone_forecast_unavailable",
                "marine_forecast_unsupported"
              ]
            },
            "recovery": {
              "description": "Actionable next step for the caller.",
              "type": "object",
              "properties": {
                "hint": {
                  "type": "string"
                }
              },
              "required": [
                "hint"
              ],
              "additionalProperties": {}
            },
            "retryable": {
              "description": "Whether retrying may succeed.",
              "type": "boolean"
            }
          },
          "additionalProperties": {}
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": {}
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "additionalProperties": false,
  "anyOf": [
    {
      "not": {
        "required": [
          "error"
        ]
      },
      "required": [
        "zoneId",
        "updated",
        "periods",
        "periodCount"
      ]
    },
    {
      "required": [
        "error"
      ]
    }
  ]
}

Comunidad

Califica este servidor

Evidencia

Observaciones recientes

verificadoversión no registrada9 herramientas
verificadoversión no registrada7 herramientas
verificadoversión no registrada7 herramientas