关于 nws-weather-mcp-server
nws-weather-mcp-server 通过美国国家气象局 API 提供天气预报、实时观测和预警信息,面向需要查询美国天气的工作流。它还可查询气象站历史记录、区域预报和气象办公室讨论内容,无需 API 密钥。
主要功能
- 01获取七天或逐小时预报
- 02按区域和事件筛选预警
- 03查询当前观测与站点历史
- 04查找附近气象观测站
- 05获取区域预报与办公室讨论
适用场景
- 01查看某个坐标的天气预报
- 02筛选州、区域或事件的活动预警
- 03检查站点近期天气观测
MCP 相关
作为 MCP 服务,它向客户端提供美国国家气象局的预报、预警、观测、站点和讨论查询工具,并提供预警事件类型资源。支持 STDIO 与 Streamable HTTP。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://nws.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-nws-weather https://nws.caseyjhand.com/mcp{"mcpServers":{"cyanheads-nws-weather":{"type":"http","url":"https://nws.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-nws-weather":{"type":"http","url":"https://nws.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-nws-weather":{"type":"http","url":"https://nws.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-nws-weather":{"serverUrl":"https://nws.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
10| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| cursor | string | 否 | 来自先前响应中 nextCursor 的不透明续传令牌,用于获取接下来的 48 个时段。首次请求时省略。每次调用都会重新获取预报,因此同一响应中的连续时段是连续的;NWS 会在一天内多次重新发布预报,因此后续调用可能会对重新生成的时段数组进行分页。 |
| hourly | boolean | 否 | 如果为 true,则返回逐小时预报(每页 48 个一小时预报时段,约有 156 个),而不是按名称划分的 12 小时预报时段(14 个)。逐小时预报包含露点和相对湿度。 |
| latitude | number | 是 | 十进制度数的纬度(例如,47.6062)。 |
| longitude | number | 是 | 十进制度数的经度(例如,-122.3321)。 |
详细介绍
@cyanheads/nws-weather-mcp-server
通过国家气象局 API 获取美国天气预报、正在生效的预警和当前观测数据。支持 STDIO 或 Streamable HTTP。
公共托管服务: https://nws.caseyjhand.com/mcp
概述
来自国家气象局的美国实时天气信息:覆盖 50 个州和美国属地任意地点的天气预报、正在生效的预警、当前状况和预报员讨论内容,此外还包括区域预报、沿海和海洋预警,以及一周的气象站历史记录。无需 API 密钥。
工具
| 工具 | 描述 |
|---|---|
nws_get_forecast | 按坐标提供 7 天或逐小时天气预报。内部解析 NWS 网格。 |
nws_search_alerts | 按区域、地点、分区、事件、严重程度、紧迫性、确定性和状态筛选正在生效的天气预警。 |
nws_get_alert | 按 ID 获取一条预警消息,可以是当前预警或已被取代的预警(保留约 7 天)。 |
nws_get_alert_counts | 获取全国、各州/属地或海洋区域,以及各海洋分区的生效预警数量。 |
nws_get_observations | 按坐标(最近的气象站)或气象站 ID 获取当前状况。 |
nws_get_observation_history | 获取气象站最近的观测数据,按时间从新到旧排列;可分页查看 NWS 保留的约 7 天数据。 |
nws_find_stations | 查找附近的观测气象站,按距离排序并显示方位。 |
nws_list_alert_types | 列出所有有效的预警事件类型名称,以便发现可用筛选项。 |
nws_get_office_discussion | 获取气象预报办公室发布的最新叙述性产品(AFD、HWO、ZFP、SPS、FWF);如果产品太大而无法内联返回,则会返回章节大纲。 |
nws_get_zone_forecast | 获取 NWS 预报分区的文字预报时段。 |
资源
| 资源 | 描述 |
|---|---|
nws://alert-types | 所有有效 NWS 警报事件类型名称的静态列表。 |
也可通过 nws_list_alert_types 工具访问,适用于不支持资源的 MCP 客户端。
功能参考
nws_get_forecast 工具
latitude+longitude;默认返回 14 个命名的 12 小时时段(约 7 天),或设置hourly: true后返回逐小时时段,包含露点和湿度;上游约 156 个时段,每页 48 个nextCursor会携带其模式,因此按小时遍历时无需重新发送hourly: true,后续页面会继续按小时返回include_amounts: true会将每个原生quantitativePrecipitation、snowfallAmount和iceAccumulation时段作为precipitationAmounts(包含layer、uom、带有validTime和value的values)添加,并另行提供amountsUpdateTime。默认为 false;任何需要降水量的游标页面都需重新发送此参数。时段字符串、单位、零值和 null 值均保持不变。缺失的图层和不可用的降水量会在notice中说明;存在但为空的图层会包含values: []。缺失的单位或更新时间为 null。降水量数据源不可用时,主要预报仍可用。- 返回
updateTime(网格预报数据的最近更新时间),与generatedAt并列;若网格超过 24 小时未更新,则会通过notice发出提示 - 返回
forecastZone和county区域代码,可用于后续调用nws_search_alerts - 海洋坐标会因
marine_forecast_unsupported失败;NWS 未提供预报网格的陆地点会因no_forecast_grid失败
nws_search_alerts 工具
- 最多指定一个位置筛选条件(
area、point、zone、region_type或region),也可不指定以进行全国搜索;event不区分大小写并支持部分匹配;status默认为Actual(也可为Exercise、System、Test、Draft) limit(默认为 25)上限为 25;若指定更大的值,则按 25 条返回,并通过requestedLimit/effectiveLimit报告nextCursor会携带查询筛选条件和每页大小,因此只需将其作为cursor传回;随其发送的筛选条件会被忽略- 每个
affectedZones条目都包含其区域type(forecast/county/fire);references按sent从新到旧列出已被取代的消息;NWS 覆盖范围外的point会因invalid_point失败 - 每条警报都包含
office(签发办公室代码,可用于调用nws_get_office_discussion,例如RIW)、原始vtec字符串、nwsHeadline,以及maxHailSize和maxWindGust等hazard标签,内容原样保留
nws_get_alert 工具
alert_id:来自nws_search_alerts的警报id,或任意警报中references[].identifier的值;返回与nws_search_alerts结构相同的{ alert },包括已被取代的消息- 格式错误的 ID、未知 ID,以及超出 NWS 约 7 天保留期限的 ID 均会因
alert_not_found失败
nws_get_alert_counts 工具
- 无输入;返回全国
totalAlerts(landAlerts+marineAlerts),以及按州/地区或海洋区域代码统计的areas数量和按海洋区域统计的regions数量(AL、AT、GL、GM、PA、PI);两者都只列出存在有效警报的代码 - 统计涵盖所有消息状态,包括 Test 和 Exercise,因此
totalAlerts可能高于全国nws_search_alerts的totalCount(status: Actual为默认值);每条警报会在其所属的每个区域各计一次,因此areas的总和可能超过totalAlerts
nws_get_observations 工具
- 可按坐标查询(解析到最近的站点),也可直接使用
station_id - 每项测量都以双单位显示(F/C、mph/km/h、inHg/hPa、mi/km、in/mm),温度精确到小数点后一位;根据每小时报告提供 1 小时、3 小时和 6 小时降水量,其中
0表示微量,null表示未报告降水量;超过 2 小时的观测会附带过时提示,另有单独警告标记大多数测量数据不可用的站点
nws_get_observation_history 工具
station_id(来自nws_find_stations);可选的start(包含)和end(不包含)为 ISO 8601 日期时间,精确到秒并带有偏移量;结果按时间从新到旧排列,最早可追溯到 NWS 保留的约 7 天数据limit(默认值为 24)上限为 100;若设置更大的值,则按 100 返回,并通过requestedLimit/effectiveLimit报告- 每条观测都包含
nws_get_observations的测量字段;若站点未报告某项数据,则该字段为null;未知站点会返回station_not_found错误,时间窗口格式错误或start不早于end时会返回invalid_time_window错误 - 仅当还有更早的观测时才会出现
nextCursor;由于 NWS 不会提供窗口的总数,因此没有totalCount
nws_find_stations 工具
latitude+longitude;可选的limit(默认值为 10)上限为 50;若设置更大的值,则按 50 返回,并通过requestedLimit/effectiveLimit报告- 按距离从近到远排列;每条结果都包含用于
nws_get_observations的站点 ID、距离(km)、方位、区域代码、海拔和时区
nws_list_alert_types 工具
- 返回 NWS API 识别的所有事件类型(例如,“Tornado Warning”“Heat Advisory”)
- 用于查找
nws_search_alerts中event过滤条件的有效值
nws_get_office_discussion 工具
office:通常为 3 个字母的 WFO 代码(例如西雅图对应的 “SEW”),由nws_get_forecast作为office字段返回;product_type:AFD(默认值)、HWO、ZFP、SPS或FWF(Fire Weather Planning Forecast)- 返回
productText,以及issuanceTime、issuingOffice、productName、productCode、wmoCollectiveId;content[]会在text代码块中提供产品文本,以保留定宽表格的列布局;未知办公室,或没有所请求类型当前产品的办公室,会返回no_products错误 - 产品过大,无法以内联方式返回(大多数 ZFP 和 FWF)时,会返回各部分的
outline,而不是productText;传入sections(AFD 部分名称,或 ZFP/HWO/SPS/FWF 的区域代码)以获取对应部分;未知名称会返回unknown_section错误 - 类型为
fire的预警区域,其预报来自 FWF:使用预警的office字段作为office,设置product_type: "FWF",并设置sections: [<zone code>]
nws_get_zone_forecast 工具
zone_id:预报区域代码(例如,“WAZ315”)——由nws_get_forecast(forecastZone)、nws_find_stations(forecastZone列)和nws_search_alerts(affectedZones条目中type: "forecast"的code)返回- 返回各时段的名称(例如,“Today”“Tonight”“Monday”)以及当地预报员撰写的文字说明
- 县代码(
XXC###)和未知区域代码会返回zone_not_found错误;大多数火灾区域代码也会返回此错误,因为其预报来自nws_get_office_discussion中该办公室 FWF 对应的部分;同时也是公共区域代码的火灾代码会返回公共区域的预报;没有文字预报的海洋区域会返回marine_forecast_unsupported错误,没有文字预报的陆地区域会返回zone_forecast_unavailable错误
nws://alert-types 资源
- 包含所有有效 NWS 预警事件类型名称的静态列表,以
application/json格式返回 - 无参数;公开缓存 1 小时
功能特性
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔的身份验证(none / jwt / oauth)、可切换的存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),以及带有可选 OpenTelemetry 跟踪的结构化日志记录。
NWS 专属功能:
- 自动发送必需的
User-Agent标头(可通过NWS_USER_AGENT配置)——没有该标头时,NWS 会返回 403 - 通过
/points自动将坐标解析为网格,并缓存 1 小时,因为网格单元很少变化 - 针对 NWS API 的暂时性故障设置请求超时并进行重试和退避
- 无需身份验证——不需要 API 密钥
- 分页结果——将返回的
nextCursor作为cursor传入以获取下一页(最后一页会省略该字段)
便于 Agent 使用的输出:
- 来源信息——响应会回显办事处代码、时区和区域代码,便于 Agent 接续调用
nws_get_office_discussion、nws_get_zone_forecast和nws_search_alerts - 提供指引,而非沉默——结果为空、被截断或游标超出末尾时,会附带说明原因和后续步骤的
notice - 提供类型化错误原因(
invalid_area_code、no_products、zone_not_found,……),让调用方根据数据分支,而不必解析字符串 - 双单位测量值(F/C、mph/km/h、inHg/hPa、mi/km、in/mm),并进行四舍五入以匹配文本输出
开始使用
公共托管实例
可通过 https://nws.caseyjhand.com/mcp 使用公共实例——无需安装。该实例提供 Streamable HTTP;每个客户端的配置格式各不相同。
Claude Code 配置:
claude mcp add --transport http nws-weather-mcp-server https://nws.caseyjhand.com/mcp
Cline 配置(cline_mcp_settings.json):
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "streamableHttp",
"url": "https://nws.caseyjhand.com/mcp"
}
}
}
Cursor 配置(mcp.json):
{
"mcpServers": {
"nws-weather-mcp-server": {
"url": "https://nws.caseyjhand.com/mcp"
}
}
}
Claude Desktop 可在“设置”→“连接器”下添加远程服务。
自托管 / 本地部署
将以下内容添加到 MCP 客户端配置文件中。
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/nws-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 npx(无需 Bun):
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/nws-weather-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 Docker:
{
"mcpServers": {
"nws-weather-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/nws-weather-mcp-server:latest"]
}
}
}
要使用 Streamable HTTP,请设置传输方式并启动服务:
MCP_TRANSPORT_TYPE=http MCP_SESSION_MODE=stateless MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
先决条件
安装
- 克隆代码库:
git clone https://github.com/cyanheads/nws-weather-mcp-server.git
- 进入目录:
cd nws-weather-mcp-server
- 安装依赖:
bun install
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
NWS_USER_AGENT | NWS API 请求使用的 User-Agent。API 要求提供此标头。 | (nws-weather-mcp-server, ...) |
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_PORT | HTTP 服务的端口。 | 3010 |
MCP_HTTP_HOST | HTTP 服务的主机名。 | 127.0.0.1 |
MCP_SESSION_MODE | HTTP 会话模式:stateful、stateless 或 auto。 | stateless |
MCP_LOG_LEVEL | 日志级别:debug、info、notice、warning、error。 | info |
完整列表(包括身份验证、存储和 OpenTelemetry 选项)请参阅 .env.example。
运行服务
本地开发
-
构建并运行生产版本:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio -
运行检查和测试:
bun run devcheck # Lints, formats, type-checks bun run test # Runs test suite
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | createApp() 入口点——注册工具和资源。 |
src/mcp-server/tools/definitions/ | 工具定义(*.tool.ts)。 |
src/mcp-server/resources/definitions/ | 资源定义(*.resource.ts)。 |
src/services/nws/ | NWS API 客户端和响应类型。 |
src/config/ | 使用 Zod 解析并验证环境变量。 |
tests/ | 与 src/ 结构对应的单元测试和集成测试。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md。简要说明:
- 处理程序抛出异常,由框架捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录领域特定日志,使用ctx.state进行存储 - 将新工具/资源添加到 barrel 导出,以及
src/index.ts中的createApp()数组 - 封装 NWS API 调用:验证原始 JSON → 规范化为领域类型 → 返回输出模式;绝不捏造缺失字段
贡献
欢迎提交问题。提交前请运行检查:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。