aviation-weather-mcp-server
このMCPでできること
Retrieves aviation weather station data, METARs, TAFs, PIREPs, and active domestic SIGMET advisories.
ツール
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'bbox': {'type': 'object', 'required': ['minLat', 'minLon', 'maxLat', 'maxLon'], 'properties': {'maxLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Northern boundary latitude in decimal degrees.'}, 'maxLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Eastern boundary longitude in decimal degrees.'}, 'minLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Southern boundary latitude in decimal degrees.'}, 'minLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Western boundary longitude in decimal degrees.'}}, 'description': 'Geographic bounding box for spatial queries.'}, 'limit': {'type': 'integer', 'maximum': 400, 'minimum': 1, 'description': 'Maximum stations to return, applied after ordering by ICAO identifier ascending with identifier-less stations last â\x80\x94 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.'}, 'state': {'type': 'string', 'maxLength': 2, 'minLength': 2, '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 â\x80\x94 use bbox for those.'}, 'station_ids': {'type': 'array', 'items': {'type': 'string', 'pattern': '\\S', 'description': 'One station identifier (e.g., KSEA).'}, 'maxItems': 20, 'minItems': 1, '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."}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['stations', 'truncated', 'shown']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The upstream row maximum that was applied to the draw. Present only on a truncated result.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['station_not_found', 'missing_search_criteria', 'conflicting_location', 'invalid_bbox', 'invalid_state', 'conflicting_limit', 'upstream_rejected'], '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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Stations in this result, counted after any client-side state filter and after any limit.'}, 'notice': {'type': 'string', '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.'}, 'limited': {'type': 'boolean', 'description': 'True when the requested limit withheld stations that matched â\x80\x94 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.'}, 'matched': {'type': 'number', '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 â\x80\x94 the stations the cap dropped were never examined, so no count can include them.'}, 'missing': {'type': 'array', 'items': {'type': 'string', 'description': 'A requested identifier that resolved to no station.'}, '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.'}, 'partial': {'type': 'boolean', 'description': 'True when a requested identifier resolved to nothing. False affirms every requested identifier resolved, which a count cannot establish â\x80\x94 upstream case-folds and deduplicates, so a shorter list is not itself a gap. Present only on a station_ids lookup.'}, 'returned': {'type': 'array', 'items': {'type': 'string', 'description': 'A requested identifier that resolved to a station.'}, '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.'}, 'stations': {'type': 'array', 'items': {'type': 'object', 'required': ['icao_id', 'iata_id', 'faa_id', 'name', 'lat', 'lon', 'elevation_ft', 'state', 'country', 'data_types'], 'properties': {'lat': {'type': 'number', 'description': 'Latitude in decimal degrees.'}, 'lon': {'type': 'number', 'description': 'Longitude in decimal degrees.'}, 'name': {'type': 'string', 'description': 'Human-readable site name.'}, 'state': {'type': 'string', 'description': 'US state abbreviation, or empty string for non-US stations.'}, 'faa_id': {'type': ['string', 'null'], 'description': 'FAA identifier, or null if not assigned.'}, 'country': {'type': 'string', 'description': 'Country code or name.'}, 'iata_id': {'type': ['string', 'null'], 'description': 'IATA 3-letter code, or null if not assigned.'}, 'icao_id': {'type': ['string', 'null'], 'description': 'ICAO station ID, 4 uppercase letters or digits (e.g., KSEA, K0S9), or null if not assigned.'}, 'data_types': {'type': 'array', 'items': {'type': 'string', 'description': 'An available data type (e.g., "METAR", "TAF", "SYNOP").'}, 'description': 'List of data products available at this station.'}, 'elevation_ft': {'type': ['number', 'null'], 'description': 'Station elevation in feet MSL. 0 is a sea-level site; null means no elevation is on file upstream, so it is unknown.'}}, 'description': 'An aviation weather reporting station.', 'additionalProperties': False}, 'description': 'Matching stations.'}, 'requested': {'type': 'array', 'items': {'type': 'string', 'description': 'A station identifier as 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 â\x80\x94 the bbox and state modes ask for an area, not a list.'}, 'truncated': {'type': 'boolean', '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.'}, 'upstreamRows': {'type': 'number', '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.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'bbox': {'type': 'object', 'required': ['minLat', 'minLon', 'maxLat', 'maxLon'], 'properties': {'maxLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Northern boundary latitude in decimal degrees.'}, 'maxLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Eastern boundary longitude in decimal degrees.'}, 'minLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Southern boundary latitude in decimal degrees.'}, 'minLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Western boundary longitude in decimal degrees.'}}, 'description': 'Geographic bounding box to filter advisories by polygon overlap.'}, 'hazard': {'enum': ['CONVECTIVE', 'TURBULENCE', 'ICING', 'IFR', 'MTN OBSCN', 'SURFACE WIND', 'LLWS'], 'type': 'string', '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 â\x80\x94 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.'}, 'advisory_type': {'enum': ['sigmet', 'airmet', 'all'], 'type': 'string', '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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['advisories']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_bbox', 'airmet_not_served'], 'description': 'Machine-readable failure mode. Declared by this tool: `invalid_bbox`: The bounding box is inverted â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', '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 â\x80\x94 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.'}, 'advisories': {'type': 'array', 'items': {'type': 'object', 'required': ['advisory_type', 'series_id', 'hazard', 'severity', 'issued_by', 'valid_from', 'valid_to', 'altitude_low_ft', 'altitude_high_ft', 'movement', 'polygon', 'raw_text'], 'properties': {'hazard': {'type': 'string', 'description': 'Hazard type â\x80\x94 one of CONVECTIVE, TURBULENCE, ICING, or IFR.'}, 'polygon': {'type': 'array', 'items': {'type': 'object', 'required': ['lat', 'lon'], 'properties': {'lat': {'type': 'number', 'description': 'Latitude in decimal degrees.'}, 'lon': {'type': 'number', 'description': 'Longitude in decimal degrees.'}}, 'description': 'A polygon vertex as a lat/lon coordinate pair.', 'additionalProperties': False}, 'description': 'Geographic boundary of the advisory as a polygon of lat/lon points.'}, 'movement': {'anyOf': [{'type': 'object', 'required': ['direction_deg', 'speed_kt'], 'properties': {'speed_kt': {'type': ['number', 'null'], 'description': 'Movement speed in knots, or null if stationary.'}, 'direction_deg': {'type': ['number', 'null'], 'description': 'Movement direction in degrees true, or null if stationary.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'System movement vector, or null if not available.'}, 'raw_text': {'type': 'string', 'description': 'Original encoded SIGMET text as issued by the meteorological watch office.'}, 'severity': {'type': ['number', 'null'], 'description': 'Severity integer for convective SIGMETs (higher = more intense). Null when the advisory stated none.'}, 'valid_to': {'type': 'string', 'description': 'Advisory validity end time in ISO 8601 format (UTC).'}, 'issued_by': {'type': 'string', 'description': 'ICAO ID of the issuing meteorological watch office.'}, 'series_id': {'type': 'string', 'description': 'Unique advisory identifier (e.g., BOSMA0).'}, 'valid_from': {'type': 'string', 'description': 'Advisory validity start time in ISO 8601 format (UTC).'}, 'advisory_type': {'type': 'string', 'description': 'Advisory type as issued. The domestic SIGMET feed this tool reads emits SIGMET.'}, 'altitude_low_ft': {'type': ['number', 'null'], 'description': 'Lower altitude bound in feet MSL, or null if not specified.'}, 'altitude_high_ft': {'type': ['number', 'null'], 'description': 'Upper altitude bound in feet MSL, or null if not specified.'}}, 'description': 'An active SIGMET advisory.', 'additionalProperties': False}, 'description': 'Active advisories matching the filter criteria. May be empty during fair weather periods.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'bbox': {'type': 'object', 'required': ['minLat', 'minLon', 'maxLat', 'maxLon'], 'properties': {'maxLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Northern boundary latitude in decimal degrees.'}, 'maxLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Eastern boundary longitude in decimal degrees.'}, 'minLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Southern boundary latitude in decimal degrees.'}, 'minLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Western boundary longitude in decimal degrees.'}}, 'description': 'Geographic bounding box for an area observation survey.'}, 'hours': {'type': 'integer', 'default': 1, 'maximum': 12, 'minimum': 1, 'description': 'Lookback window in hours (1â\x80\x9312), 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 â\x80\x94 a wide window spends that cap on repeat readings from busy stations instead of on more stations, so lower it before narrowing the box.'}, 'limit': {'type': 'integer', 'maximum': 400, 'minimum': 1, '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 â\x80\x94 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.'}, 'station_ids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z0-9]{4}$', 'description': 'ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K0S9).'}, 'maxItems': 10, 'minItems': 1, 'description': 'ICAO station IDs to query. 1â\x80\x9310 stations per call, and every observation inside the hours window is returned for each. Supplying it alongside bbox is rejected â\x80\x94 use bbox to ask about an area rather than a named set.'}, 'flight_category': {'type': 'array', 'items': {'enum': ['VFR', 'MVFR', 'IFR', 'LIFR'], 'type': 'string', 'description': 'A flight category: VFR, MVFR, IFR, or LIFR.'}, 'minItems': 1, '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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['observations']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The upstream row maximum that was applied to the draw. Present only on a truncated result.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_stations_found', 'missing_location', 'conflicting_location', 'invalid_bbox', 'conflicting_limit', 'conflicting_flight_category'], 'description': 'Machine-readable failure mode. Declared by this tool: `no_stations_found`: No station returned METAR data â\x80\x94 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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', '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.'}, 'notice': {'type': 'string', '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 â\x80\x94 on a survey of more than 40 stations from a call that set no limit â\x80\x94 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.'}, 'limited': {'type': 'boolean', 'description': 'True when the requested limit withheld stations that matched â\x80\x94 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.'}, 'matched': {'type': 'number', 'description': 'Stations the draw held before the limit selected from them â\x80\x94 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 â\x80\x94 the observations the cap dropped were never examined, so no count can include them.'}, 'missing': {'type': 'array', 'items': {'type': 'string', 'description': 'A requested ICAO station ID that produced no observation.'}, 'description': 'Requested station IDs absent from the result. Absent when none are missing.'}, 'partial': {'type': 'boolean', '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.'}, 'returned': {'type': 'array', 'items': {'type': 'string', 'description': 'An ICAO station ID present in the result.'}, 'description': 'Distinct station IDs that produced at least one observation. Counted per station, not per row â\x80\x94 with hours > 1 a station reporting six times still appears once. Present only on a station_ids lookup.'}, 'surveyed': {'type': 'number', 'description': 'Stations the survey reached â\x80\x94 one per station, the latest observation of each â\x80\x94 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.'}, 'requested': {'type': 'array', 'items': {'type': 'string', 'description': 'An ICAO station ID as requested.'}, 'description': 'Station IDs this call asked for, in the order given. Present only on a station_ids lookup â\x80\x94 a bbox survey asks for an area, not a list.'}, 'truncated': {'type': 'boolean', '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 â\x80\x94 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.'}, 'observations': {'type': 'array', 'items': {'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'], 'properties': {'lat': {'type': 'number', 'description': 'Station latitude in decimal degrees.'}, 'lon': {'type': 'number', 'description': 'Station longitude in decimal degrees.'}, 'name': {'type': 'string', 'description': 'Human-readable station or airport name.'}, 'wind': {'type': 'object', 'required': ['direction_deg', 'speed_kt', 'gust_kt'], 'properties': {'gust_kt': {'type': ['number', 'null'], 'description': 'Gust speed in knots, or null if no gusts reported.'}, 'speed_kt': {'type': ['number', 'null'], 'description': 'Wind speed in knots. 0 is calm (a reported 00000KT); null means the observation carried no wind group, so the speed is unknown.'}, 'direction_deg': {'type': ['number', 'null'], '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 â\x80\x94 speed_kt is a number in the first case and null in the second.'}}, 'description': 'Wind conditions at the station.', 'additionalProperties': False}, 'clouds': {'type': 'array', 'items': {'type': 'object', 'required': ['cover', 'base_ft'], 'properties': {'cover': {'type': 'string', 'description': 'Sky cover code: FEW, SCT, BKN, OVC, SKC, CLR, CAVOK, or OVX. OVX is the decoded form of a VVhhh group â\x80\x94 the sky is obscured and the base is the vertical visibility into it, not a cloud bottom.'}, 'base_ft': {'type': 'number', 'description': 'Cloud base altitude in feet AGL.'}}, 'description': 'A reported cloud layer.', 'additionalProperties': False}, 'description': 'Cloud layers from lowest to highest, as AWC decoded them â\x80\x94 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.'}, 'temp_c': {'type': ['number', 'null'], 'description': 'Temperature in degrees Celsius. 0 is a real reading; null means the observation carried no temperature, so it is unknown.'}, 'raw_metar': {'type': 'string', 'description': 'Original encoded METAR string (e.g., "KSEA 041453Z 18006KT 10SM FEW035 09/03 A2991").'}, 'ceiling_ft': {'type': ['number', 'null'], 'description': 'Ceiling in feet AGL â\x80\x94 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.'}, 'dewpoint_c': {'type': ['number', 'null'], 'description': 'Dewpoint in degrees Celsius. 0 is a real reading; null means the observation carried no dewpoint, so it is unknown.'}, 'metar_type': {'type': 'string', 'description': 'METAR (routine) or SPECI (special observation triggered by significant weather change).'}, 'station_id': {'type': 'string', 'description': 'ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K0S9).'}, 'observed_at': {'type': 'string', 'description': 'Observation time in ISO 8601 format (UTC).'}, '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.'}, 'elevation_ft': {'type': 'number', 'description': 'Station elevation in feet MSL.'}, 'sky_condition': {'type': ['string', 'null'], '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 â\x80\x94 those are the statement â\x80\x94 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.'}, 'visibility_sm': {'type': 'string', '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.'}, 'altimeter_inhg': {'type': ['number', 'null'], 'description': 'Altimeter setting in inches of mercury, or null when the observation carried no altimeter group (common at stations reporting sea-level pressure only).'}, 'flight_category': {'type': 'string', 'description': 'Flight category: VFR, MVFR, IFR, or LIFR based on ceiling and visibility.'}, 'present_weather': {'anyOf': [{'type': 'object', 'required': ['raw', 'decoded'], 'properties': {'raw': {'type': 'string', 'description': 'Weather groups exactly as encoded, space-delimited (e.g., "FG", "-SHRA", "VCTS -RA").'}, 'decoded': {'type': 'string', '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.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Present weather at the station, or null when the observation carried no weather group (a dry, unobscured day).'}}, 'description': 'A single weather observation from one station at one time.', 'additionalProperties': False}, 'description': 'Weather observations. With station_ids, one per station/time pair â\x80\x94 multiple entries per station when the hours window holds more than one observation. With bbox, one per station: the latest observation inside that window.'}, 'upstreamRows': {'type': 'number', '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.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'bbox': {'type': 'object', 'required': ['minLat', 'minLon', 'maxLat', 'maxLon'], 'properties': {'maxLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Northern boundary latitude in decimal degrees.'}, 'maxLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Eastern boundary longitude in decimal degrees.'}, 'minLat': {'type': 'number', 'maximum': 90, 'minimum': -90, 'description': 'Southern boundary latitude in decimal degrees.'}, 'minLon': {'type': 'number', 'maximum': 180, 'minimum': -180, 'description': 'Western boundary longitude in decimal degrees.'}}, 'description': 'Geographic bounding box for area PIREP search.'}, 'hours': {'type': 'integer', 'default': 3, 'maximum': 12, 'minimum': 1, 'description': 'How many hours of history to return. Default 3.'}, 'limit': {'type': 'integer', 'maximum': 400, 'minimum': 1, 'description': 'Maximum reports to return, applied last â\x80\x94 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.'}, 'station_id': {'type': 'string', 'pattern': '^[A-Z0-9]{4}$', 'description': 'ICAO station ID as center point for radial search â\x80\x94 4 uppercase letters or digits (e.g., KSEA, K0S9). Use with distance_nm.'}, 'distance_nm': {'type': 'integer', 'maximum': 500, 'minimum': 10, 'description': 'Search radius in nautical miles around station_id, defaulting to 100 when omitted. Belongs to the station_id search only â\x80\x94 supplying it alongside bbox is rejected.'}, 'min_intensity': {'enum': ['lgt', 'mod', 'sev'], 'type': 'string', 'description': 'Return only reports carrying at least one turbulence or icing layer at this intensity or above. The filter selects reports, not layers â\x80\x94 a matching report still carries its lighter layers, so a result may include NEG, TRC, or LGT entries alongside the layer that matched. Optional.'}, 'altitude_max_ft': {'type': 'integer', 'maximum': 60000, 'minimum': 0, 'description': 'Filter by maximum altitude in feet MSL (e.g., 35000 for FL350), from 0 to 60000 ft â\x80\x94 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.'}, 'altitude_min_ft': {'type': 'integer', 'maximum': 60000, 'minimum': 0, 'description': 'Filter by minimum altitude in feet MSL (e.g., 18000 for FL180), from 0 to 60000 ft â\x80\x94 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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['pireps', 'truncated', 'shown']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The upstream row maximum that was applied to the page. Present only on a truncated result.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_pireps_found', 'station_not_recognized', 'missing_location', 'conflicting_location', 'invalid_bbox', 'conflicting_distance', 'invalid_altitude_range'], '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 â\x80\x94 a closed or retired airport, for example â\x80\x94 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 â\x80\x94 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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Reports in this result, counted after any altitude filter and after any limit.'}, 'notice': {'type': 'string', 'description': 'Guidance for whichever disclosures fired: the levers that narrow the query before the cap applies, what a requested limit withheld, and â\x80\x94 on a result of more than 50 reports from a call that set no limit â\x80\x94 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.'}, 'pireps': {'type': 'array', 'items': {'type': 'object', 'required': ['observed_at', 'lat', 'lon', 'altitude_ft', 'aircraft_type', 'pirep_type', 'turbulence', 'icing', 'clouds', 'visibility_sm', 'temp_c', 'wind', 'weather', 'raw_pirep'], 'properties': {'lat': {'type': 'number', 'description': 'Latitude of the PIREP location in decimal degrees.'}, 'lon': {'type': 'number', 'description': 'Longitude of the PIREP location in decimal degrees.'}, 'wind': {'anyOf': [{'type': 'object', 'required': ['direction_deg', 'speed_kt'], 'properties': {'speed_kt': {'type': 'number', 'description': 'Wind speed aloft in knots. 0 is a reported calm.'}, 'direction_deg': {'type': 'number', '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."}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Wind aloft at the report altitude, as AWC decoded it â\x80\x94 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 â\x80\x94 a gust suffix (/WV 03020G30), a single-digit AIREP speed (252/9 KT), a variation (/WV +/- 5KT) â\x80\x94 and those return null here, with raw_pirep as the only source.'}, 'icing': {'type': 'array', 'items': {'type': 'object', 'required': ['base_ft', 'top_ft', 'intensity', 'type'], 'properties': {'type': {'type': ['string', 'null'], 'description': 'Icing type (e.g., RIME, MIXED, CLEAR), or null if not reported.'}, 'top_ft': {'type': ['number', 'null'], 'description': 'Icing layer top altitude in feet MSL, or null if not specified.'}, 'base_ft': {'type': ['number', 'null'], 'description': 'Icing layer base altitude in feet MSL, or null if not specified.'}, 'intensity': {'type': 'string', 'description': 'Icing intensity (e.g., NEG, TRC, LGT, MOD, SEV).'}}, 'description': 'A reported icing layer.', 'additionalProperties': False}, '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.'}, 'clouds': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'required': ['cover', 'base_ft', 'top_ft'], 'properties': {'cover': {'type': 'string', '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.'}, 'top_ft': {'type': ['number', 'null'], 'description': 'Cloud top altitude in feet MSL, or null if the pilot reported no top.'}, 'base_ft': {'type': ['number', 'null'], 'description': 'Cloud base altitude in feet MSL, or null if the pilot reported no base.'}}, 'description': 'A cloud layer, whose base and top are each present only if reported.', 'additionalProperties': False}}, {'type': 'null'}], 'description': 'Cloud layers, or null if the PIREP carried no sky-condition group.'}, 'temp_c': {'type': ['number', 'null'], 'description': 'Outside air temperature in degrees Celsius at the report altitude, as AWC decoded it â\x80\x94 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).'}, 'weather': {'anyOf': [{'type': 'object', 'required': ['raw', 'decoded'], 'properties': {'raw': {'type': 'string', 'description': 'Weather groups exactly as encoded, space-delimited (e.g., "+RA", "FG -RA").'}, 'decoded': {'type': 'string', '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.'}}, 'additionalProperties': False}, {'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 â\x80\x94 CEILING 017 returns null and RA FL300 AOB returns RA alone â\x80\x94 so raw_pirep is the only source for it. This is not the /RM remarks text, which AWC does not decode either â\x80\x94 raw_pirep carries it.'}, 'raw_pirep': {'type': 'string', 'description': 'Original encoded PIREP string (e.g., "SEA UA /OV KSEA/TM 1530/FL080/TP B737/TB LGT").'}, 'pirep_type': {'type': 'string', 'description': 'Report type: PIREP (pilot report) or AIREP (position report with wx).'}, 'turbulence': {'type': 'array', 'items': {'type': 'object', 'required': ['base_ft', 'top_ft', 'intensity', 'type', 'frequency'], 'properties': {'type': {'type': ['string', 'null'], 'description': 'Turbulence type (e.g., CHOP, CAT), or null if not reported.'}, 'top_ft': {'type': ['number', 'null'], 'description': 'Turbulence layer top altitude in feet MSL, or null if not specified.'}, 'base_ft': {'type': ['number', 'null'], 'description': 'Turbulence layer base altitude in feet MSL, or null if not specified.'}, 'frequency': {'type': ['string', 'null'], 'description': 'Turbulence frequency (e.g., OCNL, CONT), or null if not reported.'}, 'intensity': {'type': 'string', 'description': 'Turbulence intensity (e.g., NEG, LGT, LGT-MOD, MOD, SEV, EXTRM).'}}, 'description': 'A reported turbulence layer.', 'additionalProperties': False}, '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.'}, 'altitude_ft': {'type': ['number', 'null'], '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 â\x80\x94 including one made only of digits, such as /FL2130/. A raw /FL000/ is a reported flight level of zero and returns 0.'}, 'observed_at': {'type': 'string', 'description': 'Observation time in ISO 8601 format (UTC).'}, 'aircraft_type': {'type': ['string', 'null'], 'description': 'Aircraft type designator (e.g., B737, C172), or null if not reported.'}, 'visibility_sm': {'type': ['number', 'null'], 'description': 'In-flight visibility in statute miles, or null if not reported.'}}, 'description': 'A single Pilot Report (PIREP) with decoded hazard information.', 'additionalProperties': False}, 'description': 'Pilot reports matching the search criteria, ordered by observation time descending.'}, 'limited': {'type': 'boolean', 'description': 'True when the requested limit withheld reports that matched â\x80\x94 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.'}, 'matched': {'type': 'number', '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 â\x80\x94 the reports the cap dropped were never examined, so no count can include them.'}, 'truncated': {'type': 'boolean', '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.'}, 'upstreamRows': {'type': 'number', '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.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['station_ids'], 'properties': {'station_ids': {'type': 'array', 'items': {'type': 'string', 'pattern': '^[A-Z0-9]{4}$', 'description': 'ICAO station ID: 4 uppercase letters or digits (e.g., KSEA, KJFK, K36U).'}, 'maxItems': 4, 'minItems': 1, 'description': 'ICAO station IDs to query. 1â\x80\x934 stations per call.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['forecasts', 'requested', 'returned', 'partial']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_taf_available'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'notice': {'type': 'string', 'description': 'Recovery guidance naming the missing station IDs. Present only on a partial result. It lists the candidate causes without asserting one â\x80\x94 upstream omits the row either way.'}, 'missing': {'type': 'array', 'items': {'type': 'string', 'description': 'A requested ICAO station ID that produced no forecast.'}, 'description': 'Requested station IDs absent from the result. Absent when none are missing.'}, 'partial': {'type': 'boolean', '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.'}, 'returned': {'type': 'array', 'items': {'type': 'string', 'description': 'An ICAO station ID present in the result.'}, 'description': 'Distinct station IDs that produced a forecast.'}, 'forecasts': {'type': 'array', 'items': {'type': 'object', 'required': ['station_id', 'name', 'issued_at', 'valid_from', 'valid_to', 'forecast_periods', 'raw_taf'], 'properties': {'name': {'type': 'string', 'description': 'Human-readable station or airport name.'}, 'raw_taf': {'type': 'string', 'description': 'Original encoded TAF string (e.g., "TAF KSEA 041730Z 0418/0524 18010KT P6SM SKC ...").'}, 'valid_to': {'type': 'string', 'description': 'Forecast validity period end in ISO 8601 format (UTC).'}, 'issued_at': {'type': 'string', 'description': 'TAF issue time in ISO 8601 format (UTC).'}, 'station_id': {'type': 'string', 'description': 'ICAO station identifier, 4 uppercase letters or digits (e.g., KSEA, K36U).'}, 'valid_from': {'type': 'string', 'description': 'Forecast validity period start in ISO 8601 format (UTC).'}, 'forecast_periods': {'type': 'array', 'items': {'type': 'object', 'required': ['from', 'to', 'change_type', 'probability', 'wind', 'wind_shear', 'visibility_sm', 'vertical_visibility_ft', 'weather', 'clouds', 'sky_condition', 'not_decoded'], 'properties': {'to': {'type': 'string', 'description': 'Period end time in ISO 8601 format (UTC).'}, 'from': {'type': 'string', 'description': 'Period start time in ISO 8601 format (UTC).'}, 'wind': {'type': 'object', 'required': ['direction_deg', 'speed_kt', 'gust_kt'], 'properties': {'gust_kt': {'type': ['number', 'null'], 'description': 'Forecast gust speed in knots, or null if none.'}, 'speed_kt': {'type': ['number', 'null'], '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.'}, 'direction_deg': {'type': ['number', 'null'], '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 â\x80\x94 speed_kt is null in that second case and a number in the first.'}}, 'description': 'Forecast wind conditions at the surface for this period.', 'additionalProperties': False}, 'clouds': {'type': 'array', 'items': {'type': 'object', 'required': ['cover', 'base_ft', 'type'], 'properties': {'type': {'type': ['string', 'null'], 'description': 'Cloud type qualifier: CB (cumulonimbus), TCU (towering cumulus), or null. An obscuration can carry one â\x80\x94 a VV008CB group is an OVX layer with type CB.'}, 'cover': {'type': 'string', 'description': 'Sky cover code: FEW, SCT, BKN, OVC, SKC, or OVX. OVX is the decoded form of a VVhhh group â\x80\x94 the sky is obscured and the base is the vertical visibility into it, not a cloud bottom.'}, 'base_ft': {'type': 'number', '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.'}}, 'description': 'A forecast cloud layer.', 'additionalProperties': False}, 'description': 'Forecast cloud layers for this period, as AWC decoded them â\x80\x94 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.'}, 'weather': {'anyOf': [{'type': 'object', 'required': ['raw', 'decoded'], 'properties': {'raw': {'type': 'string', 'description': 'Weather groups exactly as forecast, space-delimited (e.g., "-SHRA", "-SHRA BR", "VCTS -RA").'}, 'decoded': {'type': 'string', '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.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Forecast weather for this period, or null when the period carried no weather group.'}, 'wind_shear': {'anyOf': [{'type': 'object', 'required': ['height_ft', 'direction_deg', 'speed_kt'], 'properties': {'speed_kt': {'type': 'number', 'description': 'Forecast wind speed at the top of the shear layer, in knots â\x80\x94 the wind at that height, not the magnitude of the shear.'}, 'height_ft': {'type': 'number', 'description': 'Top of the shear layer in feet AGL â\x80\x94 not the layer base and not its thickness. A WS020 group is 2000 ft.'}, 'direction_deg': {'type': 'number', 'description': 'Forecast wind direction at the top of the shear layer, in degrees true â\x80\x94 not a direction of shear.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Forecast non-convective low-level wind shear (a WS group), confined to the surfaceâ\x80\x932,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.'}, 'change_type': {'type': ['string', 'null'], '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.'}, 'not_decoded': {'type': ['string', 'null'], 'description': 'Text AWC attached to this period without decoding it, trimmed â\x80\x94 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.'}, 'probability': {'type': ['number', 'null'], 'description': 'Probability percentage (30 or 40) for TEMPO/PROB groups. Null if not specified.'}, 'sky_condition': {'type': ['string', 'null'], '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 â\x80\x94 those are the statement â\x80\x94 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.'}, 'visibility_sm': {'type': ['string', 'null'], 'description': 'Forecast visibility in statute miles (e.g., "6", "1/2"). Null if not specified.'}, 'vertical_visibility_ft': {'type': ['number', 'null'], 'description': 'Vertical visibility into a forecast obscuration, in feet AGL â\x80\x94 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.'}}, 'description': 'A single TAF forecast period.', 'additionalProperties': False}, 'description': 'Ordered list of forecast periods from base to end of validity.'}}, 'description': 'A Terminal Aerodrome Forecast for one station.', 'additionalProperties': False}, 'description': 'TAF forecasts, one per requested station.'}, 'requested': {'type': 'array', 'items': {'type': 'string', 'description': 'An ICAO station ID as requested.'}, 'description': 'Station IDs this call asked for, in the order given.'}}, 'additionalProperties': False}
最近のツール変更
類似のMCPサーバー
Award Travel Finder
Searches award flights and hotels, tracks bookings and loyalty balances, evaluates points and credit cards, and monitors travel r…
AI 代理人任務中樞
Aggregates Taiwan-focused tools for AI service comparisons, cryptocurrency data, game information, health guidance, and other con…
Good Turn Studio (all tools)
Offers consumer utilities for insurance claim appeals, subscription cancellation, flight fare research, financial recovery resour…
Gover MCP
Searches and manages corporate travel requests, flights, hotels, rental vehicles, passengers, carts, approvals, reservations, and…
DC Member API
Provides access to Dynamite Circle membership data, community profiles, chapters, events, trips, calendars, alerts, follows, agen…
Nomad Stays
Searches and books remote-work accommodations while supporting host listing management, rooms, packages, availability, and hospit…
lilo Vacation Rentals
Supports vacation-rental discovery, availability and direct booking, property operations, short-term-rental compliance, guest and…
mcp-server
Provides immigration, citizenship and residency programme research alongside tax, wealth structuring, banking, visa, treaty and c…