关于 ioda-outages-mcp-server
这是一款通过 IODA 公共 API 调查互联网中断情况的 MCP 服务。它面向网络研究人员,可查看检测结果、告警、中断事件、实体排名和连接信号,无需 API 密钥。
主要功能
- 01解析国家、地区和 ASN 实体
- 02查看近期中断证据和数据源覆盖
- 03获取中断事件及告警状态变化
- 04按中断评分排列实体
- 05获取 BGP、探测和望远镜信号
适用场景
- 01检查地区或 ASN 的近期中断检测
- 02查看指定时间段内的告警与恢复变化
- 03比较不同实体的中断排名
- 04检查某实体的数值连接信号
MCP 相关
通过 STDIO 或无状态 Streamable HTTP 向 MCP 客户端提供六种 IODA 调查工具,并提供公共托管端点。该服务读取 IODA 公共 v2 API,无需 API 密钥。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://ioda-outages.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-ioda-outages https://ioda-outages.caseyjhand.com/mcp{"mcpServers":{"cyanheads-ioda-outages":{"type":"http","url":"https://ioda-outages.caseyjhand.com/mcp"}}}在 Cursor 中打开{"servers":{"cyanheads-ioda-outages":{"type":"http","url":"https://ioda-outages.caseyjhand.com/mcp"}}}在 VS Code 中打开{"mcpServers":{"cyanheads-ioda-outages":{"type":"http","url":"https://ioda-outages.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-ioda-outages":{"serverUrl":"https://ioda-outages.caseyjhand.com/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| page | integer | 否 | 上游页码,从 0 开始;更改 limit 时从 0 重新开始。 |
| limit | integer | 否 | 上游页大小;超过 100 的值将按 100 处理并附带通知。继续翻页时保持不变。 |
| query | string | 否 | 名称子字符串,最多截取 200 个字符;空白值将被省略。不可与 entityCode 同时使用。 |
| entityCode | string | 否 | 两字母国家代码、数字 IODA 地区代码、十进制 ASN(接受 AS 前缀),或由 ASN 与地区或国家代码组成的 geoasn 代码(40934-576、59962-IR);使用 ioda_search_entities 解析名称,并将返回的代码传入此处。 |
| entityType | string | 是 | country、region、asn 或 geoasn(某个地区或国家内的一个 ASN);空白和大小写会进行规范化。 |
| relatedToCode | string | 否 | 作用域实体代码;会像 relatedToType 的 entityCode 一样进行规范化(IR、1829、AS42337、60627-IR);使用 ioda_search_entities 解析名称。请与 relatedToType 一起提供。 |
| relatedToType | string | 否 | 作用域类型:country、region、asn 或 geoasn。与 relatedToCode 一起使用时,仅返回与该实体相关的 entityType 实体,例如某个国家的地区或网络。需要 entityType,且不能与 entityCode 同时使用;空白值将被省略。IODA 会评估有限的相关实体集合,因此范围很大的作用域(例如某个国家的数千个网络)可能不完整;此类情况下建议使用地区作用域。 |
详细介绍
@cyanheads/ioda-outages-mcp-server
通过 MCP 使用 IODA 事件、警报和连接信号调查互联网中断。支持 STDIO 或 Streamable HTTP。
概述
通过 IODA 的公共 v2 API 获取互联网中断证据。解析国家、地区和自治系统;检查近期检测结果和测量覆盖范围;随后调查事件、警报状态转换、各实体的中断排名及数值信号。支持通过 stdio、无状态 Streamable HTTP,或上方的公共托管端点运行,无需 API 密钥。
工具
| 工具 | 描述 |
|---|---|
ioda_search_entities | 解析国家、地区、ASN 或 geoasn 名称及代码 |
ioda_get_status | 检查近期检测证据,以及三个数值来源的覆盖范围 |
ioda_find_outages | 获取某个实体或全局范围内时间重叠的中断事件 |
ioda_summarize_outages | 按 IODA 的每时间窗口中断评分,对某一类型的实体进行排名 |
ioda_get_signals | 获取 BGP、主动 IPv4 /24 探测或 Merit telescope 数值序列 |
ioda_get_alerts | 获取检测和恢复状态转换及各来源基线 |
功能参考
ioda_search_entities 工具
- 必填
entityType: country | region | asn | geoasn(geoasn 是某个地区或国家内的一个 ASN);选择query(修剪后最多 200 个 UTF-16 代码单元)或entityCode,也可以两者都省略以列出该类型。国家代码使用两个字母,地区使用 IODA 数字代码,ASN 使用十进制数字,geoasn 将 ASN 与地区或国家代码组合在一起(40934-576、59962-IR)。 - 可选的
relatedToType和relatedToCode用于列出某个国家、地区、ASN 或 geoasn 内属于entityType的实体;两者必须同时提供或同时省略,且必须提供entityType,不得提供entityCode,范围条件可与query组合使用。请对该解析器分页,以便为单个中断调查选择代码。 limit为 1–1,000,默认值为 20,实际最多返回 100 条;page从 0 开始。返回原始entities、pagination和provenance;元数据匹配并不能证明测量覆盖范围。
ioda_get_status 工具
- 必填
entityType(country、region、asn或geoasn)和entityCode;lookbackHours为 1–240,默认值为 6,实际最多处理 24 小时,并会通过提示说明未覆盖的更早时间段。收集返回的window内的事件、警报以及bgp、ping-slash24和merit-nt摘要。 detection为observed、none_returned或unknown;来源的coverage独立取值为recent、stale、no_data或unknown。recent表示最新的已完成观测在调用时间起 1,800 秒的发布宽限期内结束,该要求对三个来源均相同;这是服务端策略,并非上游 SLA。宽限期内末尾的 null 值计入pendingCount,而非nullCount。- 每个
signals条目都包含该来源对应的 IODAunit(Visible /24s、Up /24s、Unique Source IPs);latest、minimum和maximum均以该单位表示。 components会披露部分失败情况,并支持使用独立工具恢复。事件和警报分页会携带续页元数据;原始样本来自ioda_get_signals。所有组件均失败时,调用会失败;未知的国家、地区或 geoasn 代码会报错entity_not_found。
ioda_find_outages 工具
- 必填
from和until;可选entityType(country、region、asn或geoasn)、entityCode和source: bgp | ping-slash24 | merit-nt | gtr。如需全局范围,请省略实体筛选条件;提供代码时必须同时提供其类型。可选的relatedToType和relatedToCode用于将结果限定为某个国家、地区、ASN 或 geoasn 内属于entityType的实体(两者必须同时提供或同时省略,且必须提供entityType,不得提供entityCode)。limit为 1–1,000,默认值为 20,实际最多返回 100 条。 - 返回来源
events、pagination和provenance。分数保留其来源含义;开始时间可能早于窗口,而截断在until的结束时间并不能证明已恢复。 includeAlerts默认为 false;extendWindowSeconds为 0–12,096,000,实际最多为 1,209,600。省略时,若提供entityType,默认值为 1,209,600;若未提供,则为 86,400,因为大范围的全局扩展可能导致超时;实际应用的值会回显,并且提示会说明全局默认值。跨越多日窗口的全局搜索仍可能超时:请缩小窗口或添加entityType。将扩展设为零可能会漏掉持续时间较长的检测结果。
ioda_summarize_outages 工具
- 必填
entityType、from和until;可选entityCode,用于指定单个实体;或使用relatedToType和relatedToCode,在单个国家、地区、ASN 或 geoasn 范围内对entityType实体进行排序(两者必须同时提供或都不提供,且不能同时提供entityCode)。limit范围为 1–1,000,默认值为 20,实际最多处理 100;extendWindowSeconds范围为 0–12,096,000,默认值为 1,209,600,实际最多处理 1,209,600。没有source输入参数。 - 按 IODA 的顺序返回
summaries,按scores.overall降序排列,并包含pagination和provenance。每行包含entity、event_cnt(IODA 合并前的源事件计数)以及未经修改的scores:overall,加上每个<source>.<method>键对应的事件分数总和。IODA 会合并来自不同来源的重叠事件,将每个合并事件的分数计算为其来源分数的乘积,并将合并后的事件分数累加为overall。 - 分数是用于对单次请求中的行排序的时间窗口总值,不代表当前状态,也不能与时间窗口不同的请求进行比较。仅按类型进行大范围排序(例如所有地区)可能会超时;请添加
entityCode或相关范围。结果为空不代表一切正常。
ioda_get_signals 工具
- 必填实体对(
entityType可以是geoasn)、from、until和source: bgp | ping-slash24 | merit-nt(此处gtr和ucsd-nt不是数值来源)。maxPoints范围为 1–20,000,默认值为 200,实际最多处理 2,000:这是上游聚合目标,并非返回样本数的硬性上限。 - 在
series中返回所有数值子类型,以及特定于来源的semantics(测量值、IODA 的unit、注意事项)和provenance。未知的国家、地区或 geoasn 代码会导致entity_not_found错误。返回的until是不包含在内的分桶边界;对齐操作可能会超出请求的边界。粗粒度序列会附带说明:其值不一定等于返回的较细粒度分桶值的非加权平均值,且非空聚合无法证明较细分辨率的数据覆盖完整。值、空值和单位保持不变;粗粒度序列的状态覆盖情况仍为unknown。
ioda_get_alerts 工具
- 必填
from和until;可选实体、来源和相关范围筛选条件与ioda_find_outages相同;由于 IODA 无法继续获取带范围的告警,相关范围仅在第 0 页生效。limit范围为 1–1,000,默认值为 20,实际最多处理 100;extendWindowSeconds范围为 0–12,096,000,默认值为 0,实际最多处理 1,209,600。 - 返回
alerts、pagination和provenance,并保留来源报告的level、condition、value和historyValue。对于bgp、ping-slash24和merit-nt,value和historyValue使用来源单位;对于gtr,它们是 IODA Traffic 除以 1,000,000 后截断的值。缺少状态转换信息并不能证明网络正常,也不能排除更早开始的事件。
功能
基于 @cyanheads/mcp-ts-core 构建:支持 stdio 和 Streamable HTTP 传输、可插拔身份验证(none / jwt / oauth)、可切换存储(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1),并提供结构化日志记录和可选的 OpenTelemetry 跟踪。
IODA 专属功能:
- 从固定的 HTTPS API 源站进行无需密钥的读取;无需本地数据库或原生辅助程序。
- 历史时间窗口使用 UTC 整数 Unix 秒:
from < until <= now,最长 31 天。警报会包含两个边界处的状态变化(通过扩展窗口实现);事件和摘要会包含在until时开始的内容。相邻窗口可能重复包含边界检测结果。信号边界表示对齐后的时间桶;对于选择规则不同的组件,状态会回显请求的时间窗口。 - 事件、警报和排名中的
ignoreMethods: string[]会在构建事件和评分前,于上游排除检测结果:可使用source.method、source.*或*.method,其中来源包括bgp、ping-slash24、merit-nt和gtr。系统会规范大小写和空白,并去除重复项;空数组不会排除任何内容。格式错误的条目和*.*会触发invalid_arguments;同时指定source及其对应的source.*会触发invalid_ignore_methods。翻页和排名下钻查询时,请固定排除项;提供方的分数和顺序会保留。 - 每个相关范围的中断响应都会警告成员覆盖情况尚未核实,即使页面很短或为空也一样。请使用相同的实体类型、范围和 limit 对
ioda_search_entities翻页,然后使用原始时间窗口、来源/排除项、扩展量和翻页 limit,逐个查询选定的代码;每个响应都会提供具体调用方式。pagination.more表示行分页是否还有后续页面,不代表范围完整性。 - 分页从 0 开始;使用不变的筛选条件和
limit跟进nextPage。more: "possible"表示可能还有后续内容,而非已知总数;更改 limit 后,请从第 0 页重新开始。 - 数值输入最多可超过其服务上限 10 倍(
limit为 100、maxPoints为 2,000、lookbackHours为 24、extendWindowSeconds为 1,209,600);超出服务上限的值会按上限处理,通知会指出请求值、实际服务值,以及获取剩余内容的调用方式。低于最小值或超过可接受最大值的输入会导致参数验证失败。 - 共享请求节流机制允许同时有一个请求在途,并要求每次请求启动之间至少间隔两秒;每次调用的截止时间为 45 秒。请避免并发调查。
- IODA 描述的是宏观层面的连接状况。未检测到故障不代表一切正常;来源评分并非通用严重程度指标,观测结果也无法确定中断原因或单个办公室的连接状况。
便于 Agent 使用的输出:
- 来源信息——返回的证据附带端点链接、获取时间和 Georgia Tech Research Corporation 的原始署名;
applied会回显生效的输入。 - 明确标示不确定性——将空样本、缺失字段、来源覆盖情况和部分组件故障分别呈现。
- 完整且有界的响应——
content[]和structuredContent携带相同的数据,包括补充信息。上游响应正文上限为 2 MiB,组合响应上限为 96 KiB;超过上限时,会通过response_too_large指出更小范围的调用方式,而不会丢弃记录。
开始使用
公共托管实例
公共实例位于 https://ioda-outages.caseyjhand.com/mcp,无需安装。它使用 Streamable HTTP;不同客户端的配置格式各不相同。
对于 Claude Code:
claude mcp add --transport http ioda-outages-mcp-server https://ioda-outages.caseyjhand.com/mcp
对于 Cline(cline_mcp_settings.json):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "streamableHttp",
"url": "https://ioda-outages.caseyjhand.com/mcp"
}
}
}
对于 Cursor(mcp.json):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"url": "https://ioda-outages.caseyjhand.com/mcp"
}
}
}
Claude Desktop 可在 Settings → Connectors 下添加远程服务。
自托管 / 本地
将以下内容添加到 MCP 客户端配置文件中。IODA 无需 API 密钥。
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/ioda-outages-mcp-server@latest"]
}
}
}
或使用 npx(无需 Bun):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/ioda-outages-mcp-server@latest"]
}
}
}
或使用 Docker:
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/ioda-outages-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.ioda.inetintel.cc.gatech.edu发起出站 HTTPS 请求。无需 API 密钥或账户。
安装
- 克隆仓库:
git clone https://github.com/cyanheads/ioda-outages-mcp-server.git
- 进入目录:
cd ioda-outages-mcp-server
- 安装依赖:
bun install
- 配置环境(可选):
cp .env.example .env
# no server-specific variables; edit framework overrides as needed
配置
服务没有自己的设置。通用框架变量如下:
| 变量 | 描述 | 默认值 |
|---|---|---|
MCP_TRANSPORT_TYPE | 传输方式:stdio 或 http。 | stdio |
MCP_HTTP_HOST | HTTP 绑定地址。 | 127.0.0.1 |
MCP_HTTP_PORT | HTTP 服务端口。 | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP 端点路径。 | /mcp |
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)。 | <app-root>/logs |
OTEL_ENABLED | 启用 OpenTelemetry。 | false |
完整的框架覆盖项列表请参见 .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, and more bun run test # Runs the test suite
项目结构
| 目录 | 用途 |
|---|---|
src/index.ts | 服务身份、工具注册、服务生命周期 |
src/mcp-server/tools/definitions/ | 六个只读工具 |
src/mcp-server/tools/ioda-common.ts | 共享的输入规范化、渲染和响应预算 |
src/services/ioda/ | 固定源 API 客户端、模式、请求节流、状态评估 |
tests/ | 契约、服务和格式化测试 |
docs/design.md | 领域契约、设计决策、API 依据 |
docs/tree.md | 生成的目录清单 |
开发指南
开发指南和架构规则请参见 CLAUDE.md,领域契约请参见 docs/design.md。简而言之:
- 处理程序抛出异常,框架负责捕获——工具逻辑中不要使用
try/catch - 使用
ctx.log记录日志,使用ctx.signal进行取消,使用ctx.enrich提供已应用的输入和通知 - 在
src/index.ts中的createApp()数组内注册新工具 - 包装外部 API 调用:验证原始数据 → 规范化为领域类型 → 返回输出模式;绝不捏造缺失字段,并确保两个响应表面都完整
贡献
欢迎提交问题。提交前请运行检查和测试:
bun run devcheck
bun run test
许可证
Apache-2.0;详见 LICENSE。IODA 数据保留其 Georgia Tech Research Corporation 版权,并继续受来源条款约束。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。