Ioda Outages Mcp Server

io.github.cyanheads由 GitHub 帳號 cyanheads 發布v0.3.1更新於 Nov 1, 2026

Investigate Internet outages with IODA events, alerts, and connectivity signals via MCP.

已驗證Streamable HTTP可網頁執行安全與監控資料與分析

概覽

AI 產生的概覽

唯讀的 IODA 斷網調查工具:解析國家、地區與 ASN,再取得斷網事件、告警、排名與連線訊號。

可以做什麼
  • 解析國家、地區、ASN 與 geoasn 的名稱和代碼,包含某個範圍內的實體
  • 檢視單一實體近期的偵測證據與量測涵蓋情況
  • 在指定時間窗內尋找斷網事件以及偵測/恢復告警轉換
  • 依 IODA 斷網評分對某一類型的實體排名,或取得 BGP、探測、望遠鏡與流量序列
  • 讀取隨附的指南技能,了解代碼來源、發布延遲與證據能支持到什麼程度
適用情境
適合用來判斷某個國家或網路目前是否異常、調查已通報的斷網、對某段時間內受影響最嚴重的地區或網路排名,或繪製連線訊號隨時間的變化。
執行需求
可使用公開託管端點,或透過 npx(Node.js)或 Docker 在本機執行;需要能連線至 IODA API 的外送 HTTPS。不需要 API 金鑰或帳號。本機伺服器可用 IODA_CLAMP_LIMITS、MCP_TRANSPORT_TYPE、MCP_HTTP_HOST、MCP_HTTP_PORT、MCP_HTTP_ENDPOINT_PATH、MCP_AUTH_MODE、MCP_LOG_LEVEL 等變數設定。
安裝前請注意
六個工具皆為唯讀,但結果容易被過度解讀:缺少告警或結果為空不代表一切正常,空值不等於零連線,IODA 也無法判定斷網原因或單一機構的連線狀況。請求受到限速,同時僅允許一個請求進行中、兩次啟動間隔至少兩秒、呼叫期限 45 秒,因此應避免同時進行多項調查;大範圍的全域或僅依類型的查詢可能逾時。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Ioda Outages Mcp Server,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.cyanheads%2Fioda-outages-mcp-server/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "ioda-outages": {
      "type": "http",
      "url": "https://ioda-outages.caseyjhand.com/mcp"
    }
  }
}

README

@cyanheads/ioda-outages-mcp-server

Investigate Internet outages with IODA events, alerts, and connectivity signals via MCP. STDIO or Streamable HTTP.

6 Tools • 1 Skill


Overview

Internet outage evidence from IODA, using its public v2 API. Resolve countries, regions, and autonomous systems; inspect recent detections and measurement coverage; then investigate events, alert transitions, per-entity outage rankings, and numeric signals. Runs over stdio, stateless Streamable HTTP, or the public hosted endpoint above, without an API key.

Tools

ToolDescription
ioda_search_entitiesResolve country, region, ASN, or geoasn names and codes
ioda_get_statusInspect recent detection evidence and coverage across three numeric sources
ioda_find_outagesRetrieve overlapping outage events for an entity or globally
ioda_summarize_outagesRank the entities of one type by IODA's per-window outage score
ioda_get_signalsFetch BGP, active IPv4 /24 probing, Merit telescope, or country-level Google Transparency Report traffic numeric series
ioda_get_alertsRetrieve detection and recovery transitions with source baselines

Skills

SkillDescription
ioda-outages-guideInvestigate Internet outages with the ioda_* tools — resolving places and networks to IODA codes, publication lag, signal resolution, and reading detections and rankings without over-claiming

Capability reference

ioda_search_entities tool

  • Required entityType: country | region | asn | geoasn (a geoasn is one ASN within a region or country); choose query (up to 200 UTF-16 code units after trimming, matched literally as a case-insensitive name substring) or entityCode, or omit both to list the type. Country codes use two letters, regions use IODA numeric codes, ASNs use decimal digits, and geoasns join an ASN and a region or country code (40934-576, 59962-IR).
  • Optional relatedToType and relatedToCode list entityType entities within one country, region, ASN, or geoasn; both or neither, entityType required, no entityCode, and a scope combines with query. Page this resolver to select codes for individual outage investigations.
  • limit is at least 1, default 20, served at most 1,000; page starts at 0. Returns original entities, pagination, and provenance; a metadata match does not establish measurement coverage. Region pages can include IODA geolocation catch-alls named [Invalid Region (N)] or Unknown Region in <country>; a notice names their codes, and the rows stay as IODA returns them. An asn entityCode IODA holds no record of returns a placeholder row with attrs.ip_count "0"; a notice names it.

