关于 noaa-marine-mcp-server
提供 NOAA CO-OPS 和 NDBC 美国海岸及海洋观测数据的 MCP 服务。可查找站点并获取潮汐、水位、潮流和浮标数据。
主要功能
- 01查找 CO-OPS 站点和 NDBC 浮标
- 02获取潮汐预测和水位观测
- 03获取潮流预测和剖面
- 04读取浮标实时天气与海况
- 05查询海洋水柱观测
适用场景
- 01查看沿海站点的潮汐预测
- 02对比实测水位与预测值
- 03查看浮标风、浪和温度读数
- 04按深度检查洋流或水质
MCP 相关
向 MCP 客户端提供 8 个工具和站点元数据资源,支持 STDIO 与 Streamable HTTP 传输。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://noaa-marine.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-noaa-marine https://noaa-marine.caseyjhand.com/mcp{"mcpServers":{"cyanheads-noaa-marine":{"type":"http","url":"https://noaa-marine.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-noaa-marine":{"type":"http","url":"https://noaa-marine.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-noaa-marine":{"type":"http","url":"https://noaa-marine.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-noaa-marine":{"serverUrl":"https://noaa-marine.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
8| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| limit | integer | 否 | 要返回的站点最大数量。默认值为 20。 |
| query | string | 否 | 要匹配的站点名称或站点 ID 子串,不区分大小写,同时匹配两个来源。例如,"seattle"、"puget sound"、"9447130"、"46041"。除非提供了纬度/经度(此时邻近搜索按距离排序),否则 ID 完全匹配的站点会排在名称匹配之前。空白或仅含空白字符的值会被视为未提供。 |
| state | enum | 否 | 按 2 位美国州或地区代码筛选。仅适用于 CO-OPS 站点——提供此项会将结果限制为 CO-OPS,并排除 NDBC 浮标(浮标不包含州信息)。站点可按其自身目录代码匹配;如果其目录行没有州代码(所有海流站点均如此),则按 25 km 内最近的、带州信息的 CO-OPS 潮汐或水位站点所属州匹配;在跨州或跨国界的水域中,这种匹配可能有误。例如,"WA"、"CA"、"PR"。AL | AK | AZ | AR | CA | CO | CT | DE | FL | GA | HI | ID | IL | IN | IA | KS | KY | LA | ME | MD | MA | MI | MN | MS | MO | MT | NE | NV | NH | NJ | NM | NY | NC | ND | OH | OK | OR | PA | RI | SC | SD | TN | TX | UT | VT | VA | WA | WV | WI | WY | DC | PR | VI | GU | AS | MP |
| types | array | 否 | 按数据能力或 NDBC 平台类别筛选。每个返回的站点至少匹配一个请求值:能力值与其能力列表匹配,或 buoy 与其平台类别匹配。省略则返回所有站点。 |
| source | enum | 否 | 要搜索的数据源:coops(潮汐/水位/海流站)、ndbc(浮标)或 all(默认)。coops | ndbc | all |
| latitude | number | 否 | 用于邻近搜索的中心纬度,单位为十进制度。必须与 longitude 一起提供;仅提供其中一个会被拒绝,而不会静默忽略。可选择与 radius_km 配对使用。 |
| longitude | number | 否 | 用于邻近搜索的中心经度,单位为十进制度。必须与 latitude 一起提供;仅提供其中一个会被拒绝,而不会静默忽略。可选择与 radius_km 配对使用。 |
| radius_km | number | 否 | 提供 latitude/longitude 时使用的搜索半径,单位为千米。默认值为 100 km。 |
详细介绍
@cyanheads/noaa-marine-mcp-server
查找 NOAA 潮汐站和 NDBC 浮标,通过 MCP 获取潮汐预报、水位、潮流和实时浮标状况。支持 STDIO 或 Streamable HTTP。
概述
通过 NOAA CO-OPS 和 NDBC 获取美国潮汐、潮流、水位和浮标观测数据。查找沿海站点和浮标,然后获取潮汐和潮流预报、观测水位和月平均水位,以及实时浮标状况、流速剖面和水柱读数。
工具
| 工具 | 描述 |
|---|---|
noaa_marine_find_stations | 按位置、名称、ID、州或能力查找 CO-OPS 潮汐、水位和潮流站点,以及 NDBC 浮标 |
noaa_marine_get_tide_predictions | 获取 CO-OPS 潮汐站的高潮/低潮预报或 6 分钟曲线 |
noaa_marine_get_water_level | 获取四种时间间隔的观测水位,并附带预报和风暴潮残差 |
noaa_marine_get_monthly_means | 获取 CO-OPS 水位站经核实的月度潮汐基准面和极值 |
noaa_marine_get_currents | 获取 CO-OPS 潮流预报:最大涨潮流、最大落潮流和平潮事件,或 6 分钟曲线 |
noaa_marine_get_conditions | 获取 NDBC 浮标实时状况:海浪、风、海表温度、气温和气压 |
noaa_marine_get_current_profile | 获取 NDBC ADCP 浮标观测到的海流深度剖面 |
noaa_marine_get_ocean_observations | 获取 NDBC 站点的次表层水柱读数(温度、盐度、氧气等) |
资源
| 资源 | 描述 |
|---|---|
noaa-marine://station/{station_id} | CO-OPS 或 NDBC 站点的元数据:名称、坐标、来源、能力、预测类别、平台 |
除 NDBC 的 owner 外,资源中的所有信息也会出现在 noaa_marine_find_stations 的结果行中,供只调用工具的客户端使用。
能力参考
noaa_marine_find_stations 工具
- 筛选条件可组合使用:
latitude和longitude搭配radius_km(默认值为 100,最大值为 1000);query(在两个来源中按名称或 ID 子字符串匹配;如果按距离排序,精确 ID 匹配会优先);state(仅 CO-OPS);source(coops/ndbc/all);以及types(tide、current、water_level、met、current_profile、water_quality,或平台类别buoy);limit默认值为 20,最大值为 200 - 每个站点都包含
source、capabilities、type;NDBC 站点还包含platform。CO-OPS 结果行会添加state(如果借用 25 km 内最近的、带有州信息的站点,则state_derived: true)、潮汐prediction_class(reference,或带有reference_id的subordinate),以及洋流bins[],其中列出每个分层的编号、深度(英尺)和类别 total_found和truncated报告应用limit前的数量;无匹配项时仍为成功,并包含applied_search;目录读取不完整时会在sources中标记;目录完全不可用时会返回sources_unavailable;仅提供latitude或longitude时会返回incomplete_coordinates
noaa_marine_get_tide_predictions 工具
interval可设为hilo(默认值)或6min,最长 365 天;十种基准面(MLLW、MHHW、MHW、MTL、MSL、MLW、DTL、NAVD、STND、CRD)、time_zone(lst_ldt、gmt、lst)和units(english英尺、metric米)6min仅适用于基准站:从属站点会以subordinate_no_6min失败,并指出其基准站;五大湖站点会返回no_predictions,并指向noaa_marine_get_water_level- 其他失败情况:
invalid_date_range、date_range_exceeded、station_not_found、datum_unavailable(列出站点所具有的基准面)以及upstream_throttled(可重试的 CO-OPS HTTP 403,几分钟后会解除)
noaa_marine_get_water_level 工具
interval可设为6min(默认值,31 天)、hourly或high_low(365 天),或daily_mean(3,655 天,仅限五大湖,始终使用 LST;沿海站点会返回great_lakes_only);十三种基准面(MLLW、MHHW、MHW、MTL、MSL、MLW、NAVD、STND、IGLD、LWD、CRD、LWI、HWI)- 观测数据包含
quality(p/v,仅限6min)、sigma(6min和hourly)以及type(H/HH/L/LL,仅限high_low);没有读数的时间段会被丢弃,并计入gaps_dropped - 会提供匹配间隔的配对预测(
daily_mean除外),并通过predictions_status(empty/unavailable)说明序列为空的原因;residual_summary(max_surge、max_drawdown)涵盖整个匹配范围,仅适用于6min和hourly。失败情况:invalid_date_range、date_range_exceeded、station_not_found、datum_unavailable、no_data、verified_data_lag(较粗时间间隔的数据窗口结束于上个月第一天或之后;CO-OPS 可能尚未完成验证)以及upstream_throttled
noaa_marine_get_monthly_means 工具
- 每次请求最多 73,000 天;支持十一个基准面(MLLW、MHHW、MHW、MTL、MSL、MLW、NAVD、STND、IGLD、LWD、CRD),单位为
english英尺或metric米;返回的首尾月份分别是begin_date和end_date所属的月份 - 每月一行:
highest、lowest、潮汐基准面(mhhw、mhw、msl、mtl、mlw、mllw、dtl)、潮差(gt、mn、dhq、dlq)、以小时为单位的月潮间隔(hwi、lwi),以及原样返回的inferred代码;CO-OPS 留空的值会被省略,因此五大湖站点只包含highest、msl和lowest - 错误:
invalid_date_range、date_range_exceeded、station_not_found、datum_unavailable、upstream_throttled;对于空时间窗口,如果结束日期为上个月 1 日或之后,则返回verified_data_lag,否则返回no_data
noaa_marine_get_currents 工具
interval为MAX_SLACK(默认值:最大涨潮、最大落潮和憩流事件)或6min,最多 365 天;bin从bins[]中选择深度层(默认为最浅层);units为english(节、英尺)或metric(厘米/秒、米)- 每个响应都会回显
bin和depth;各行包含flood/ebb/slack类型、非负的speed,以及作为direction返回的该站点此类水流的平均方位 - 如果站点没有请求的深度层,则返回
bin_unavailable并列出可用深度层;CO-OPS 不预测事件的站点会返回空列表,并在notice中附上说明;没有已发布预测的站点则返回predictions_unavailable;还可能返回invalid_date_range、date_range_exceeded、station_not_found、no_predictions和upstream_throttled
noaa_marine_get_conditions 工具
- 一个 NDBC
station_id;返回风、波浪、海表温度、气温、露点和气压,单位为 SI 制,但tide_ft和visibility_nmi除外 - 每个传感器字段都可为空;每个数据列块取自 90 分钟内最新的、包含该数据的行。波浪数据会报告自己的
waves_observed_at,其他较早的数据块则会在notice中注明。错误:buoy_not_found、no_sensor_data
noaa_marine_get_current_profile 工具
- 一个通过
types: ["current_profile"]查找的 NDBCstation_id;bins[]按深度从浅到深排列,包含depth_m、direction_deg(真北基准、流向)和speed_cm_s;后两项在未报告时为 null - 返回观测到的 ADCP 测量数据,而非
noaa_marine_get_currents返回的 CO-OPS 预测数据;错误为profile_not_found(没有 ADCP 文件)和no_current_data
noaa_marine_get_ocean_observations 工具
- 一个通过
types: ["water_quality"]查找的 NDBCstation_id;这是目录标记,不代表一定有数据;readings[]按深度包含行,字段包括温度、电导率、盐度、溶解氧(% 和 ppm)、叶绿素、浊度、pH 和氧化还原电位 - 大多数站点只报告温度和盐度,未报告的值为
null;错误为observations_not_found(没有.ocean文件)和no_ocean_data
noaa-marine://station/{station_id} 资源
station_id来自noaa_marine_find_stations;以application/json格式返回该工具的站点记录;对于 NDBC 站点,还包含owner,并带有 6 小时的cacheHint- 仅在已读取两个目录后才会返回
station_not_found;若其中一个目录无法读取,则返回source_unavailable
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并提供结构化日志和可选的 OpenTelemetry 跟踪。
CO-OPS / NDBC 专属功能:
- CO-OPS 数据和元数据 API,以及 NDBC 活跃站点目录和
realtime2数据流(.txt、.adcp、.ocean);站点目录在内存中缓存 6 小时;CO-OPS 请求会通过NOAA_APPLICATION_ID传递application= - 站点 ID 不会跨数据源混用:CO-OPS 潮汐和水位 ID 为数字(
9447130),CO-OPS 海流 ID 为字母数字组合(ACT4176),NDBC ID 为 5 位代码(46041) - CO-OPS 工具接受格式为
YYYYMMDD或YYYY-MM-DD的begin_date/end_date,并在调用前检查日期是否有效以及各工具的范围上限(invalid_date_range、date_range_exceeded);水位默认使用 MLLW,若站点不支持指定基准面,则会返回datum_unavailable并列出该站点支持的基准面 - CO-OPS 每月会针对前一个月验证
hourly、high_low、daily_mean和月平均值:如果空数据窗口结束时间在前一个月 1 日或之后,则返回verified_data_lag;更早的窗口则返回no_data - CO-OPS 在短时间内收到大量请求时,会持续约两分钟返回 HTTP 403;CO-OPS 数据工具会将其报告为可重试的
upstream_throttled,并在恢复信息中说明等待时长
便于 Agent 使用的输出:
- 四种 CO-OPS 时间序列工具支持按字节数限制分页:适合单页的数据范围会完整返回;较长的数据范围则返回开头一页,并附带
rows_matched、rows_returned、page_offset和next_offset,使用offset翻页(limit会缩小页面) - 缺失值会表示为
null或省略,绝不会伪造:NDBC 的MM标记会变为null,CO-OPS 的空值会被丢弃,quality不会被设置默认值,而是直接省略 - 使用带有明确类型的字段:站点
source(coops|ndbc)、能力type、NDBCplatform和prediction_class;每个 CO-OPS 水位响应都会附带基准面和单位,方便调用方根据数据而非字符串解析来分支处理
快速开始
公共托管实例
公共实例位于 https://noaa-marine.caseyjhand.com/mcp,无需安装或 API 密钥。该实例使用 Streamable HTTP;每个客户端都有各自的配置格式。
对于 Claude Code:
claude mcp add --transport http noaa-marine-mcp-server https://noaa-marine.caseyjhand.com/mcp
对于 Cline(cline_mcp_settings.json):
{
"mcpServers": {
"noaa-marine-mcp-server": {
"type": "streamableHttp",
"url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
}
对于 Cursor(mcp.json):
{
"mcpServers": {
"noaa-marine-mcp-server": {
"url": "https://noaa-marine.caseyjhand.com/mcp"
}
}
}
Claude Desktop 可在 Settings → Connectors 下添加远程服务。
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中:
{
"mcpServers": {
"noaa-marine-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/noaa-marine-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 npx(无需 Bun):
{
"mcpServers": {
"noaa-marine-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/noaa-marine-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
或者使用 Docker:
{
"mcpServers": {
"noaa-marine-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/noaa-marine-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 密钥:NOAA CO-OPS 和 NDBC 都是开放数据源。
安装
- 克隆代码库:
git clone https://github.com/cyanheads/noaa-marine-mcp-server.git
- 进入目录:
cd noaa-marine-mcp-server
- 安装依赖:
bun install
- 配置环境:
cp .env.example .env
# edit .env if needed (all vars optional)
配置
| 变量 | 描述 | 默认值 |
|---|---|---|
NOAA_APPLICATION_ID | 作为 application= 随 CO-OPS 请求发送的标识符。 | noaa-marine-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 会话模式:stateless、stateful 或 auto。 | stateless |
MCP_AUTH_MODE | 身份验证:none、jwt 或 oauth。 | none |
MCP_LOG_LEVEL | 日志级别(debug、info、warning、error 等)。 | info |
LOGS_DIR | 日志文件目录(仅 Node.js)。 | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 记录每次失败工具调用的参数和结果(仅按键名脱敏),并受 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES 限制。 | false |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
OTEL_EXPORTER_OTLP_ENDPOINT | OTLP 基础 URL;跟踪和指标会导出到其下的 /v1/traces 和 /v1/metrics。 | — |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | 用于选择性启用 OTLP 日志导出的端点;基础 URL 本身不会启用日志导出。 | — |
完整的可选覆盖项列表请参阅 .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 noaa-marine-mcp-server .
docker run --rm -p 3010:3010 noaa-marine-mcp-server
Dockerfile 默认使用 HTTP 传输、无状态会话模式,并将日志写入 /var/log/noaa-marine-mcp-server。默认会安装 OpenTelemetry 对等依赖——构建时使用 --build-arg OTEL_ENABLED=false 可省略这些依赖。
项目结构
| 路径 | 用途 |
|---|---|
src/index.ts | createApp() 入口:注册工具和资源,并初始化服务。 |
src/config/ | 使用 Zod 解析 NOAA_APPLICATION_ID 环境变量。 |
src/services/coops/ | CO-OPS 客户端:站点目录缓存、数据获取、错误分类、日期范围验证、行分页和州解析。 |
src/services/ndbc/ | NDBC 服务:活动站点 XML 和 realtime2 数据流解析器。 |
src/services/geo.ts | 用于邻近搜索和州解析的 Haversine 距离计算。 |
src/mcp-server/tools/definitions/ | 八个工具定义(*.tool.ts)。 |
src/mcp-server/resources/definitions/ | 站点元数据资源(noaa-marine-station.resource.ts)。 |
tests/ | 与 src/ 对应的 Vitest 测试。 |
docs/ | 设计文档和目录树。 |
开发指南
开发指南和架构规则请参阅 CLAUDE.md/AGENTS.md。简要内容如下:
- 处理程序抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录请求范围内的日志 - 直接在
src/index.ts中注册工具和资源(本服务不使用汇总导出文件) - 封装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出架构;绝不伪造缺失字段
- NDBC 的
MM值必须规范化为null,不能作为字符串原样传递
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0 — 详情请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。