关于 open-signals
open-signals 为地图开发者和使用公共事务、环境数据的 Agent 提供数据目录与服务。它将数据整理为带来源、获取时间和许可信息的读数,并提供命令行、REST、MCP 与 GeoJSON 接口。
主要功能
- 01公共数据源目录
- 02含来源和许可信息的标准化读数
- 03灾害、水文、天气等数据抓取器
- 04REST API 与 OpenAPI 描述
- 05GeoJSON 图层和静态数据集
- 06用于查找数据源和抓取数据的命令行
适用场景
- 01编写抓取器前核对数据源覆盖范围和许可
- 02获取地震或洪水读数并用于地图
- 03浏览当前水位或天气数据
- 04通过 MCP 向 Agent 提供公共数据集
MCP 相关
提供基于可流式 HTTP 的无状态只读 MCP 服务,地址为 `/mcp`。工具可搜索数据源、获取读数和地点,并列出图层与数据集或读取数据集分片。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://open-signals.civops.io/mcpclaude mcp add --transport http civops-platform-open-signals https://open-signals.civops.io/mcp{"mcpServers":{"civops-platform-open-signals":{"type":"http","url":"https://open-signals.civops.io/mcp"}}}在 Cursor 中打开{"servers":{"civops-platform-open-signals":{"type":"http","url":"https://open-signals.civops.io/mcp"}}}在 VS Code 中打开{"mcpServers":{"civops-platform-open-signals":{"type":"http","url":"https://open-signals.civops.io/mcp"}}}{"mcpServers":{"civops-platform-open-signals":{"serverUrl":"https://open-signals.civops.io/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
9| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| query | string | 否 | 用于匹配名称、ID、覆盖范围、主题和许可证说明的词语。 |
| topic | string | 否 | 一个主题,例如 weather、water、fires、flights、energy。 |
| license | enum | 否 | public_domain | open | non_commercial | restricted | unknown |
| fetchable | boolean | 否 | true:仅限此服务当前可获取的数据源;false:仅限已编入目录的数据源。 |
详细介绍
open-signals
面向地图和 Agent 的公共数据。每条读数都标明了来源、获取时间和所适用的许可。
open-signals 由三个部分组成:
-
目录:公共数据源目录(
catalog/sources.json)。每个条目都列出 API、覆盖范围、更新频率、所需密钥和许可。涵盖天气、水文、海冰、灾害、航班、船舶、卫星、能源、排放、申报、贸易等。编写另一个数据获取器之前,可以先查阅这个列表。 -
数据获取器:用于获取我们当前读取的数据源。每个获取器都会将上游响应转换为统一格式,即 读数:
{ "id": "noaa-coops:9063085:2026-10-10", "at": "2026-10-10", "metric": "water_level", "value": 2.762, "unit": "ft above LWD", "summary": "Lake Erie at Toledo 2026-10-10: mean 2.76 ft above low water datum (…)", "place": { "id": "coops-toledo", "name": "Lake Erie at Toledo", "lat": 41.6936, "lng": -83.4723 }, "fields": { "station": "9063085", "datum": "LWD", "readings": 155 }, "source": { "id": "noaa-coops", "name": "NOAA CO-OPS water levels", "url": "https://tidesandcurrents.noaa.gov/…", "fetched_at": "2026-10-10T19:12:03Z", "license": "public_domain" } } -
接入方式:CLI、带有 OpenAPI 描述的 REST API、供 Agent 使用的 MCP 服务,以及 GeoJSON 地图图层。没有运行时依赖;需要 Node 20 或更高版本。
使用方法
公共实例运行于 **https://open-signals.civops.io**(REST 位于 /v1,MCP 位于 /mcp)。它只提供公共领域和开源数据,不保存上游密钥,并按 IP 限流。试试 https://open-signals.civops.io/v1/layers/volcanoes?elevated=true。
git clone https://github.com/Civops-Platform/open-signals && cd open-signals # Node 20+, no npm install needed
alias open-signals='node bin/open-signals.mjs'
open-signals sources fires # search the catalogue
open-signals sources --topic water --fetchable
open-signals fetch usgs-earthquakes --min 4.5 --window week
open-signals fetch noaa-coops --coops 8518750 # any CO-OPS station
open-signals fetch open-meteo --lat 41.5 --lng -81.7
open-signals layer water_level # GeoJSON
open-signals serve --port 3290 # REST + MCP
fetch 和 layer 会在你的计算机上运行,并使用你自己的密钥(NASS_API_KEY、EBIRD_API_KEY)。CLI 会打印每个数据源的许可,让你了解可以如何使用获取的数据。
REST
GET /v1/sources?query=&topic=&license=&fetchable= | 搜索目录 |
GET /v1/sources/{id} | 单个条目 |
GET /v1/hubs | 收集数据源的项目(见下文) |
GET /v1/places?tag= | 以 GeoJSON 格式提供的命名地点 |
GET /v1/readings?source={id}&place=&tag=&lat=&lng=&coops=&usgs=&ebird=&state=&bbox=&metric=&since=&limit= | 读数 |
GET /v1/layers · GET /v1/layers/{id}?date= | 以 GeoJSON 格式提供的地图图层 |
GET /openapi.json | 完整描述 |
CESMII i3X
相同图层也作为只读的 CESMII i3X 1.0 端点提供,地址为
https://open-signals.civops.io/i3x/v1。地址空间包含一个根目录、每个图层对应一个文件夹,以及每个地点或事件对应一个对象。每个对象的值是其最新读数(值、质量、时间戳),并附有来源和许可;其历史记录包含该地点的所有读数。订阅支持同步和服务器发送事件流。
CESMII 一致性测试套件(构建 6,运行于 2026 年 10 月 10 日)评定其为 i3X 1.0 Compatible:通过 50 项,失败 0 项,跳过 10 项(报告)。跳过的测试是写入测试;完全符合规范需要支持写入,而重新发布公共数据的服务没有需要写入的内容。
规范要求对数据端点进行身份验证,因此提供了一个免费的公共只读令牌:
os-public-read(发送 Authorization: Bearer os-public-read)。GET /i3x/v1/info 无需身份验证。
静态数据集
变化缓慢的数据以 GeoJSON 文件形式提供,而不是实时获取:过去 20 年的野火过火范围
(NIFC WFIGS 和 USFS MTBS,每个州一个文件)、各县公共土地占比(USGS PAD-US 4.1)、联邦露营地(RIDB)和火险天气站(RAWS),均属于公共领域。GET /v1/datasets 会列出这些数据集及其来源、许可和分块;GET /v1/datasets/{id}/{part} 会返回一个分块(两位字母的州代码,或 all)。部署时将 OPEN_SIGNALS_DATA_DIR 指向一个包含这些文件和 index.json 的文件夹;格式说明见 src/datasets.js。
MCP
POST /mcp 使用可流式 HTTP 传输(JSON-RPC 2.0)。它是无状态的,无需身份验证。所有工具均为只读:
search_sources、get_source、list_hubs、list_placesget_readings、list_layers、get_layerlist_datasets、get_dataset_part
将其添加到客户端:
{ "mcpServers": { "open-signals": { "type": "http", "url": "https://open-signals.civops.io/mcp" } } }
许可:服务将重新发布的内容
代码采用 Apache-2.0 许可。数据并非由我们拥有,无法由我们重新授权。 每个来源都保留自己的条款,读取时也会一并附带许可。运行中的服务会重新发布数据,因此会执行以下限制:
| 许可 | 示例 | 是否提供 |
|---|---|---|
public_domain | NOAA、USGS、USDA、NASA FIRMS、SEC | 始终提供 |
open | CC BY、ODbL(OpenStreetMap、adsb.lol、ECMWF、GDELT) | 始终提供;同时附带署名信息 |
non_commercial | Open-Meteo 免费套餐、eBird、OpenSky | 仅在设置 OPEN_SIGNALS_NONCOMMERCIAL=1 时提供(即你运行的是非商业部署) |
restricted | Google 3D Tiles、TomTom | 永不提供 |
unknown | 尚未审核的任何内容 | 永不提供 |
被拒绝的来源会返回 451,并说明许可及拒绝原因。使用 CLI 为自己获取内容不属于重新发布,因此不受此限制。
当前的获取器
| source | 说明 | key |
|---|---|---|
usgs-earthquakes | 全球地震,按时间窗口和最低震级筛选 | — |
usgs-volcanoes | 每座受监测美国火山的警报级别和航空颜色代码 | — |
noaa-nwps | 区域范围内每个 NOAA 水文站的河流水位和洪水类别(实测和预测) | — |
epa-echo | 各州受 EPA 监管的主要设施,包括合规状态和罚款 | — |
openfda-recalls | 过去 60 天的 FDA 食品、药品和器械召回信息,按企业 ZIP 邮编筛选 | — |
usaspending | 过去 30 天金额最高的 100 项联邦新合同授予,按履约地点 ZIP 邮编筛选 | — |
gbif | 过去两周全球开放许可(CC0、CC-BY)的野生动植物观测数据,按类别和区域范围筛选 | — |
nasa-eonet | 全球开放自然事件(风暴、野火、火山、洪水、冰),最新位置 | — |
world-bank | 按国家查询世界银行指标,位置取首都:GDP 增长、通胀、制造业、出口、FDI、失业率 | — |
emsc | 全球 EMSC-CSEM 地震,欧洲地区最密集(CC BY 4.0),按时间窗口和最低震级筛选 | — |
noaa-ibtracs | 所有活动热带气旋的最新最佳路径定位,涵盖所有海盆 | — |
eurostat | 各国工业生产(指数或同比),最新月份,位置取首都 | — |
gem-trackers | Global Energy Monitor Global Integrated Power Tracker(CC BY 4.0,2026-08 版本):按国家、燃料和状态查询 50 MW 及以上的运营中或在建电厂(取代自 2021 年起未更新的 WRI 数据库) | — |
openfema | 过去 90 天的 FEMA 灾害声明,位置取县(或州)中心点 | — |
usda-ams-barge | 密西西比河、伊利诺伊河、俄亥俄河和阿肯色河七座船闸的每周下行谷物吨位(USDA AMS,数据来自 USACE LPMS) | — |
bts-border-crossings | 美国与加拿大、美国与墨西哥各入境口岸的入境卡车、火车和车辆数量,最新月份 | — |
epa-tri | 有毒物质排放清单:各州每个设施的现场排放量,最新报告年度 | — |
epa-campd | EPA 无需密钥的批量文件中,各州每个设施的电厂 CO2、SO2 和 NOx 排放量,最新月份 | — |
noaa-coops | 任意 CO-OPS 站点的水位(五大湖站点为 LWD,潮汐站点为 MLLW) | — |
usgs-water | 任意 USGS 水文站的河流流量和水位 | — |
glerl | 五大湖冰盖范围(12 月至 5 月) | — |
usda-nass | 全国及各州每周作物生长进度和状况 | NASS_API_KEY(免费) |
open-meteo | 任意地点过去 92 天及未来 7 天的逐日天气 | —(非商业用途) |
waterfowl-wsi | 基于 Open-Meteo 的鸭类天气严重指数(Schummer et al. 2010) | —(非商业用途) |
ebird | 过去 7 天在 eBird 区域内报告的水禽 | EBIRD_API_KEY(免费,非商业用途) |
open-meteo-flood | GloFAS 全球约百个大型河流地点的今日河流流量,附每周变化和 30 天集合预报最高值 | —(非商业用途) |
open-meteo-air | CAMS 模型预测的 150 个大城市当前空气质量:美国 AQI、欧洲 AQI、PM2.5、PM10 | —(非商业用途) |
adsb-lol | 来自 adsb.lol 接收器网络的实时飞机信息(ODbL):任意点周围的飞机(mode=area)、全球所有被标记为军用的飞机(mode=military),或根据飞机位置精度推断的每个 1° 网格单元 GPS 干扰情况(mode=gps,采用 GPSJam 方法)。绝不提供参与 FAA LADD 和 PIA 隐私计划的飞机信息 | — |
nasa-firms | 来自无需密钥的全球文件的 NASA FIRMS VIIRS 热点探测:过去 24 小时的火情(mode=fires)、最近 7 天中至少 3 天出现热点的约 1 km 热点(mode=persistent,派生数据:工业、火炬、火山),以及 Global Energy Monitor 四个跟踪器中每个热点地点的高温天数、所有者和母公司:高炉和 DRI 钢铁厂(mode=steel)、水泥窑(mode=cement)、化工厂(mode=chemicals)以及油气田(mode=oil_gas,火炬燃烧),以上均为派生数据 | — |
nws-alerts | 当前有效的 National Weather Service 监视、警告和公告;每项警报在每个县对应一个点;可按州、类别或事件筛选 | — |
usbr-rise | Bureau of Reclamation 在西部约 215 座水库的每日蓄水量(RISE),附每周变化;可按 Reclamation 区域筛选 | — |
digitraffic-ais | 芬兰水域和波罗的海北部的实时船舶位置(Fintraffic,CC BY 4.0),附名称、类型和目的地;绝不提供游艇信息 | — |
corroboration | 派生数据:同一事件由两个或一个独立来源观测到。USGS 和 EMSC 的地震(转发的 USGS 网络解算结果只计一次),以及美国野火事件与 FIRMS 卫星热点的比对 | — |
smithsonian-gvp | Smithsonian Volcanoes of the World:全球自 1900 年以来喷发过的火山,以及当前正在喷发的火山 | —(非商业用途) |
观测值、建模值或推导值
传感器读数和据此得出的结论并不是一回事,因此每条读数都会注明它属于哪一种。没有 basis 表示数据由某种设备观测到(例如仪表、地震仪或接收器)。basis: "modelled" 表示数据由模型输出(例如 Open-Meteo 天气、GloFAS 流量、CAMS 空气质量)。basis: "derived" 表示数据由其他读数推断得出,并通过 derived_from 说明来源(例如根据飞机 NACp 推断的 GPS 干扰、根据建模天气得出的鸭子天气严重程度指数、根据 FIRMS 探测结果得出的持续高温和钢铁厂热量,以及关联佐证:将同一事件的两个来源配对,并说明表面上的第二个来源何时只是在转发第一个来源)。图层要素始终带有 basis。
目录中的其余来源已列出,但尚未获取数据。添加数据获取器是最有用的贡献;请参阅 CONTRIBUTING.md。
枢纽
catalog/hubs.json 列出了我们关注的项目,方便我们每次无需从头搜索:
- God's Eye View(Bilawal Sidhu 和 Sameh Khamis)
- World Monitor
- OSIRIS 和 WorldWideView
- Shadowbroker、ULTOR 和 Gemini / Claude Earth(基于 God's Eye View 方案的社区构建版本)
- 官方 MCP Registry 和 awesome-mcp-servers
- Source Cooperative、AWS Open Data 注册表、Data.gov 和 public-apis
通过其中某个项目找到来源时,该来源条目会在 found_via 中记录这一信息。
运行
npm test # offline, upstreams stubbed
npm run test:live # every fetcher against its real upstream, then REST and MCP
PORT=3290 npm start
| 变量 | 含义 |
|---|---|
PORT | 默认值为 3290 |
OPEN_SIGNALS_NONCOMMERCIAL=1 | 此部署为非商业用途,可重新发布非商业来源的数据 |
RATE_LIMIT_PER_MIN | 按客户端 IP 限制,默认值为 60 |
TRUST_PROXY=1 | 通过代理时,从 X-Forwarded-For 读取客户端 IP |
响应会按来源、地点和参数缓存在内存中(地震数据缓存 2 分钟,每周更新的来源最长缓存 6 小时),以免给上游造成过多请求。
不作保证
open-signals 会转发公共机构和项目发布的内容,不作改动。上游的读数可能延迟、尚属初步数据、经过修订或存在错误。本项目按“原样”提供(参见 LICENSE),不得用于导航、安全保障或任何无法容忍错误读数的决策。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。