Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,545Letters: 14Defects: 1,324counted 3 min ago
teppi

Server definition

Hash
sha256:96a6acb012f677a2d7f272757183520675262453bb4864dff9dd33a89f8a26f3
What it is
What a remote MCP server returned when asked what it offers: 5 tools

The blob, as servednamed by its sha256

{ "instructions": "Aviation weather from the NWS Aviation Weather Center (aviationweather.gov). Keyless, no API key required. Covers METARs, TAFs, PIREPs, and domestic SIGMETs. AIRMETs are not served — aviation_get_advisories rejects a request for one rather than answering it with SIGMETs.\nIMPORTANT: This data is for informational purposes only. Flight operations in IMC or controlled airspace require an official preflight briefing from an authorized source (e.g., 1800wxbrief.com).\nStation IDs are ICAO format (4 uppercase letters or digits, e.g. KSEA, KJFK, K0S9). Use aviation_find_stations to resolve unknown IDs or discover stations in a region.", "tools": [ { "description": "Resolve an airport or weather reporting station by its identifier, or discover stations within a bounding box or US state. Returns all identifier variants (ICAO/IATA/FAA), coordinates, elevation, and available data types (METAR, TAF, SYNOP, etc.). A lookup matches the registry's own identifier, which for an airport is its 4-character ICAO ID (e.g., KSEA, KJFK, K0S9); buoys and mesonet sites carry identifiers of other shapes and resolve by those. At least one of station_ids, bbox, or state is required. limit bounds how many stations an area search returns without changing the area searched, and belongs to the bbox and state modes only.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "bbox": { "description": "Geographic bounding box for spatial queries.", "properties": { "maxLat": { "description": "Northern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "maxLon": { "description": "Eastern boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" }, "minLat": { "description": "Southern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "minLon": { "description": "Western boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" } }, "required": [ "minLat", "minLon", "maxLat", "maxLon" ], "type": "object" }, "limit": { "description": "Maximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last — so the same query with the same limit returns the same stations, and airports rather than unidentified sites lead the first page. It bounds the response without changing the area searched, which a smaller bbox or a different state would. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox and state modes; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every match. Optional.", "maximum": 400, "minimum": 1, "type": "integer" }, "state": { "description": "Two-letter USPS code for one of the 50 US states or DC (e.g., \"WA\") to list all stations in that jurisdiction. US territories are not supported — use bbox for those.", "maxLength": 2, "minLength": 2, "type": "string" }, "station_ids": { "description": "One or more station identifiers (e.g., KSEA, KJFK). A lookup matches the registry's own identifier: a 4-character ICAO ID for an airport (e.g., KSEA, K0S9), and other shapes for the buoys and mesonet sites the registry also carries, which resolve by those. A 3-letter IATA code (e.g., SEA) never resolves, even for a station whose entry carries one. Whitespace around an entry is trimmed, so a padded identifier resolves the same as the bare one; an empty or whitespace-only entry is rejected. Use bbox or state to discover identifiers by location.", "items": { "description": "One station identifier (e.g., KSEA).", "pattern": "\\S", "type": "string" }, "maxItems": 20, "minItems": 1, "type": "array" } }, "type": "object" }, "name": "aviation_find_stations", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "stations", "truncated", "shown" ] }, { "required": [ "error" ] } ], "properties": { "cap": { "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.", "type": "number" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `station_not_found`: None of the requested IDs match any known station, or the bbox or state search found none. `missing_search_criteria`: None of station_ids, bbox, or state was provided. `conflicting_location`: More than one of station_ids, bbox, or state was provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `invalid_state`: The state code is not one of the 50 US states or DC. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `upstream_rejected`: The AWC station registry rejected the request as malformed rather than answering it. Other values are possible when a failure originates below the handler.", "examples": [ "station_not_found", "missing_search_criteria", "conflicting_location", "invalid_bbox", "invalid_state", "conflicting_limit", "upstream_rejected" ], "type": "string" }, "recovery": { "additionalProperties": {}, "description": "Actionable next step for the caller.", "properties": { "hint": { "type": "string" } }, "required": [ "hint" ], "type": "object" }, "retryable": { "description": "Whether retrying may succeed.", "type": "boolean" } }, "type": "object" }, "message": { "description": "Human-readable description of what went wrong.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "limited": { "description": "True when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching station is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest.", "type": "boolean" }, "matched": { "description": "Stations that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the search area — the stations the cap dropped were never examined, so no count can include them.", "type": "number" }, "missing": { "description": "Requested identifiers absent from the result. Deduplicated the way returned is: a repeated or differently-cased identifier appears once, under its first spelling. Absent when none are missing.", "items": { "description": "A requested identifier that resolved to no station.", "type": "string" }, "type": "array" }, "notice": { "description": "Guidance for whichever disclosures fired: the lever that narrows a truncated draw, what a requested limit withheld, that limit bounds the response without changing the area searched (on a bbox or state result of more than 130 stations from a call that set no limit), or the cause and fix for identifiers that resolved to nothing. The cap and either limit statement can fire on one result, and the text keeps them apart; the reconciliation cannot join them, since only bbox and state reach the row cap or take a limit, and only station_ids reconciles a request.", "type": "string" }, "partial": { "description": "True when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish — upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup.", "type": "boolean" }, "requested": { "description": "Station identifiers this call asked for, spelled as the caller wrote them and in the order given. Present only on a station_ids lookup — the bbox and state modes ask for an area, not a list.", "items": { "description": "A station identifier as requested.", "type": "string" }, "type": "array" }, "returned": { "description": "Requested identifiers that resolved, spelled as the caller wrote them rather than as upstream returned them. Deduplicated the way upstream deduplicates: a repeated or differently-cased identifier appears once, under its first spelling. Present only on a station_ids lookup.", "items": { "description": "A requested identifier that resolved to a station.", "type": "string" }, "type": "array" }, "shown": { "description": "Stations in this result, counted after any client-side state filter and after any limit.", "type": "number" }, "stations": { "description": "Matching stations.", "items": { "additionalProperties": false, "description": "An aviation weather reporting station.", "properties": { "country": { "description": "Country code or name.", "type": "string" }, "data_types": { "description": "List of data products available at this station.", "items": { "description": "An available data type (e.g., \"METAR\", \"TAF\", \"SYNOP\").", "type": "string" }, "type": "array" }, "elevation_ft": { "description": "Station elevation in feet MSL. 0 is a sea-level site; null means no elevation is on file upstream, so it is unknown.", "type": [ "number", "null" ] }, "faa_id": { "description": "FAA identifier, or null if not assigned.", "type": [ "string", "null" ] }, "iata_id": { "description": "IATA 3-letter code, or null if not assigned.", "type": [ "string", "null" ] }, "icao_id": { "description": "ICAO station ID, 4 uppercase letters or digits (e.g., KSEA, K0S9), or null if not assigned.", "type": [ "string", "null" ] }, "lat": { "description": "Latitude in decimal degrees.", "type": "number" }, "lon": { "description": "Longitude in decimal degrees.", "type": "number" }, "name": { "description": "Human-readable site name.", "type": "string" }, "state": { "description": "US state abbreviation, or empty string for non-US stations.", "type": "string" } }, "required": [ "icao_id", "iata_id", "faa_id", "name", "lat", "lon", "elevation_ft", "state", "country", "data_types" ], "type": "object" }, "type": "array" }, "truncated": { "description": "True when the upstream draw hit the AWC row cap, so stations inside the search area are missing from this result. False affirms the area was drawn in full, which a count alone cannot establish.", "type": "boolean" }, "upstreamRows": { "description": "Rows AWC returned before the client-side state filter ran. Present only on a truncated state query the filter then narrowed, where the post-filter count sits below the cap and so cannot reveal the truncation on its own.", "type": "number" } }, "type": "object" } }, { "description": "Get active domestic SIGMETs for a region. Returns each advisory with hazard type (CONVECTIVE, TURBULENCE, ICING, IFR), severity, altitude range, valid period, polygon coordinates, and raw text. Coverage is US-centric (NWS Aviation Weather Center). This tool reads the domestic SIGMET feed only and cannot return an AIRMET; requests for one are rejected rather than answered with SIGMETs. During fair-weather periods no advisories may be active — an empty result is normal, not an error. Filter by advisory_type, hazard, or bbox.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "advisory_type": { "default": "all", "description": "Filter by advisory type. \"sigmet\" and \"all\" both return the active domestic SIGMET set, which is everything this tool serves. \"airmet\" is rejected with guidance: the upstream feed cannot return an AIRMET, so answering it would mean presenting SIGMETs as AIRMET matches.", "enum": [ "sigmet", "airmet", "all" ], "type": "string" }, "bbox": { "description": "Geographic bounding box to filter advisories by polygon overlap.", "properties": { "maxLat": { "description": "Northern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "maxLon": { "description": "Eastern boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" }, "minLat": { "description": "Southern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "minLon": { "description": "Western boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" } }, "required": [ "minLat", "minLon", "maxLat", "maxLon" ], "type": "object" }, "hazard": { "description": "Optional hazard filter, applied upstream by AWC. CONVECTIVE, TURBULENCE, ICING, and IFR are the four hazard classes the domestic SIGMET feed carries, and an empty result under one of them means no advisory of that class is active — it says nothing about the others. MTN OBSCN, SURFACE WIND, and LLWS are AIRMET-family phenomena with no upstream counterpart here and are rejected rather than returning an empty result.", "enum": [ "CONVECTIVE", "TURBULENCE", "ICING", "IFR", "MTN OBSCN", "SURFACE WIND", "LLWS" ], "type": "string" } }, "type": "object" }, "name": "aviation_get_advisories", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "advisories" ] }, { "required": [ "error" ] } ], "properties": { "advisories": { "description": "Active advisories matching the filter criteria. May be empty during fair weather periods.", "items": { "additionalProperties": false, "description": "An active SIGMET advisory.", "properties": { "advisory_type": { "description": "Advisory type as issued. The domestic SIGMET feed this tool reads emits SIGMET.", "type": "string" }, "altitude_high_ft": { "description": "Upper altitude bound in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "altitude_low_ft": { "description": "Lower altitude bound in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "hazard": { "description": "Hazard type — one of CONVECTIVE, TURBULENCE, ICING, or IFR.", "type": "string" }, "issued_by": { "description": "ICAO ID of the issuing meteorological watch office.", "type": "string" }, "movement": { "anyOf": [ { "additionalProperties": false, "properties": { "direction_deg": { "description": "Movement direction in degrees true, or null if stationary.", "type": [ "number", "null" ] }, "speed_kt": { "description": "Movement speed in knots, or null if stationary.", "type": [ "number", "null" ] } }, "required": [ "direction_deg", "speed_kt" ], "type": "object" }, { "type": "null" } ], "description": "System movement vector, or null if not available." }, "polygon": { "description": "Geographic boundary of the advisory as a polygon of lat/lon points.", "items": { "additionalProperties": false, "description": "A polygon vertex as a lat/lon coordinate pair.", "properties": { "lat": { "description": "Latitude in decimal degrees.", "type": "number" }, "lon": { "description": "Longitude in decimal degrees.", "type": "number" } }, "required": [ "lat", "lon" ], "type": "object" }, "type": "array" }, "raw_text": { "description": "Original encoded SIGMET text as issued by the meteorological watch office.", "type": "string" }, "series_id": { "description": "Unique advisory identifier (e.g., BOSMA0).", "type": "string" }, "severity": { "description": "Severity integer for convective SIGMETs (higher = more intense). Null when the advisory stated none.", "type": [ "number", "null" ] }, "valid_from": { "description": "Advisory validity start time in ISO 8601 format (UTC).", "type": "string" }, "valid_to": { "description": "Advisory validity end time in ISO 8601 format (UTC).", "type": "string" } }, "required": [ "advisory_type", "series_id", "hazard", "severity", "issued_by", "valid_from", "valid_to", "altitude_low_ft", "altitude_high_ft", "movement", "polygon", "raw_text" ], "type": "object" }, "type": "array" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `airmet_not_served`: advisory_type \"airmet\" was requested, or a hazard filter naming an AIRMET-family phenomenon (MTN OBSCN, SURFACE WIND, LLWS) with no counterpart on the SIGMET feed. Other values are possible when a failure originates below the handler.", "examples": [ "invalid_bbox", "airmet_not_served" ], "type": "string" }, "recovery": { "additionalProperties": {}, "description": "Actionable next step for the caller.", "properties": { "hint": { "type": "string" } }, "required": [ "hint" ], "type": "object" }, "retryable": { "description": "Whether retrying may succeed.", "type": "boolean" } }, "type": "object" }, "message": { "description": "Human-readable description of what went wrong.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "notice": { "description": "Present only when the result is empty, naming the stage that emptied it: no domestic SIGMETs are active at all, none carry the requested hazard, or none intersect the requested bbox — and which filter to broaden. A hazard-scoped empty draw states only that no advisory carries that hazard; AWC applies the hazard filter, so the response cannot say whether other classes are active.", "type": "string" } }, "type": "object" } }, { "description": "Get current weather observations (METARs) for named airports, or survey every reporting station inside a geographic area. Returns decoded fields — wind direction/speed/gusts, visibility, ceiling with its kind (measured, or indefinite for vertical visibility into an obscuration), present weather, temperature, dewpoint, altimeter, cloud layers — plus the computed flight category (VFR/MVFR/IFR/LIFR) and the raw METAR string. Requires either station_ids (1–10 ICAO IDs, e.g., KSEA, KJFK, K0S9) or bbox (area survey) — not both. station_ids returns every observation inside the hours window; bbox returns the latest observation per station in the box, with flight_category keeping only the stations in the categories named (e.g., IFR and LIFR) and limit bounding how many stations come back. Use aviation_find_stations to resolve or verify an ICAO ID, or to discover nearby stations.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "bbox": { "description": "Geographic bounding box for an area observation survey.", "properties": { "maxLat": { "description": "Northern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "maxLon": { "description": "Eastern boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" }, "minLat": { "description": "Southern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "minLon": { "description": "Western boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" } }, "required": [ "minLat", "minLon", "maxLat", "maxLon" ], "type": "object" }, "flight_category": { "description": "Return only the stations whose flight category is one of these (e.g., [\"IFR\", \"LIFR\"] to find where conditions are poor). Applied in the tool after the draw is reduced to the latest observation per station and before limit, so it changes which stations come back, not what AWC draws or the upstream row cap. A station AWC could not rate (flight_category \"unknown\") never matches. Belongs to the bbox mode; supplying it alongside station_ids is rejected, since each named station already reports its own category. Optional.", "items": { "description": "A flight category: VFR, MVFR, IFR, or LIFR.", "enum": [ "VFR", "MVFR", "IFR", "LIFR" ], "type": "string" }, "minItems": 1, "type": "array" }, "hours": { "default": 1, "description": "Lookback window in hours (1–12), not a row limit. With station_ids every observation inside the window is returned, so a station reporting more often than hourly yields more than one row per hour: at the default of 1, half-hourly stations return two observations and SPECI-issuing stations can return more, so budget rows by the station reporting interval, never one per station. With bbox the result is reduced to the latest observation per station, but the window still shapes the draw the upstream row cap applies to — a wide window spends that cap on repeat readings from busy stations instead of on more stations, so lower it before narrowing the box.", "maximum": 12, "minimum": 1, "type": "integer" }, "limit": { "description": "Maximum stations to return, applied after the draw is reduced to the latest observation per station, after any flight_category filter, and ordered by station ID ascending — so the same query with the same limit returns the same stations. It bounds the response without changing the area searched, which a smaller bbox would, and it keeps an alphabetical slice rather than a region or a condition. Distinct from the 400-row upstream cap: a limited result examined every station it counted and withheld some, while a capped one never drew the rest. Belongs to the bbox mode; supplying it alongside station_ids is rejected, since that mode already names the set. Omit to return every station in the box. Optional.", "maximum": 400, "minimum": 1, "type": "integer" }, "station_ids": { "description": "ICAO station IDs to query. 1–10 stations per call, and every observation inside the hours window is returned for each. Supplying it alongside bbox is rejected — use bbox to ask about an area rather than a named set.", "items": { "description": "ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K0S9).", "pattern": "^[A-Z0-9]{4}$", "type": "string" }, "maxItems": 10, "minItems": 1, "type": "array" } }, "type": "object" }, "name": "aviation_get_metar", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "observations" ] }, { "required": [ "error" ] } ], "properties": { "cap": { "description": "The upstream row maximum that was applied to the draw. Present only on a truncated result.", "type": "number" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `no_stations_found`: No station returned METAR data — none of the requested IDs, or no station inside the bounding box. `missing_location`: Neither station_ids nor bbox was provided. `conflicting_location`: Both station_ids and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_limit`: limit was provided together with station_ids, where the caller has already named the set. `conflicting_flight_category`: flight_category was provided together with station_ids, where the caller has already named the set. Other values are possible when a failure originates below the handler.", "examples": [ "no_stations_found", "missing_location", "conflicting_location", "invalid_bbox", "conflicting_limit", "conflicting_flight_category" ], "type": "string" }, "recovery": { "additionalProperties": {}, "description": "Actionable next step for the caller.", "properties": { "hint": { "type": "string" } }, "required": [ "hint" ], "type": "object" }, "retryable": { "description": "Whether retrying may succeed.", "type": "boolean" } }, "type": "object" }, "message": { "description": "Human-readable description of what went wrong.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "limited": { "description": "True when the requested limit withheld stations that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every station drawn is here. Present only when a bbox survey supplied a limit. It never states anything about the upstream cap: a limited result examined every station it counted, while a truncated one never drew the rest.", "type": "boolean" }, "matched": { "description": "Stations the draw held before the limit selected from them — after the flight_category filter, where one was supplied. Present only on a limited result. Where the result is also truncated this counts the capped draw and not the box — the observations the cap dropped were never examined, so no count can include them.", "type": "number" }, "missing": { "description": "Requested station IDs absent from the result. Absent when none are missing.", "items": { "description": "A requested ICAO station ID that produced no observation.", "type": "string" }, "type": "array" }, "notice": { "description": "Guidance for whichever disclosures fired, in this order: the levers that narrow a truncated draw; what the flight_category filter kept of the stations surveyed, or that it emptied the result; what a requested limit withheld; and — on a survey of more than 40 stations from a call that set no limit — that limit bounds the response but keeps an alphabetical slice, not a region. Or, on a station_ids lookup, the station IDs that returned nothing. The survey statements share one notice and the text keeps them apart; the reconciliation cannot join them, since only bbox reaches the row cap or takes a filter or a limit, and only station_ids reconciles a request.", "type": "string" }, "observations": { "description": "Weather observations. With station_ids, one per station/time pair — multiple entries per station when the hours window holds more than one observation. With bbox, one per station: the latest observation inside that window.", "items": { "additionalProperties": false, "description": "A single weather observation from one station at one time.", "properties": { "altimeter_inhg": { "description": "Altimeter setting in inches of mercury, or null when the observation carried no altimeter group (common at stations reporting sea-level pressure only).", "type": [ "number", "null" ] }, "ceiling_ft": { "description": "Ceiling in feet AGL — the lowest broken, overcast, or obscuration layer. Per FAA AIM 7-1-29 the ceiling is the lowest broken or overcast layer, or the vertical visibility into an obscuration; few and scattered layers are never ceilings. Null in two cases that are not the same: the observation reported no such layer, or it reported an obscuration whose vertical visibility the station could not determine (a VV/// group), where the ceiling exists and only its height is missing. A sky_condition of OVX marks the second.", "type": [ "number", "null" ] }, "ceiling_type": { "anyOf": [ { "enum": [ "measured", "indefinite" ], "type": "string" }, { "type": "null" } ], "description": "How the ceiling height was determined: \"measured\" for a broken or overcast layer base, \"indefinite\" for vertical visibility into an obscuration (an OVX layer). Null exactly when ceiling_ft is null." }, "clouds": { "description": "Cloud layers from lowest to highest, as AWC decoded them — at most four, so a fifth or higher reported layer is left out with no marker and raw_metar is the complete source. Empty whenever the observation published no layer heights, which covers a clear sky, an obscuration with no determinable height, and an observation that reported no sky condition at all; sky_condition distinguishes them. An empty array is not a clear sky on its own.", "items": { "additionalProperties": false, "description": "A reported cloud layer.", "properties": { "base_ft": { "description": "Cloud base altitude in feet AGL.", "type": "number" }, "cover": { "description": "Sky cover code: FEW, SCT, BKN, OVC, SKC, CLR, CAVOK, or OVX. OVX is the decoded form of a VVhhh group — the sky is obscured and the base is the vertical visibility into it, not a cloud bottom.", "type": "string" } }, "required": [ "cover", "base_ft" ], "type": "object" }, "type": "array" }, "dewpoint_c": { "description": "Dewpoint in degrees Celsius. 0 is a real reading; null means the observation carried no dewpoint, so it is unknown.", "type": [ "number", "null" ] }, "elevation_ft": { "description": "Station elevation in feet MSL.", "type": "number" }, "flight_category": { "description": "Flight category: VFR, MVFR, IFR, or LIFR based on ceiling and visibility.", "type": "string" }, "lat": { "description": "Station latitude in decimal degrees.", "type": "number" }, "lon": { "description": "Station longitude in decimal degrees.", "type": "number" }, "metar_type": { "description": "METAR (routine) or SPECI (special observation triggered by significant weather change).", "type": "string" }, "name": { "description": "Human-readable station or airport name.", "type": "string" }, "observed_at": { "description": "Observation time in ISO 8601 format (UTC).", "type": "string" }, "present_weather": { "anyOf": [ { "additionalProperties": false, "properties": { "decoded": { "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"fog\", \"light rain showers; mist\"). A group the decoder does not recognize is carried through as its own raw token rather than half-translated, so compare against raw when a reading still looks coded.", "type": "string" }, "raw": { "description": "Weather groups exactly as encoded, space-delimited (e.g., \"FG\", \"-SHRA\", \"VCTS -RA\").", "type": "string" } }, "required": [ "raw", "decoded" ], "type": "object" }, { "type": "null" } ], "description": "Present weather at the station, or null when the observation carried no weather group (a dry, unobscured day)." }, "raw_metar": { "description": "Original encoded METAR string (e.g., \"KSEA 041453Z 18006KT 10SM FEW035 09/03 A2991\").", "type": "string" }, "sky_condition": { "description": "The sky condition the observation stated when it published no layer heights: CLR, SKC, or CAVOK for a clear or insignificant-cloud report, OVX for an obscuration whose layer carried no height (a VV/// group, and the opposite of clear). Null when clouds carries layers — those are the statement — and also when the observation carried no sky-condition group at all. An empty clouds array beside a null here is an unreported sky, never a clear one.", "type": [ "string", "null" ] }, "station_id": { "description": "ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K0S9).", "type": "string" }, "temp_c": { "description": "Temperature in degrees Celsius. 0 is a real reading; null means the observation carried no temperature, so it is unknown.", "type": [ "number", "null" ] }, "visibility_sm": { "description": "Prevailing visibility in statute miles (e.g., \"10+\", \"3\", \"1/2\"), or the string \"unknown\" when the observation carried no visibility group. \"unknown\" is not a measurement and carries no unit.", "type": "string" }, "wind": { "additionalProperties": false, "description": "Wind conditions at the station.", "properties": { "direction_deg": { "description": "Wind direction in degrees true. Null when the observation reported a variable wind (VRB), and also when it carried no wind group at all — speed_kt is a number in the first case and null in the second.", "type": [ "number", "null" ] }, "gust_kt": { "description": "Gust speed in knots, or null if no gusts reported.", "type": [ "number", "null" ] }, "speed_kt": { "description": "Wind speed in knots. 0 is calm (a reported 00000KT); null means the observation carried no wind group, so the speed is unknown.", "type": [ "number", "null" ] } }, "required": [ "direction_deg", "speed_kt", "gust_kt" ], "type": "object" } }, "required": [ "station_id", "name", "lat", "lon", "elevation_ft", "flight_category", "metar_type", "observed_at", "wind", "visibility_sm", "ceiling_ft", "ceiling_type", "clouds", "sky_condition", "present_weather", "temp_c", "dewpoint_c", "altimeter_inhg", "raw_metar" ], "type": "object" }, "type": "array" }, "partial": { "description": "True when a requested station produced no observation. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count. Present only on a station_ids lookup.", "type": "boolean" }, "requested": { "description": "Station IDs this call asked for, in the order given. Present only on a station_ids lookup — a bbox survey asks for an area, not a list.", "items": { "description": "An ICAO station ID as requested.", "type": "string" }, "type": "array" }, "returned": { "description": "Distinct station IDs that produced at least one observation. Counted per station, not per row — with hours > 1 a station reporting six times still appears once. Present only on a station_ids lookup.", "items": { "description": "An ICAO station ID present in the result.", "type": "string" }, "type": "array" }, "shown": { "description": "Stations in this result, counted after the reduction to one observation per station, after any flight_category filter, and after any limit. Present only on a bbox survey.", "type": "number" }, "surveyed": { "description": "Stations the survey reached — one per station, the latest observation of each — before the flight_category filter selected from them. Present only when a bbox survey supplied flight_category; the count after the filter is shown, or matched where a limit then withheld stations. Where the result is also truncated this counts the capped draw and not the box.", "type": "number" }, "truncated": { "description": "True when the upstream draw hit the AWC row cap, so stations inside the box are missing from this result. False says the draw did not reach that cap, which a count alone cannot establish — the draw is reduced to one row per station, so the returned count sits far below the cap either way. It is not a completeness claim: AWC also thins a dense box by station priority, independently of the cap and with nothing in the response to mark it, so re-run over smaller quadrants and union the results when the box must be complete. Present only on a bbox survey.", "type": "boolean" }, "upstreamRows": { "description": "Observations AWC returned before the reduction to one row per station. Present only on a truncated draw the reduction then narrowed, where the station count sits below the cap and so cannot reveal the truncation on its own.", "type": "number" } }, "type": "object" } }, { "description": "Get recent Pilot Reports (PIREPs) near an airport or within a bounding box. Returns decoded turbulence, icing, and cloud reports with altitude, aircraft type, intensity, outside air temperature, wind aloft, flight weather, and the raw PIREP string. Requires either station_id (ICAO center point for radial search, e.g., KSEA) or bbox (area search) — not both. distance_nm belongs to the station_id search only, and altitude_min_ft must not exceed altitude_max_ft. min_intensity restricts the result to reports carrying a turbulence or icing layer at that intensity or above. limit bounds how many reports come back without changing what is searched, keeping the most recent. Coverage is US-centric; PIREPs are sparse and absence of reports does not imply smooth conditions.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "altitude_max_ft": { "description": "Filter by maximum altitude in feet MSL (e.g., 35000 for FL350), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional.", "maximum": 60000, "minimum": 0, "type": "integer" }, "altitude_min_ft": { "description": "Filter by minimum altitude in feet MSL (e.g., 18000 for FL180), from 0 to 60000 ft — AWC searches no band below sea level, and none centred above FL600, which is already above the altitude any pilot report carries. Reports with an unknown altitude (altitude_ft null) cannot be shown to satisfy a bound and are dropped whenever either bound is set. Optional.", "maximum": 60000, "minimum": 0, "type": "integer" }, "bbox": { "description": "Geographic bounding box for area PIREP search.", "properties": { "maxLat": { "description": "Northern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "maxLon": { "description": "Eastern boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" }, "minLat": { "description": "Southern boundary latitude in decimal degrees.", "maximum": 90, "minimum": -90, "type": "number" }, "minLon": { "description": "Western boundary longitude in decimal degrees.", "maximum": 180, "minimum": -180, "type": "number" } }, "required": [ "minLat", "minLon", "maxLat", "maxLon" ], "type": "object" }, "distance_nm": { "description": "Search radius in nautical miles around station_id, defaulting to 100 when omitted. Belongs to the station_id search only — supplying it alongside bbox is rejected.", "maximum": 500, "minimum": 10, "type": "integer" }, "hours": { "default": 3, "description": "How many hours of history to return. Default 3.", "maximum": 12, "minimum": 1, "type": "integer" }, "limit": { "description": "Maximum reports to return, applied last — after every filter and after ordering by observation time descending, so a limited result is the most recent reports rather than an arbitrary slice. It bounds the response without changing what is searched, which every other parameter does. Distinct from the 400-row upstream cap: a limited result examined every report it counted and withheld some, while a capped one never drew the rest. Selection is by recency alone, so pair it with min_intensity to bound a result by severity. Omit to return every match. Optional.", "maximum": 400, "minimum": 1, "type": "integer" }, "min_intensity": { "description": "Return only reports carrying at least one turbulence or icing layer at this intensity or above. The filter selects reports, not layers — a matching report still carries its lighter layers, so a result may include NEG, TRC, or LGT entries alongside the layer that matched. Optional.", "enum": [ "lgt", "mod", "sev" ], "type": "string" }, "station_id": { "description": "ICAO station ID as center point for radial search — 4 uppercase letters or digits (e.g., KSEA, K0S9). Use with distance_nm.", "pattern": "^[A-Z0-9]{4}$", "type": "string" } }, "type": "object" }, "name": "aviation_get_pireps", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "pireps", "truncated", "shown" ] }, { "required": [ "error" ] } ], "properties": { "cap": { "description": "The upstream row maximum that was applied to the page. Present only on a truncated result.", "type": "number" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `no_pireps_found`: No pilot reports found in the search area and time window. `station_not_recognized`: AWC does not recognize station_id as a PIREP search center — a closed or retired airport, for example — and rejects the request. `missing_location`: Neither station_id nor bbox was provided. `conflicting_location`: Both station_id and bbox were provided. `invalid_bbox`: The bounding box is inverted — minLat > maxLat or minLon > maxLon. `conflicting_distance`: distance_nm was provided together with bbox, where a search radius has no meaning. `invalid_altitude_range`: altitude_min_ft is greater than altitude_max_ft, so no report can match both bounds. Other values are possible when a failure originates below the handler.", "examples": [ "no_pireps_found", "station_not_recognized", "missing_location", "conflicting_location", "invalid_bbox", "conflicting_distance", "invalid_altitude_range" ], "type": "string" }, "recovery": { "additionalProperties": {}, "description": "Actionable next step for the caller.", "properties": { "hint": { "type": "string" } }, "required": [ "hint" ], "type": "object" }, "retryable": { "description": "Whether retrying may succeed.", "type": "boolean" } }, "type": "object" }, "message": { "description": "Human-readable description of what went wrong.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "limited": { "description": "True when the requested limit withheld reports that matched — the caller asked to see fewer of them. False affirms the limit did not bite, so every matching report is here. Present only when the call supplied a limit. It never states anything about the upstream cap: a limited result examined every report it counted, while a truncated one never drew the rest.", "type": "boolean" }, "matched": { "description": "Reports that matched this query before the limit selected from them. Present only on a limited result. Where the result is also truncated this counts the capped page and not the search area — the reports the cap dropped were never examined, so no count can include them.", "type": "number" }, "notice": { "description": "Guidance for whichever disclosures fired: the levers that narrow the query before the cap applies, what a requested limit withheld, and — on a result of more than 50 reports from a call that set no limit — that limit bounds the response without changing what is searched, keeping the most recent. The cap and either limit statement can fire on one result, and the text keeps them apart.", "type": "string" }, "pireps": { "description": "Pilot reports matching the search criteria, ordered by observation time descending.", "items": { "additionalProperties": false, "description": "A single Pilot Report (PIREP) with decoded hazard information.", "properties": { "aircraft_type": { "description": "Aircraft type designator (e.g., B737, C172), or null if not reported.", "type": [ "string", "null" ] }, "altitude_ft": { "description": "Reported altitude in feet MSL, or null when the raw flight-level group carries no usable altitude. That covers /FLUNKN/ and the during-climb and during-descent markers, and equally any other group AWC could not read — including one made only of digits, such as /FL2130/. A raw /FL000/ is a reported flight level of zero and returns 0.", "type": [ "number", "null" ] }, "clouds": { "anyOf": [ { "items": { "additionalProperties": false, "description": "A cloud layer, whose base and top are each present only if reported.", "properties": { "base_ft": { "description": "Cloud base altitude in feet MSL, or null if the pilot reported no base.", "type": [ "number", "null" ] }, "cover": { "description": "Cloud cover code: FEW, SCT, BKN, OVC, SKC, or CLR. SKC and CLR state a clear sky and never carry a base or top. The field also carries the flight-condition markers VMC and IMC, which describe the flight environment rather than a cloud layer and arrive with no base or top.", "type": "string" }, "top_ft": { "description": "Cloud top altitude in feet MSL, or null if the pilot reported no top.", "type": [ "number", "null" ] } }, "required": [ "cover", "base_ft", "top_ft" ], "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "Cloud layers, or null if the PIREP carried no sky-condition group." }, "icing": { "description": "Icing layers the raw report carried. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no icing group, so the pilot said nothing either way. Layers AWC synthesized for a report that never mentioned ice are omitted rather than published.", "items": { "additionalProperties": false, "description": "A reported icing layer.", "properties": { "base_ft": { "description": "Icing layer base altitude in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "intensity": { "description": "Icing intensity (e.g., NEG, TRC, LGT, MOD, SEV).", "type": "string" }, "top_ft": { "description": "Icing layer top altitude in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "type": { "description": "Icing type (e.g., RIME, MIXED, CLEAR), or null if not reported.", "type": [ "string", "null" ] } }, "required": [ "base_ft", "top_ft", "intensity", "type" ], "type": "object" }, "type": "array" }, "lat": { "description": "Latitude of the PIREP location in decimal degrees.", "type": "number" }, "lon": { "description": "Longitude of the PIREP location in decimal degrees.", "type": "number" }, "observed_at": { "description": "Observation time in ISO 8601 format (UTC).", "type": "string" }, "pirep_type": { "description": "Report type: PIREP (pilot report) or AIREP (position report with wx).", "type": "string" }, "raw_pirep": { "description": "Original encoded PIREP string (e.g., \"SEA UA /OV KSEA/TM 1530/FL080/TP B737/TB LGT\").", "type": "string" }, "temp_c": { "description": "Outside air temperature in degrees Celsius at the report altitude, as AWC decoded it — the /TA group on a PIREP, the MS or PS temperature group on an AIREP. 0 is a real reading; null means the report carried none or gave it as unknown (/TA UNKN).", "type": [ "number", "null" ] }, "turbulence": { "description": "Turbulence layers reported. An explicit negative report is a layer with intensity NEG; an empty array means the PIREP carried no turbulence group, so the pilot said nothing either way.", "items": { "additionalProperties": false, "description": "A reported turbulence layer.", "properties": { "base_ft": { "description": "Turbulence layer base altitude in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "frequency": { "description": "Turbulence frequency (e.g., OCNL, CONT), or null if not reported.", "type": [ "string", "null" ] }, "intensity": { "description": "Turbulence intensity (e.g., NEG, LGT, LGT-MOD, MOD, SEV, EXTRM).", "type": "string" }, "top_ft": { "description": "Turbulence layer top altitude in feet MSL, or null if not specified.", "type": [ "number", "null" ] }, "type": { "description": "Turbulence type (e.g., CHOP, CAT), or null if not reported.", "type": [ "string", "null" ] } }, "required": [ "base_ft", "top_ft", "intensity", "type", "frequency" ], "type": "object" }, "type": "array" }, "visibility_sm": { "description": "In-flight visibility in statute miles, or null if not reported.", "type": [ "number", "null" ] }, "weather": { "anyOf": [ { "additionalProperties": false, "properties": { "decoded": { "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"heavy rain\", \"fog; light rain\"). A group the decoder does not recognize is carried through as its own raw token, so compare against raw when a reading still looks coded.", "type": "string" }, "raw": { "description": "Weather groups exactly as encoded, space-delimited (e.g., \"+RA\", \"FG -RA\").", "type": "string" } }, "required": [ "raw", "decoded" ], "type": "object" }, { "type": "null" } ], "description": "Flight weather AWC decoded from the /WX group, or null when it decoded no weather phenomena from it. A flight visibility AWC can read (FV07SM, 10SM) lands in visibility_sm instead. /WX text AWC cannot decode is dropped or trimmed — CEILING 017 returns null and RA FL300 AOB returns RA alone — so raw_pirep is the only source for it. This is not the /RM remarks text, which AWC does not decode either — raw_pirep carries it." }, "wind": { "anyOf": [ { "additionalProperties": false, "properties": { "direction_deg": { "description": "Wind direction aloft in degrees, as reported and not converted. A PIREP /WV group is referenced to magnetic north (AIM TBL 7-1-18), unlike the true-north METAR and TAF winds, so apply the local magnetic variation before combining a PIREP's direction with a true track; an AIREP's reference is not stated here.", "type": "number" }, "speed_kt": { "description": "Wind speed aloft in knots. 0 is a reported calm.", "type": "number" } }, "required": [ "direction_deg", "speed_kt" ], "type": "object" }, { "type": "null" } ], "description": "Wind aloft at the report altitude, as AWC decoded it — the /WV group on a PIREP, the direction/speed group (e.g., 291/035KT) on an AIREP. Null unless AWC decoded both direction and speed. AWC leaves some forms undecoded — a gust suffix (/WV 03020G30), a single-digit AIREP speed (252/9 KT), a variation (/WV +/- 5KT) — and those return null here, with raw_pirep as the only source." } }, "required": [ "observed_at", "lat", "lon", "altitude_ft", "aircraft_type", "pirep_type", "turbulence", "icing", "clouds", "visibility_sm", "temp_c", "wind", "weather", "raw_pirep" ], "type": "object" }, "type": "array" }, "shown": { "description": "Reports in this result, counted after any altitude filter and after any limit.", "type": "number" }, "truncated": { "description": "True when the upstream page hit the AWC row cap, so reports inside the search area and time window are missing from this result. False affirms the whole window was searched, which a count alone cannot establish.", "type": "boolean" }, "upstreamRows": { "description": "Reports AWC returned before the altitude filter ran. Present only on a truncated result the filter then narrowed, where the remaining count sits below the cap and so cannot reveal the truncation on its own.", "type": "number" } }, "type": "object" } }, { "description": "Get the Terminal Aerodrome Forecast (TAF) for one or more airports. Returns each forecast period with valid times, surface wind, low-level wind shear, visibility, decoded weather conditions, cloud layers, and the vertical visibility into a forecast obscuration, plus the raw TAF string. TAFs cover the next 24–30 hours and are issued only for airports with scheduled commercial service; check data_types from aviation_find_stations to confirm TAF availability. Accepts 1–4 ICAO station IDs (e.g., KSEA, KJFK, K36U).", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "station_ids": { "description": "ICAO station IDs to query. 1–4 stations per call.", "items": { "description": "ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K36U).", "pattern": "^[A-Z0-9]{4}$", "type": "string" }, "maxItems": 4, "minItems": 1, "type": "array" } }, "required": [ "station_ids" ], "type": "object" }, "name": "aviation_get_taf", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "forecasts", "requested", "returned", "partial" ] }, { "required": [ "error" ] } ], "properties": { "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `no_taf_available`: Station does not issue TAFs or no TAF is currently available. Other values are possible when a failure originates below the handler.", "examples": [ "no_taf_available" ], "type": "string" }, "recovery": { "additionalProperties": {}, "description": "Actionable next step for the caller.", "properties": { "hint": { "type": "string" } }, "required": [ "hint" ], "type": "object" }, "retryable": { "description": "Whether retrying may succeed.", "type": "boolean" } }, "type": "object" }, "message": { "description": "Human-readable description of what went wrong.", "type": "string" } }, "required": [ "code", "message" ], "type": "object" }, "forecasts": { "description": "TAF forecasts, one per requested station.", "items": { "additionalProperties": false, "description": "A Terminal Aerodrome Forecast for one station.", "properties": { "forecast_periods": { "description": "Ordered list of forecast periods from base to end of validity.", "items": { "additionalProperties": false, "description": "A single TAF forecast period.", "properties": { "change_type": { "description": "Change indicator: FM (from), TEMPO (temporary), BECMG (becoming), PROB (a standalone probability group), or null for the base period. A PROB30 or PROB40 qualifying a temporary group arrives as TEMPO; standing alone, with no temporary group after it, it arrives as PROB. Either way the percentage is in probability.", "type": [ "string", "null" ] }, "clouds": { "description": "Forecast cloud layers for this period, as AWC decoded them — at most three, so a further layer is left out of this array and its text surfaces in not_decoded, with raw_taf the complete source. Empty whenever the period published no layer heights, which covers a forecast clear sky and a period carrying no cloud element at all; sky_condition distinguishes them. An empty array is not a forecast of a clear sky on its own.", "items": { "additionalProperties": false, "description": "A forecast cloud layer.", "properties": { "base_ft": { "description": "Cloud base altitude in feet AGL. On an OVX layer this is the vertical visibility into the obscuration rather than a layer bottom, and 0 is a surface-level indefinite ceiling.", "type": "number" }, "cover": { "description": "Sky cover code: FEW, SCT, BKN, OVC, SKC, or OVX. OVX is the decoded form of a VVhhh group — the sky is obscured and the base is the vertical visibility into it, not a cloud bottom.", "type": "string" }, "type": { "description": "Cloud type qualifier: CB (cumulonimbus), TCU (towering cumulus), or null. An obscuration can carry one — a VV008CB group is an OVX layer with type CB.", "type": [ "string", "null" ] } }, "required": [ "cover", "base_ft", "type" ], "type": "object" }, "type": "array" }, "from": { "description": "Period start time in ISO 8601 format (UTC).", "type": "string" }, "not_decoded": { "description": "Text AWC attached to this period without decoding it, trimmed — usually a cloud layer past the three-layer decode limit, sometimes another group such as VV///. Null when nothing was left undecoded. Non-null marks a partial decode. Upstream can attach the leftover of one group, such as a TEMPO, to the period after it, so the text is published on the period it arrived on and never reassigned or parsed into clouds; raw_taf is the complete forecast.", "type": [ "string", "null" ] }, "probability": { "description": "Probability percentage (30 or 40) for TEMPO/PROB groups. Null if not specified.", "type": [ "number", "null" ] }, "sky_condition": { "description": "The sky condition this period forecast when it published no layer heights: SKC or NSC for a clear or insignificant-cloud forecast (a CAVOK group arrives as NSC), OVX for a forecast obscuration carrying no vertical visibility. Null when clouds carries layers — those are the statement — and also when the period carried no cloud element at all. An empty clouds array beside a null here forecasts nothing about cloud; on a TEMPO, PROB, or BECMG group that means the prevailing forecast stands unchanged, never that the sky will be clear.", "type": [ "string", "null" ] }, "to": { "description": "Period end time in ISO 8601 format (UTC).", "type": "string" }, "vertical_visibility_ft": { "description": "Vertical visibility into a forecast obscuration, in feet AGL — an indefinite ceiling, and the same height as this period OVX cloud layer. 0 is a surface-level indefinite ceiling; null means the period forecasts no obscuration.", "type": [ "number", "null" ] }, "visibility_sm": { "description": "Forecast visibility in statute miles (e.g., \"6\", \"1/2\"). Null if not specified.", "type": [ "string", "null" ] }, "weather": { "anyOf": [ { "additionalProperties": false, "properties": { "decoded": { "description": "Plain-English reading of each group, joined with \"; \" (e.g., \"light rain showers; mist\"). A group the decoder does not recognize is carried through as its own raw token rather than half-translated, so compare against raw when a reading still looks coded.", "type": "string" }, "raw": { "description": "Weather groups exactly as forecast, space-delimited (e.g., \"-SHRA\", \"-SHRA BR\", \"VCTS -RA\").", "type": "string" } }, "required": [ "raw", "decoded" ], "type": "object" }, { "type": "null" } ], "description": "Forecast weather for this period, or null when the period carried no weather group." }, "wind": { "additionalProperties": false, "description": "Forecast wind conditions at the surface for this period.", "properties": { "direction_deg": { "description": "Forecast wind direction in degrees true. Null when the forecast said VRB (variable), and also when the period carries no wind element at all — speed_kt is null in that second case and a number in the first.", "type": [ "number", "null" ] }, "gust_kt": { "description": "Forecast gust speed in knots, or null if none.", "type": [ "number", "null" ] }, "speed_kt": { "description": "Forecast wind speed in knots. 0 is a forecast calm (a 00000KT group); null means the period amends only visibility, weather, or cloud and carries no wind element, so the wind is unknown rather than calm.", "type": [ "number", "null" ] } }, "required": [ "direction_deg", "speed_kt", "gust_kt" ], "type": "object" }, "wind_shear": { "anyOf": [ { "additionalProperties": false, "properties": { "direction_deg": { "description": "Forecast wind direction at the top of the shear layer, in degrees true — not a direction of shear.", "type": "number" }, "height_ft": { "description": "Top of the shear layer in feet AGL — not the layer base and not its thickness. A WS020 group is 2000 ft.", "type": "number" }, "speed_kt": { "description": "Forecast wind speed at the top of the shear layer, in knots — the wind at that height, not the magnitude of the shear.", "type": "number" } }, "required": [ "height_ft", "direction_deg", "speed_kt" ], "type": "object" }, { "type": "null" } ], "description": "Forecast non-convective low-level wind shear (a WS group), confined to the surface–2,000 ft AGL band. A null means no non-convective LLWS group was issued for this period, rather than no shear expected: the group is excluded from TEMPO and PROB groups, and shear is always assumed present in convective activity." } }, "required": [ "from", "to", "change_type", "probability", "wind", "wind_shear", "visibility_sm", "vertical_visibility_ft", "weather", "clouds", "sky_condition", "not_decoded" ], "type": "object" }, "type": "array" }, "issued_at": { "description": "TAF issue time in ISO 8601 format (UTC).", "type": "string" }, "name": { "description": "Human-readable station or airport name.", "type": "string" }, "raw_taf": { "description": "Original encoded TAF string (e.g., \"TAF KSEA 041730Z 0418/0524 18010KT P6SM SKC ...\").", "type": "string" }, "station_id": { "description": "ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K36U).", "type": "string" }, "valid_from": { "description": "Forecast validity period start in ISO 8601 format (UTC).", "type": "string" }, "valid_to": { "description": "Forecast validity period end in ISO 8601 format (UTC).", "type": "string" } }, "required": [ "station_id", "name", "issued_at", "valid_from", "valid_to", "forecast_periods", "raw_taf" ], "type": "object" }, "type": "array" }, "missing": { "description": "Requested station IDs absent from the result. Absent when none are missing.", "items": { "description": "A requested ICAO station ID that produced no forecast.", "type": "string" }, "type": "array" }, "notice": { "description": "Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one — upstream omits the row either way.", "type": "string" }, "partial": { "description": "True when a requested station produced no forecast. False affirms the result covers every requested station, so full coverage is distinguishable from a short batch rather than being inferred from the count.", "type": "boolean" }, "requested": { "description": "Station IDs this call asked for, in the order given.", "items": { "description": "An ICAO station ID as requested.", "type": "string" }, "type": "array" }, "returned": { "description": "Distinct station IDs that produced a forecast.", "items": { "description": "An ICAO station ID present in the result.", "type": "string" }, "type": "array" } }, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:96a6acb012f677a2d7f272757183520675262453bb4864dff9dd33a89f8a26f3 | sha256sum