ioda_get_status tool

  • Required entityType (country, region, asn, or geoasn) and entityCode; lookbackHours is at least 1, default 6, served at most 24 with a notice naming the uncovered earlier window. Collects events, alerts, and bgp, ping-slash24, and merit-nt summaries within the returned window.
  • detection is observed, none_returned, or unknown; source coverage is independently recent, stale, no_data, or unknown. recent means the latest completed observation ended within a 1,800-second publication allowance of the call, the same for all three sources, a server policy rather than an upstream SLA. Trailing nulls inside the allowance count as pendingCount, not nullCount.
  • Each signals entry carries IODA's unit for its source (Visible /24s, Up /24s, Unique Source IPs); latest, minimum, and maximum are in that unit.
  • components disclose partial failures and standalone-tool recovery. Event/alert pages carry continuation metadata; raw samples come from ioda_get_signals. All-component failure fails the call; an unknown country, region, or geoasn code fails with entity_not_found. IODA answers an unknown asn code with a placeholder instead; when no event, alert, or series came back for an asn, a notice says a returned ioda_search_entities row does not confirm IODA holds data for it.

ioda_find_outages tool

  • Required from and until; optional entityType (country, region, asn, or geoasn), entityCode, and source: bgp | ping-slash24 | merit-nt | gtr. Omit entity filters for global scope; a code requires its type. Optional relatedToType and relatedToCode limit results to entityType entities within one country, region, ASN, or geoasn (both or neither, entityType required, no entityCode). limit is at least 1, default 20, served at most 1,000.
  • Returns source events, pagination, and provenance. Scores retain their source meaning; starts may precede the window and an end clipped at until does not establish recovery.
  • includeAlerts defaults to false; extendWindowSeconds is at least 0, served at most 1,209,600. Omitted, it is 1,209,600 with entityType and 86,400 without it, because large global extensions can time out; the applied value is echoed, and a notice discloses the global default. Global searches over multi-day windows can still time out: narrow the window or add entityType. Zero extension can miss long-running detections.

ioda_summarize_outages tool

  • Required entityType, from, and until; optional entityCode for one entity, or relatedToType and relatedToCode to rank entityType entities within one country, region, ASN, or geoasn (both or neither, no entityCode). limit is at least 1, default 20, served at most 1,000; extendWindowSeconds is at least 0, default 1,209,600, served at most 1,209,600. There is no source input.
  • Returns summaries in IODA's order, descending scores.overall, with pagination and provenance. Each row carries the entity, event_cnt (IODA's count of source events before merging), and unmodified scores: overall plus one sum of event scores per <source>.<method> key. IODA merges overlapping events from different sources, scores each merged event as the product of its sources' scores, and sums the merged events into overall.
  • Scores are window totals for ranking the rows of one request, not current status, and are not comparable across requests with different windows. Large type-only rankings (every region, for example) can time out; add entityCode or a related scope. Region rankings, like region events and alerts, can include the catch-all rows described above; a notice names their codes. An empty result is not an all-clear.

