ioda-outages-mcp-server について
IODA の公開 API を使ってインターネット障害を調査する MCP サーバーです。ネットワーク研究者向けに、検知、アラート、障害イベント、エンティティの順位、数値の接続シグナルを API キーなしで提供します。
主な機能
- 01国・地域・ASN エンティティの特定
- 02最近の障害証拠とデータソース範囲の確認
- 03障害イベントとアラート遷移の取得
- 04障害スコアによるエンティティ順位付け
- 05BGP・プローブ・テレスコープ信号の取得
活用シーン
- 01地域や ASN の最近の障害検知の確認
- 02指定期間のアラートと復旧遷移の確認
- 03エンティティ間の障害順位の比較
- 04対象エンティティの数値接続シグナルの確認
MCP 対応
STDIO またはステートレス Streamable HTTP で、IODA の調査ツール 6 種類を MCP クライアントに公開し、パブリックホスト版も提供します。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 | いいえ | 2 文字の国コード、数値の IODA 地域コード、10 進数の ASN(AS 接頭辞も可)、または ASN と地域・国コードを組み合わせた geoasn コード(40934-576、59962-IR)。ioda_search_entities で名前を解決し、返されたコードをここに渡してください。 |
| entityType | string | はい | country、region、asn、または geoasn(地域または国内の 1 つの ASN)。空白と大文字・小文字は正規化されます。 |
| relatedToCode | string | いいえ | スコープエンティティのコード。relatedToType の entityCode と同様に正規化されます(IR、1829、AS42337、60627-IR)。ioda_search_entities で名前を解決してください。relatedToType と一緒に指定してください。 |
| relatedToType | string | いいえ | スコープのタイプ:country、region、asn、または geoasn。relatedToCode と併用すると、そのエンティティに関連する entityType エンティティ(1 つの国の地域やネットワークなど)のみを返します。entityType が必要で、entityCode とは併用できません。空白の場合は省略されます。IODA は関連エンティティを一定の範囲に限定して評価するため、規模の大きなスコープ(1 つの国に数千のネットワークがある場合など)では結果が不完全になることがあります。その場合は地域スコープを使用してください。 |
詳細
翻訳後に原文が更新されています。最新の内容は原文をご確認ください。
@cyanheads/ioda-outages-mcp-server
MCP 経由で IODA のイベント、アラート、接続シグナルを使ってインターネット障害を調査します。STDIO または Streamable HTTP に対応しています。
概要
IODA の公開 v2 API を使用して、インターネット障害の証拠を確認します。国、地域、自律システムを特定し、最近の検出結果と測定範囲を確認したうえで、イベント、アラートの遷移、エンティティ別の障害ランキング、数値シグナルを調査できます。API キーは不要で、stdio またはステートレスな Streamable HTTP 経由で動作します。
ツール
| ツール | 説明 |
|---|---|
ioda_search_entities | 国、地域、ASN、または geoasn の名前やコードを特定します |
ioda_get_status | 3 種類の数値ソースにおける最近の検出証拠と測定範囲を確認します |
ioda_find_outages | エンティティ単位または全体の、期間が重なる障害イベントを取得します |
ioda_summarize_outages | IODA の期間別障害スコアに基づき、1 種類のエンティティを順位付けします |
ioda_get_signals | BGP、アクティブな IPv4 /24 プロービング、または Merit テレスコープの数値系列を取得します |
ioda_get_alerts | ソースのベースラインとともに、検出と復旧の遷移を取得します |
機能リファレンス
ioda_search_entities ツール
- 必須の
entityType: country | region | asn | geoasn(geoasn は、ある地域または国に属する 1 つの ASN)を指定し、query(前後の空白を除いて最大 200 文字)またはentityCodeを選択します。両方を省略すると、そのタイプの一覧が返されます。国コードは 2 文字、地域コードは IODA の数値コード、ASN は 10 進数の数字、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 秒の公開猶予時間内に終了したことを意味します。これは 3 つのソースすべてに適用され、アップストリームの SLA ではなくサーバーのポリシーです。この猶予時間内の末尾の null はnullCountではなくpendingCountとして数えられます。- 各
signalsエントリには、ソースごとの IODA のunit(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を追加してください。拡張を 0 にすると、長時間継続している検知を見逃すことがあります。
ioda_summarize_outages ツール
entityType、from、untilは必須です。1つのエンティティを指定する場合はentityCodeを、1つの国、地域、ASN、または geoasn 内でentityTypeのエンティティを順位付けする場合はrelatedToTypeとrelatedToCodeを指定します(両方を指定するか、どちらも指定しないでください。entityCodeとは併用できません)。limitの範囲は 1~1,000、デフォルトは 20 で、提供上限は 100 です。extendWindowSecondsの範囲は 0~12,096,000、デフォルトは 1,209,600 で、提供上限は 1,209,600 です。source入力はありません。- IODA の順序(
scores.overallの降順)でsummariesを返し、paginationとprovenanceも含みます。各行にはentity、event_cnt(マージ前の IODA のソースイベント数)、および変更されていないscoresが含まれます。scoresはoverallと、各<source>.<method>キーのイベントスコアの合計で構成されます。IODA は異なるソースの重複するイベントをマージし、マージした各イベントのスコアを各ソースのスコアの積として算出し、マージしたイベントのスコアを合計してoverallを算出します。 - スコアは1回のリクエスト内で行を順位付けするためのウィンドウ合計であり、現在の状態を示すものではなく、ウィンドウの異なるリクエスト間で比較できません。型だけを指定した大規模な順位付け(たとえば、すべての地域)はタイムアウトすることがあります。
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エラーになります。from、until、step、nativeStep、および null 値によって、バケット境界の整合性と観測値の欠落が保たれます。目標値を小さくすると、時間分解能が低下します。
ioda_get_alerts ツール
fromとuntilは必須です。エンティティ、ソース、および関連スコープのフィルターはioda_find_outagesと同じものを任意で指定できます。関連スコープはページ 0 でのみ提供されます。これは IODA がスコープを指定したアラートの取得を続行できないためです。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 日間です。より長い調査は、隣接するウィンドウに分割してください。 - ページネーションはゼロベースです。フィルターと
limitを変更せずにnextPageをたどってください。more: "possible"は、継続の可能性を示しますが、総件数が判明しているわけではありません。limitを変更した場合は、ページ 0 からやり直してください。 - 数値入力には、提供上限の最大 10 倍まで指定できます(
limitは 100、maxPointsは 2,000、lookbackHoursは 24、extendWindowSecondsは 1,209,600)。より大きな値を指定した場合は上限値で提供され、通知には要求値、提供値、残りのデータを取得するためのルートが示されます。最小値を下回る値や受け入れ可能な最大値を超える値は、引数の検証でエラーになります。 - 共通のリクエスト間隔制御により、同時進行のリクエストは 1 件に制限され、リクエスト開始の間隔は最低 2 秒になります。呼び出しの期限は 45 秒です。同時に複数の調査を行わないでください。
- IODA が示すのは、マクロな接続状況です。検出されなかったことは、問題がないことを意味しません。ソーススコアは普遍的な深刻度を示すものではなく、観測データから停止の原因や個々のオフィスの接続状況を特定することもできません。
エージェントに適した出力:
- 出典情報 — エンドポイントへのリンク、取得時刻、元の Georgia Tech Research Corporation の帰属表示が、返される証拠に付属します。
appliedには実際に適用された入力が反映されます。 - 不確実性の明示 — null サンプル、欠損フィールド、ソースのカバレッジ、コンポーネントの部分的な障害は、それぞれ区別して保持されます。
- 完全で上限のあるレスポンス —
content[]とstructuredContentには、エンリッチメントを含む同じデータが格納されます。上流のレスポンス本文は 2 MiB、結合後のレスポンスは 96 KiB が上限です。これを超える場合、レコードを破棄する代わりに、より小さい呼び出しを指定するresponse_too_largeが返されます。
はじめに
以下を 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/ | 6 つの読み取り専用ツール |
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 呼び出しをラップし、未加工データの検証 → ドメイン型への正規化 → 出力スキーマの返却を行ってください。不足しているフィールドを捏造せず、両方のレスポンス形式を完全な状態に保ってください
コントリビューション
Issue を歓迎します。提出前にチェックとテストを実行してください。
bun run devcheck
bun run test
ライセンス
Apache-2.0。詳細は LICENSE を参照してください。IODA データの著作権は引き続き Georgia Tech Research Corporation に帰属し、元データの利用条件が適用されます。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。