关于 aviation-weather-mcp-server
面向 NWS Aviation Weather Center 航空天气数据的 MCP 服务,提供站点查询、观测、预报、飞行员报告和危险天气通告,并包含飞行前简报提示词;不提供 AIRMET。
主要功能
- 01按标识、区域或州查找站点
- 02获取 METAR 观测和 TAF 预报
- 03按站点或区域查询 PIREP
- 04获取 SIGMET 和中心天气通告
- 05生成结构化飞行前简报
适用场景
- 01查看出发机场的当前天气
- 02检查预报时段和附近飞行员报告
- 03查看航线沿途的天气通告
- 04飞行前整理天气风险简报
MCP 相关
向 MCP 客户端提供五种工具和一个飞行前简报提示词,支持 STDIO 和 Streamable HTTP 传输。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://aviation-weather.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-aviation-weather https://aviation-weather.caseyjhand.com/mcp{"mcpServers":{"cyanheads-aviation-weather":{"type":"http","url":"https://aviation-weather.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-aviation-weather":{"type":"http","url":"https://aviation-weather.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-aviation-weather":{"type":"http","url":"https://aviation-weather.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-aviation-weather":{"serverUrl":"https://aviation-weather.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
5| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| bbox | object | 否 | 用于空间查询的地理边界框。 |
| bbox.maxLat | number | 是 | 北侧边界纬度,单位为十进制度。 |
| bbox.maxLon | number | 是 | 东侧边界经度,单位为十进制度。 |
| bbox.minLat | number | 是 | 南侧边界纬度,单位为十进制度。 |
| bbox.minLon | number | 是 | 西侧边界经度,单位为十进制度。 |
| limit | integer | 否 | 返回的最大站点数,按 ICAO 标识符升序排列后应用;没有标识符的站点排在最后。因此,相同查询使用相同限制值时会返回相同站点,机场会优先于未标识站点出现在第一页。此限制约束响应内容,不会像缩小 bbox 或更改州那样改变搜索区域。与上游 400 行上限不同:受限制的结果已检查所有计入的站点,只是隐去部分结果;达到上限的结果则根本没有获取其余站点。适用于 bbox 和 state 模式;与 station_ids 一起提供会被拒绝,因为该模式已明确指定站点集合。省略则返回所有匹配项。可选。 |
| state | string | 否 | 用于列出某个辖区内所有站点的两字母 USPS 州代码,适用于美国 50 个州或 DC(例如 "WA")。不支持美国领地;请改用 bbox。 |
| station_ids | array | 否 | 一个或多个站点标识符(例如 KSEA、KJFK)。查询会匹配注册表自身的标识符:机场使用 4 个字符的 ICAO ID(例如 KSEA、K0S9);浮标和 mesonet 站点则使用注册表收录的其他格式进行解析。3 字母 IATA 代码(例如 SEA)永远无法解析,即使站点条目中包含该代码。条目首尾的空白会被去除,因此带空格的标识符与不带空格的解析结果相同;空条目或仅含空白的条目会被拒绝。使用 bbox 或 state 按位置查找标识符。 |
详细介绍
@cyanheads/aviation-weather-mcp-server
通过 MCP 从 NWS AWC 获取 METAR、TAF、PIREP、国内/国际 SIGMET 和 CWA。不提供 AIRMET。支持 STDIO 或 Streamable HTTP。
概述
来自 NWS Aviation Weather Center 的航空天气信息:METAR、TAF、PIREP、国内/国际 SIGMET 以及 Center Weather Advisories。查询站点,获取当前和预报天气状况,并检索飞行员报告和危险天气公告。不提供 AIRMET。
工具
| 工具 | 描述 |
|---|---|
aviation_find_stations | 按标识符、边界框或美国州查找机场和气象站。返回 ICAO/IATA/FAA ID、坐标、海拔和可用数据类型。 |
aviation_get_metar | 获取指定机场的当前天气观测(METAR),或调查边界框内的所有报告站点。返回解码后的风、能见度、云底高、当前天气、温度/露点、气压高度表读数、云层、飞行类别(VFR/MVFR/IFR/LIFR)以及原始 METAR 字符串。 |
aviation_get_taf | 获取一个或多个机场的终端机场预报。返回每个预报时段的有效时间、地面风、低空风切变、能见度、解码后的天气、云层、预报遮蔽区内的垂直能见度,以及原始 TAF 字符串。 |
aviation_get_pireps | 获取机场附近或边界框内近期的飞行员报告。返回解码后的颠簸、结冰和云况报告,包含高度、机型、强度、外界气温、高空风、飞行天气以及原始 PIREP 字符串。 |
aviation_get_advisories | 获取国内/国际 SIGMET 和中心天气公告。返回来源覆盖范围、危险天气、严重程度、高度、有效期、移动情况、多段几何信息和原始公告;缺失的信息保持为 null。 |
提示词
| 提示词 | 描述 |
|---|---|
aviation_preflight_brief | 为一次飞行整理飞行前天气简报,按顺序调用上述工具,并综合生成天气风险摘要。 |
能力参考
aviation_find_stations 工具
- 按标识符查找一个或多个站点(每次调用最多 20 个)——查找会匹配注册表自身的 ID;对于机场,该 ID 为 4 个字符的 ICAO ID(例如
KSEA、K0S9);3 个字母的 IATA 代码无法解析,不过每条记录都会在可用时包含其 IATA/FAA 别名 - 查找地理边界框内的站点,或通过两字母 USPS 代码列出美国 50 个州之一或 DC 的站点
- 返回
data_types(METAR、TAF 等),供 Agent 在查询前确认可用数据 - 每条结果都会说明是否触发了上游 400 行上限;
limit(1–400)限制bbox或state搜索返回的站点数量,结果按 ICAO 标识符升序排列,没有标识符的站点排在最后——此参数不能与station_ids同时使用,因为该模式已明确指定集合。区域搜索在未设置limit时若返回超过 130 个站点,会说明这一点并指出可调整的参数;省略limit仍会返回所有匹配项 - ID 查找会列出所有未能解析的标识符,并区分永远无法解析的 3 个字母 IATA 代码与注册表中未列出的标识符
- ID 前后的空白会被去除,而不会导致批次失败;只有空条目或仅含空白的条目会被拒绝
aviation_get_metar tool
station_ids(每次调用 1–10 个;4 个 ASCII 字母或数字,不区分大小写并会规范化为大写,因此ksea和K0S9均可用),用于指定机场;或使用bbox调查区域内所有有报告的站点——两者互斥hours(1–12)是回溯时间范围,不是行数限制:使用station_ids时会返回范围内的每条观测;使用bbox时则返回每个站点的最新观测flight_category(例如["IFR", "LIFR"])可将bbox调查范围缩小到属于这些类别的站点——依据每个站点的最新观测判断,在limit之前应用,并说明筛选前调查的站点数;AWC 无法评级的站点永远不会匹配,筛选后结果为空时也会明确说明。与station_ids同时使用时会被拒绝bbox调查会说明上游 400 行上限是否截断了结果;当hours大于 1 时,会指出应优先调整hours——较宽的时间范围会让上限更多地用于重复读数,而非更多站点;limit(1–400)限制返回的站点数量,按站点 ID 升序排列,与station_ids同时使用时会被拒绝。若调查返回超过 40 个站点且未指定limit,会提示这一点并说明可调整的参数;省略limit仍会返回所有站点- 飞行类别(VFR/MVFR/IFR/LIFR)直接取自 AWC API;除原始 METAR 字符串外,还会解码风、能见度、当前天气和云层
- 云底高度报告包含高度和类型(实测值,或因遮蔽而产生的垂直能见度不定值)——当
clouds为空时,sky_condition可区分报告的晴空与未报告天空状况 metar_type用于区分常规的METAR与特殊的SPECI观测- 每批结果都会报告哪些请求的站点已返回,并列出缺失的 ID 及恢复建议
aviation_get_taf tool
- 每次调用接受 1–4 个 ICAO 站点 ID:4 个 ASCII 字母或数字,大小写均可,并会规范化为大写
- 提供结构化的预报时段,包含变化类型(
FM、TEMPO、BECMG)和概率;天气按组解码,并与原始组并列展示 - 预报中的遮蔽现象会保留所在云层,并附带其中的垂直能见度,而不是显示为晴空;
sky_condition可区分未修订时段与明确报告的晴空 - 上游解码器未能解码的文本(通常是第四个云层)会按时段列入
not_decoded,而不会被丢弃 - 低空风切变(
WS020/20040KT)会解码为风切变层顶及该高度处的预报风 - 提供 ISO 8601 格式的
valid_from/valid_to,用于时间比较 - 每批结果都会报告哪些请求的站点已返回,并列出缺失的 ID 及恢复建议
aviation_get_pireps 工具
station_id(4 个 ASCII 字母或数字,大小写均可,会规范为大写)+distance_nm(10–500 nm,省略时为 100)用于径向搜索,或使用bbox进行区域搜索;两者互斥。若 AWC 不将某个station_id识别为搜索中心,则返回类型化错误,并提示使用aviation_find_stations或bboxaltitude_min_ft/altitude_max_ft用于筛选海平面以上英尺(MSL)的巡航高度范围,范围为 0–60000 ft(最小值不得大于最大值);设置任一边界后,未知高度的报告会被剔除min_intensity(lgt/mod/sev)用于筛选包含达到或超过该强度的湍流层或结冰层的报告;匹配的报告仍会包含较低强度的图层- 每份报告的湍流和结冰数组最多包含两个图层;如果某份报告从未提及结冰,则会剔除 API 为其合成的结冰层
- PIREP 和 AIREP 均包含外部气温(
temp_c)、高空风(wind),以及与原始组别一同解码的/WX飞行天气(weather)。风向按报告中的原样发布,不作转换——PIREP 的/WV风向为磁北方向,与 METAR 和 TAF 中以真北为基准的风向不同 - 每个结果都会说明上游 400 行上限是否截断了结果,并仅列出此次调用仍可使用的缩小结果集选项;
limit(1–400)用于限制返回的报告数量,结果按时间从新到旧排序。若结果超过 50 份且未指定limit,则会说明这一点并列出可用选项;省略limit仍会返回所有匹配项 - PIREP 天生较为稀疏——没有报告并不意味着飞行条件平稳
aviation_get_advisories 工具
advisory_type:sigmet(国内)、isigmet(国际,包括海洋区域)、cwa(Center Weather Advisories,中心天气咨询),或all(默认值:所有三个独立产品)hazard在上游应用:国内支持CONVECTIVE、TURBULENCE、ICING、IFR;国际支持TS、TURBULENCE、ICING、MTW、DS、SS、TC、VA;CWA 支持TS、TURBULENCE、ICING、IFR、PCPN、UNK。不兼容的数据源会标记为not_applicable;若所选项没有兼容的数据源,则会拒绝请求coverage会将每个选定的数据源报告为ok、failed或not_applicable,并且仅对可读取的数据源提供已解码的绘制数量。partial表示数据源失败或跳过了无法读取的行。某个数据源失败时,其他正常的独立产品仍会保留;所有适用产品均失败时则返回错误。一次 45 秒的截止时间限制并发咨询读取和重试;调用方取消请求会中止所有任务bbox使用每个几何部分的边界包络(包括跨越日期变更线的情况),而非进行精确的多边形相交判断。输入顺序保持不变(minLat <= maxLat、minLon <= maxLon)。使用bbox时,drawn统计产品/危险类型筛选后的行数,matched统计地理位置匹配数,returned统计应用任何限制后的行数,unlocated则单独统计没有已解码几何信息的行数limit为可选项,且没有默认值:省略时返回所有可用的匹配项。显式设置时,结果按数据源、签发方、序列和有效期排序,并报告total/returned/truncated,同时说明如何通过省略或调高限制来获取未返回的匹配项- 缺失的签发方、序列、危险类型、有效期和原始文本保留为 null。
geometry.parts会保留独立的环/线以及源数据原生的kind(包括 null);对于多部分、线状或缺失的几何数据,兼容字段polygon为 null。国内数值严重程度/移动信息保持不变;国际移动信息会保留direction_text和已解码的节数。CWA 的严重程度/移动信息保留为 null,且绝不会从公告文本推断高度 - 原始公告会以安全代码围栏呈现,并保留空行和嵌入的反引号。空结果会说明可读取的数据源和筛选阶段;不可用的数据源不会用于判断天气良好
- 不提供 AIRMET。请求 AIRMET(或
MTN OBSCN/SURFACE WIND/LLWS)会被拒绝,并提示应分别获取 AIRMET 产品
aviation_preflight_brief 提示词
- 参数:必填
departure_icao和destination_icao;可选alternates(以逗号分隔的 ICAO 代码)、departure_time(ISO 8601 UTC)、cruise_altitude(英尺 MSL)和route_waypoints(以分号分隔的lat,lon坐标对) - 每个 ICAO 参数都接受 4 个 ASCII 字母或数字,不区分大小写,并会生成大写 ID。对于 IATA/FAA 代码,请使用
aviation_find_stations和state或bbox查找 ICAO ID;不会推断映射关系。直接 ID 不接受前后空格;以逗号分隔的备选机场代码允许包含空格 - 依次调用
aviation_get_metar、aviation_get_taf、aviation_get_pireps和aviation_get_advisories,并按每个工具的单次调用站点数限制分批处理 departure_time用于选择简报所依据的 TAF 预报时段;cruise_altitude将 PIREP 搜索范围限定在 ±3,000 英尺区间内;route_waypoints会转换为 advisories 的bbox,并向四周各扩展 1°- 即使省略这三项中的任意一项,也仍会生成简报,并指出无法进行的评估
- 报告天气风险,而非是否放行的建议——该决定需要飞行员、航空器和运行最低标准方面的背景信息,而本服务并不掌握这些信息
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及带有可选 OpenTelemetry 跟踪的结构化日志记录。
航空天气专属功能:
- 无需密钥——无需 API 密钥或身份验证;所有数据均来自公开的 AWC Data API
- 单一服务(
aviation-weather-service),针对无需密钥的公共端点提供重试和指数退避 - 除解码后的字段外,还会提供原始编码字符串(
raw_metar、raw_taf、raw_pirep、raw_text),让 Agent 同时获取两种数据 - 州→bbox 表支持查询 AWC API 原生不支持的美国各州站点
- 服务端的
instructions字段会在initialize时向所有客户端显示“非官方简报”安全免责声明
适合 Agent 使用的输出:
- 明确区分的输出——将飞行类别(
VFR/MVFR/IFR/LIFR)作为类型化字符串字段提供,Agent 可据此分支处理,无需解析云幕高度和能见度 - 结构化错误约定——提供带有
recovery提示的类型化reason字段(例如:“使用aviation_find_stations验证 ICAO ID”) - 部分结果对账——批量工具会报告
requested/returned/missing/partial字段,因此不会将不完整的批量结果误认为覆盖完整 - 工作流顺序——
aviation_preflight_brief提示词编码了正确的 METAR → TAF → PIREPs → advisories 顺序,按工具的站点数限制分批处理每个步骤,并指出无法进行的评估
开始使用
公共托管实例
可使用公共托管实例:https://aviation-weather.caseyjhand.com/mcp。将其添加到 MCP 客户端配置中:
{
"mcpServers": {
"aviation-weather": {
"type": "streamable-http",
"url": "https://aviation-weather.caseyjhand.com/mcp"
}
}
}
自托管 / 本地运行
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"aviation-weather": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/aviation-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可以使用 npx(无需 Bun):
{
"mcpServers": {
"aviation-weather": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/aviation-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
也可以使用 Docker:
{
"mcpServers": {
"aviation-weather": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/aviation-weather-mcp-server:latest"
]
}
}
}
对于 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
前置条件
- Bun v1.4.0 或更高版本(或 Node.js v24+)。
- 无需 API 密钥——AWC Data API 完全公开,无需密钥。
安装
- 克隆代码库:
git clone https://github.com/cyanheads/aviation-weather-mcp-server.git
- 进入目录:
cd aviation-weather-mcp-server
- 安装依赖项:
bun install
- 配置环境:
cp .env.example .env
# edit .env if you need to override AWC_BASE_URL or AWC_TIMEOUT_MS
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
AWC_BASE_URL | NWS AWC Data API 的基础 URL。 | https://aviationweather.gov/api/data |
AWC_TIMEOUT_MS | 每个请求的超时时间,单位为毫秒(1000–60000)。 | 10000 |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务的端口。 | 3010 |
MCP_SESSION_MODE | HTTP 会话处理方式:auto(解析为 stateful)、stateful 或 stateless。代码中声明服务为 stateless——这里没有工具需要多轮输入——随附的 .env.example 和 Docker 镜像也固定使用相同值。设置此项会覆盖该声明。 | stateless |
MCP_AUTH_MODE | 身份验证模式:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(RFC 5424)。 | info |
OTEL_ENABLED | 启用 OpenTelemetry 插桩。 | false |
完整的可选覆盖项列表请参阅 .env.example。
运行服务
本地开发
-
构建并运行:
bun run rebuild bun run start:stdio # or bun run start:http -
运行检查和测试:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t aviation-weather-mcp-server .
docker run --rm -p 3010:3010 aviation-weather-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/aviation-weather-mcp-server。默认会安装 OpenTelemetry 对等依赖项——构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖项。
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点——注册工具和提示词,并初始化服务。 |
src/config | 特定于服务的环境变量解析(AWC_BASE_URL、AWC_TIMEOUT_MS)。 |
src/services/aviation-weather | AWC Data API 客户端——HTTP 获取、指数退避重试、响应规范化。 |
src/mcp-server/tools | 工具定义(*.tool.ts)。 |
src/mcp-server/prompts | 提示词定义(*.prompt.ts)。 |
tests/ | 与 src/ 结构相对应的单元测试和集成测试。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简而言之:
- 处理器抛出异常,由框架捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录请求范围的日志,使用ctx.state存储租户范围的数据 - 在
src/index.ts的createApp()数组中注册新工具和提示词 - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;切勿编造缺失字段
并非官方的飞行前简报。 AWC 数据仅供参考。实际飞行计划需要使用获授权的数据源(例如 Leidos/1800wxbrief.com)。服务会通过每次
initialize时发送的instructions字段展示此免责声明。
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0——详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。