ioda_get_signals tool

  • Required entity pair (entityType may be geoasn), from, until, and source: bgp | ping-slash24 | merit-nt | gtr (gtr covers countries only; ucsd-nt is not supported). maxPoints is at least 1, default 200, served at most 10,000: an upstream aggregation target, not a hard returned-sample cap.
  • Returns every numeric subtype in series, source-specific semantics (measurement, IODA's unit, caveat; gtr reads Traffic, to compare a country with its own history), and provenance. An unknown country, region, or geoasn code fails with entity_not_found. Returned until is an exclusive bucket bound; alignment can extend beyond requested bounds. Coarse series carry a notice: values need not equal an unweighted mean of finer returned buckets, and non-null aggregates cannot establish complete finer-resolution coverage. Values, nulls, and units remain unchanged; status coverage stays unknown for coarse series.
  • Trailing nulls are not zero connectivity. A notice counts each series' trailing nulls as not yet ended, pending (ended within the publication allowance before the call: 1,800 seconds for bgp and ping-slash24, 10,800 for merit-nt and gtr), or missing; the first two are usually unpublished, so end the window at least the allowance plus one bucket step before the call, since the last returned bucket can end after until. A coarse last non-null bucket inside the allowance can aggregate only the samples published so far. Interior nulls stay missing observations.
  • An empty series gets a notice by case: gtr for a region, ASN, or geoasn (it covers countries only); a window ending by the source's archive start, which says IODA holds nothing earlier instead of suggesting another code or window; a window starting inside the publication allowance, which IODA may not have published yet; an asn, where a returned search row does not confirm data and attrs.ip_count "0" marks IODA's placeholder.

ioda_get_alerts tool

  • Required from and until; optional entity, source, and related-scope filters match ioda_find_outages; a related scope is served at page 0 only, because IODA cannot continue scoped alerts. limit is at least 1, default 20, served at most 1,000; extendWindowSeconds is at least 0, default 0, served at most 1,209,600.
  • Returns alerts, pagination, and provenance, retaining source level, condition, value, and historyValue when reported. value and historyValue are in the source unit for bgp, ping-slash24, and merit-nt; for gtr they are IODA Traffic divided by 1,000,000 and truncated. A recovery's historyValue can be a baseline IODA re-based during a long event; compare its value with the detection's historyValue and condition. A missing transition does not establish health or rule out an event that began earlier.

ioda-outages-guide skill

  • Helps an agent investigate a shutdown or outage, check whether a place or network is degraded now, rank the worst-hit entities, and chart connectivity: where each IODA code comes from, asn versus geoasn, getting the clock from the server, publication lag, native signal resolution, and which conclusions the evidence supports
  • Served over MCP as the resource skill://ioda-outages-guide/SKILL.md under the template skill://{+path}; also ships in skills/ for plugin installs and the .mcpb bundle

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

IODA-specific:

  • Keyless reads from a fixed HTTPS API origin; no local database or native helper.
  • Historical windows use integer Unix seconds UTC: from < until <= now, at most 31 days. Alerts include transitions at both bounds (widened by extension); events and summaries include starts at until. Adjacent windows can duplicate boundary detections. Signal bounds describe aligned buckets; status echoes the requested window across components with different selection rules. IODA's API holds no outage detections before 2022-01-26 UTC and no merit-nt, bgp, or ping-slash24 observations before 2022-01-09, 2022-01-18, and 2022-02-02 (gtr has no start); an empty result for a window ending by then says so instead of suggesting another code or a wider window.
  • ignoreMethods: string[] on events, alerts, and rankings excludes detections upstream before event construction and scoring: source.method, source.*, or *.method, with sources bgp, ping-slash24, merit-nt, and gtr. Case/whitespace normalize and duplicates collapse; an empty array excludes nothing. Malformed terms and *.* fail invalid_arguments; an explicit source plus its own source.* fails invalid_ignore_methods. Keep exclusions fixed across pages and ranking drill-downs; provider scores and order are preserved.
  • Every related-scope outage response warns that membership coverage is unverified, even on short or empty pages. Page ioda_search_entities with the same entity type, scope, and limit, then query selected codes individually with the original window, source/exclusions, extension, and paging limit; each response supplies the concrete calls. pagination.more describes row pages, not scope completeness.
  • Pagination is zero-based; follow nextPage with filters and limit unchanged. more: "possible" signals possible continuation, not a known total; restart at page 0 after changing the limit.
  • Numeric inputs have no advertised maximum: a larger limit (cap 1,000), maxPoints (10,000), lookbackHours (24), or extendWindowSeconds (1,209,600) is served at the cap, and a notice names the requested value, the served value, and the route to the rest. Minimums and non-integers fail argument validation. With IODA_CLAMP_LIMITS=false, each cap is the schema maximum and a larger value fails invalid_arguments.
  • Shared request pacing allows one in-flight request and at least two seconds between starts, with a 45-second invocation deadline. Avoid concurrent investigations.
  • IODA describes macroscopic connectivity. Missing detections are not an all-clear; source scores are not universal severity, and observations cannot establish a shutdown cause or one office's connectivity.

Agent-friendly output:

  • Provenance — endpoint links, fetch times, and the original Georgia Tech Research Corporation attribution accompany returned evidence; applied echoes effective inputs.
  • Explicit uncertainty — null samples, missing fields, source coverage, and partial component failures stay distinct.
  • Complete responses — content[] and structuredContent carry the same data, enrichment included, and a page is never shortened to fit a size budget. An upstream body over 4 MiB fails upstream_schema.

Getting started

Connect to the hosted instance, no install:

sh
claude mcp add --transport http ioda-outages-mcp-server https://ioda-outages.caseyjhand.com/mcp

Or run it locally:

sh
claude mcp add ioda-outages-mcp-server -- npx -y @cyanheads/ioda-outages-mcp-server

For other clients, add this to the MCP config file:

json
{  "mcpServers": {    "ioda-outages-mcp-server": {      "command": "npx",      "args": ["-y", "@cyanheads/ioda-outages-mcp-server"]    }  }}

IODA needs no API key or account, only outbound HTTPS to api.ioda.inetintel.cc.gatech.edu. For Docker or a source build, see Running the server.

Configuration

One server-specific variable, then the common framework variables:

VariableDescriptionDefault
IODA_CLAMP_LIMITSServe an over-cap limit, maxPoints, lookbackHours, or extendWindowSeconds at its cap with a notice. false rejects it with invalid_arguments and advertises each cap as the schema maximum.true
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_HOSTHTTP bind address.127.0.0.1
MCP_HTTP_PORTHTTP server port.3010
MCP_HTTP_ENDPOINT_PATHMCP endpoint path./mcp
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, warning, error, etc.).info
LOGS_DIRDirectory for log files (Node.js only).<app-root>/logs
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for the full list of framework overrides.

Running the server

Local development

Requires Bun v1.4.0 or higher (or Node.js v24+).

  • Clone and install:

    sh
    git clone https://github.com/cyanheads/ioda-outages-mcp-server.gitcd ioda-outages-mcp-server && bun installcp .env.example .env   # optional: `IODA_CLAMP_LIMITS` and framework overrides
  • Build and run:

    sh
    # One-time buildbun run rebuild
    # Run the built serverbun run start:stdio# orbun run start:http
  • Run checks and tests:

    sh
    bun run devcheck   # Lint, format, typecheck, securitybun run test       # Vitest test suitebun run lint:mcp   # Validate MCP definitions against spec

Docker

sh
docker run --rm -p 3010:3010 ghcr.io/cyanheads/ioda-outages-mcp-server:latest

The image defaults to HTTP transport, stateless session mode, and logs to /var/log/ioda-outages-mcp-server. To run it over stdio from an MCP client, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/ioda-outages-mcp-server:latest"]. To build locally, docker build -t ioda-outages-mcp-server .; OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tsServer identity, tool registration, published skill, service lifecycle
skills/ioda-outages-guide/SKILL.md, the published agent skill
src/mcp-server/tools/definitions/Six read-only tools
src/config/server-config.tsServer-specific environment configuration (IODA_CLAMP_LIMITS)
src/mcp-server/tools/ioda-common.tsShared input normalization, served caps and notices, rendering
src/services/ioda/Fixed-origin API client, schemas, pacing, status assessment
tests/Contract, service, and formatting tests
docs/design.mdDomain contracts, design decisions, API evidence
docs/tree.mdGenerated directory inventory

Development guide

See CLAUDE.md for development guidelines and architectural rules, and docs/design.md for the domain contracts. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for logging, ctx.signal for cancellation, and ctx.enrich for applied inputs and notices
  • Register new tools in the createApp() arrays in src/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields, and keep both response surfaces complete

Contributing

Issues are welcome. Run checks and tests before submitting:

sh
bun run devcheckbun run test

License

Apache-2.0; see LICENSE. IODA data retains its Georgia Tech Research Corporation copyright and remains subject to the source's terms.

來源:README.md,提交 58b307e

工具

6

ioda_search_entities

Ioda Search Entities

Resolve country, region, autonomous-system, or geoasn (one ASN within a region or country) names and codes for outage investigations. Choose entityType and either query or entityCode; omit both to list the type. Countries use two letters, regions numeric IODA codes, ASNs decimal digits (AS prefix accepted), geoasns an ASN and a region or country code (40934-576, 59962-IR). Add relatedToType and relatedToCode to list entityType entities within one country, region, ASN, or geoasn, such as the regions or networks of a country; a scope combines with query. Region results can include IODA geolocation catch-alls named [Invalid Region (N)] or Unknown Region in <country>, which are not provinces or states; a notice names them. Metadata does not establish measurement coverage. Pages are zero-based; keep limit fixed when continuing.

輸入參數pagelimitqueryentityCodeentityType必填relatedToCoderelatedToType

ioda_get_status

Ioda Get Status

Inspect recent IODA detection evidence and measurement coverage for one entity over a lookback of 1–24 hours. Collect events, alerts, bgp, ping-slash24 and merit-nt evidence. Partial failures remain explicit and route to standalone tools. recent, stale, no_data and unknown describe observation availability; buckets within the 1800-second publication allowance count as pending, not missing. No alerts is not an all-clear. IODA measures macroscopic connectivity, not one office or a shutdown cause.

輸入參數entityCode必填entityType必填lookbackHours

ioda_find_outages

Ioda Find Outages

Find IODA outage events overlapping an explicit Unix-second window of at most 31 days. Omit entity filters for global scope, which searches one day outside the window by default instead of 14; global searches over multi-day windows can time out, so narrow the window or add entityType. A code requires its entityType. relatedToType and relatedToCode limit results to entityType entities within one country, region, ASN, or geoasn. Source scores are not an absolute severity scale. Starts at until are included; adjacent windows can duplicate boundary detections. Starts may precede from; ends can be clipped at until and do not establish recovery. ignoreMethods excludes source.method, source.*, or *.method upstream before scoring. includeAlerts adds nested transitions and can increase size. Pages are zero-based; keep filters and limit fixed.

輸入參數from必填pagelimituntil必填sourceentityCodeentityTypeignoreMethodsincludeAlertsrelatedToCoderelatedToTypeextendWindowSeconds

ioda_summarize_outages

Ioda Summarize Outages

Rank the entities of one entityType by IODA's outage summary score over an explicit Unix-second window of at most 31 days, such as the countries or a country's regions hit hardest this week. Rows keep IODA's order, descending scores.overall. Region rankings can include IODA geolocation catch-alls named [Invalid Region (N)] or Unknown Region in <country>, which are not provinces or states; a notice names them. IODA merges overlapping events from different sources, scores each merged event as the product of its sources' scores, and sums the merged events into overall; each <source>.<method> key sums that source's event scores. Scores are window totals for ranking the rows of one request, not current status, and are not comparable across requests with different windows. Add entityCode for one entity, or relatedToType and relatedToCode to rank entityType entities within one country, region, ASN, or geoasn; large type-only rankings can time out. Event-start selection includes until, so adjacent windows can duplicate boundary detections. ignoreMethods excludes source.method, source.*, or *.method upstream before scoring; keep exclusions fixed when comparing rankings or drilling into events and alerts. An empty result is not an all-clear. Pages are zero-based; keep filters and limit fixed.

輸入參數from必填pagelimituntil必填entityCodeentityType必填ignoreMethodsrelatedToCoderelatedToTypeextendWindowSeconds

ioda_get_signals

Ioda Get Signals

Fetch numeric BGP visibility, active IPv4 /24 probing, Merit telescope, or Google Transparency Report traffic series for one entity in an explicit Unix-second window of at most 31 days. source is required: bgp, ping-slash24, merit-nt, or gtr (countries only). Nulls are not zero connectivity: trailing nulls in buckets not yet ended or ended within the publication allowance before the call (1800 seconds for bgp and ping-slash24, 10800 for merit-nt and gtr) are usually unpublished, and every other null is a missing observation; the notice counts each trailing class. maxPoints requests upstream aggregation, not first-N samples; smaller values lose temporal resolution. Returned series retain aligned boundary buckets with exclusive returned until bounds that may extend beyond requested bounds; timestamps and intervals support cross-source comparisons.

輸入參數from必填until必填source必填maxPointsentityCode必填entityType必填

ioda_get_alerts

Ioda Get Alerts

Retrieve IODA detection and recovery transitions in an explicit Unix-second window of at most 31 days. Omit entity filters for global scope; a code requires entityType. relatedToType and relatedToCode limit results to entityType entities within one country, region, ASN, or geoasn, served at page 0 only. Each transition retains its source, level, condition, value and baseline; levels and baselines are not a source-independent severity scale. A recovery's historyValue can be a baseline IODA re-based during a long event; compare its value with the detection's historyValue and condition. Transitions include both requested bounds, widened by extendWindowSeconds; adjacent windows can duplicate boundary detections. ignoreMethods excludes source.method, source.*, or *.method upstream. Missing transitions do not establish health. Pages are zero-based; keep filters and limit fixed.

輸入參數from必填pagelimituntil必填sourceentityCodeentityTypeignoreMethodsrelatedToCoderelatedToTypeextendWindowSeconds

版本歷史

5
  1. v0.3.1最新Nov 1, 2026
  2. v0.3.0Oct 29, 2026
  3. v0.2.1Oct 25, 2026
  4. v0.2.0Oct 21, 2026
  5. v0.1.1Oct 21, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分