ioda-outages-mcp-server

v0.2.0 pre-1.0

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

ioda-outages.caseyjhand.com/mcp
claude mcp add --transport http ioda-outages-mcp-server https://ioda-outages.caseyjhand.com/mcp
codex mcp add ioda-outages-mcp-server --url https://ioda-outages.caseyjhand.com/mcp
{
  "mcpServers": {
    "ioda-outages-mcp-server": {
      "url": "https://ioda-outages.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http ioda-outages-mcp-server https://ioda-outages.caseyjhand.com/mcp
{
  "mcpServers": {
    "ioda-outages-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://ioda-outages.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "ioda-outages-mcp-server": {
      "type": "http",
      "url": "https://ioda-outages.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://ioda-outages.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

6

ioda_search_entities

open-world

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. Metadata does not establish measurement coverage. Pages are zero-based; keep limit fixed when continuing.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_search_entities",
    "arguments": {
      "entityType": "<entityType>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "query": {
      "description": "Name substring, trimmed to at most 200 characters; blank is omitted. Mutually exclusive with entityCode.",
      "type": "string"
    },
    "relatedToType": {
      "description": "Scope type: country, region, asn, or geoasn. With relatedToCode, returns only entityType entities related to that entity, such as the regions or networks of one country. Requires entityType and excludes entityCode; blank is omitted. IODA evaluates a bounded related set, so a very large scope (thousands of networks in one country) can be incomplete; prefer region scopes there.",
      "type": "string"
    },
    "relatedToCode": {
      "description": "Scope entity code, normalized like entityCode for relatedToType (IR, 1829, AS42337, 60627-IR); resolve names with ioda_search_entities. Provide with relatedToType.",
      "type": "string"
    },
    "limit": {
      "default": 20,
      "description": "Upstream page size; values above 100 are served as 100 with a notice. Keep fixed when continuing.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "page": {
      "default": 0,
      "description": "Zero-based upstream page; restart at 0 when changing limit.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "entityType",
    "limit",
    "page"
  ],
  "additionalProperties": false
}
view source ↗

ioda_get_status

open-world

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_get_status",
    "arguments": {
      "entityType": "<entityType>",
      "entityCode": "<entityCode>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "lookbackHours": {
      "default": 6,
      "description": "Hours before the captured invocation time; values above 24 are served as 24 with a notice naming the uncovered earlier window. The exact window is returned.",
      "type": "integer",
      "minimum": 1,
      "maximum": 240
    }
  },
  "required": [
    "entityType",
    "entityCode",
    "lookbackHours"
  ],
  "additionalProperties": false
}
view source ↗

ioda_find_outages

open-world

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 may precede from; ends can be clipped at until and do not establish recovery. includeAlerts adds nested transitions and can increase size. Pages are zero-based; keep filters and limit fixed.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_find_outages",
    "arguments": {
      "from": "<from>",
      "until": "<until>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "source": {
      "description": "bgp, ping-slash24, merit-nt, or gtr; blank means all sources. Case and whitespace are normalized.",
      "type": "string"
    },
    "relatedToType": {
      "description": "Scope type: country, region, asn, or geoasn. With relatedToCode, returns only entityType entities related to that entity, such as the regions or networks of one country. Requires entityType and excludes entityCode; blank is omitted. IODA evaluates a bounded related set, so a very large scope (thousands of networks in one country) can be incomplete; prefer region scopes there.",
      "type": "string"
    },
    "relatedToCode": {
      "description": "Scope entity code, normalized like entityCode for relatedToType (IR, 1829, AS42337, 60627-IR); resolve names with ioda_search_entities. Provide with relatedToType.",
      "type": "string"
    },
    "from": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Inclusive Unix seconds UTC; no milliseconds; window at most 31 days."
    },
    "until": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Exclusive Unix seconds UTC, after from and no later than now."
    },
    "limit": {
      "default": 20,
      "description": "Upstream page size; values above 100 are served as 100 with a notice. Keep fixed when continuing.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "page": {
      "default": 0,
      "description": "Zero-based upstream page; restart at 0 when changing limit.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "includeAlerts": {
      "default": false,
      "description": "Include original nested alert transitions and baselines; may substantially increase response size.",
      "type": "boolean"
    },
    "extendWindowSeconds": {
      "description": "Seconds before from to search for the start of an event overlapping the window, and after until for its recovery; only overlapping events are returned. Defaults to 1209600 (14 days) with entityType and 86400 (one day) without it, because large global extensions can time out; the applied value is echoed. Values above 1209600 are served as 1209600 with a notice. Zero may miss long-running detections.",
      "type": "integer",
      "minimum": 0,
      "maximum": 12096000
    }
  },
  "required": [
    "from",
    "until",
    "limit",
    "page",
    "includeAlerts"
  ],
  "additionalProperties": false
}
view source ↗

ioda_summarize_outages

open-world

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. 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. An empty result is not an all-clear. Pages are zero-based; keep filters and limit fixed.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_summarize_outages",
    "arguments": {
      "entityType": "<entityType>",
      "from": "<from>",
      "until": "<until>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "relatedToType": {
      "description": "Scope type: country, region, asn, or geoasn. With relatedToCode, returns only entityType entities related to that entity, such as the regions or networks of one country. Requires entityType and excludes entityCode; blank is omitted. IODA evaluates a bounded related set, so a very large scope (thousands of networks in one country) can be incomplete; prefer region scopes there.",
      "type": "string"
    },
    "relatedToCode": {
      "description": "Scope entity code, normalized like entityCode for relatedToType (IR, 1829, AS42337, 60627-IR); resolve names with ioda_search_entities. Provide with relatedToType.",
      "type": "string"
    },
    "from": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Inclusive Unix seconds UTC; no milliseconds; window at most 31 days."
    },
    "until": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Exclusive Unix seconds UTC, after from and no later than now."
    },
    "limit": {
      "default": 20,
      "description": "Upstream page size; values above 100 are served as 100 with a notice. Keep fixed when continuing.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "page": {
      "default": 0,
      "description": "Zero-based upstream page; restart at 0 when changing limit.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "extendWindowSeconds": {
      "default": 1209600,
      "description": "Seconds before from to search for the start of an event overlapping the window, and after until for its recovery; defaults to 1209600 (14 days), IODA's default. Values above 1209600 are served as 1209600 with a notice. Large extensions on type-only rankings can time out; zero may miss long-running detections.",
      "type": "integer",
      "minimum": 0,
      "maximum": 12096000
    }
  },
  "required": [
    "entityType",
    "from",
    "until",
    "limit",
    "page",
    "extendWindowSeconds"
  ],
  "additionalProperties": false
}
view source ↗

ioda_get_signals

open-world

Fetch numeric BGP visibility, active IPv4 /24 probing, or Merit telescope series for one entity in an explicit Unix-second window of at most 31 days. source is required: bgp, ping-slash24, or merit-nt. Nulls are missing observations, not zero connectivity. maxPoints requests upstream aggregation, not first-N samples; smaller values lose temporal resolution. Returned series retain aligned boundary buckets; timestamps and intervals support cross-source comparisons.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_get_signals",
    "arguments": {
      "entityType": "<entityType>",
      "entityCode": "<entityCode>",
      "from": "<from>",
      "until": "<until>",
      "source": "<source>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "from": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Inclusive Unix seconds UTC; no milliseconds; window at most 31 days."
    },
    "until": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Exclusive Unix seconds UTC, after from and no later than now."
    },
    "source": {
      "type": "string",
      "description": "Exactly bgp, ping-slash24, or merit-nt; case and whitespace normalized. gtr and ucsd-nt are not supported numeric sources."
    },
    "maxPoints": {
      "default": 200,
      "description": "Upstream aggregation target, not a local sample cap; smaller targets lose temporal resolution. Values above 2000 are served as 2000 with a notice.",
      "type": "integer",
      "minimum": 1,
      "maximum": 20000
    }
  },
  "required": [
    "entityType",
    "entityCode",
    "from",
    "until",
    "source",
    "maxPoints"
  ],
  "additionalProperties": false
}
view source ↗

ioda_get_alerts

open-world

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. Missing transitions do not establish health. Pages are zero-based; keep filters and limit fixed.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ioda_get_alerts",
    "arguments": {
      "from": "<from>",
      "until": "<until>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "entityType": {
      "type": "string",
      "description": "country, region, asn, or geoasn (one ASN within a region or country); whitespace and case are normalized."
    },
    "entityCode": {
      "type": "string",
      "description": "Two-letter country code, IODA numeric region code, decimal ASN (AS prefix accepted), or geoasn code joining an ASN and a region or country code (40934-576, 59962-IR); resolve names with ioda_search_entities and pass a returned code here."
    },
    "source": {
      "description": "bgp, ping-slash24, merit-nt, or gtr; blank means all sources. Case and whitespace are normalized.",
      "type": "string"
    },
    "relatedToType": {
      "description": "Scope type: country, region, asn, or geoasn. With relatedToCode, returns only entityType entities related to that entity, such as the regions or networks of one country. Requires entityType and excludes entityCode; blank is omitted. IODA evaluates a bounded related set, so a very large scope (thousands of networks in one country) can be incomplete; prefer region scopes there.",
      "type": "string"
    },
    "relatedToCode": {
      "description": "Scope entity code, normalized like entityCode for relatedToType (IR, 1829, AS42337, 60627-IR); resolve names with ioda_search_entities. Provide with relatedToType.",
      "type": "string"
    },
    "from": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Inclusive Unix seconds UTC; no milliseconds; window at most 31 days."
    },
    "until": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 9007199254740991,
      "description": "Exclusive Unix seconds UTC, after from and no later than now."
    },
    "limit": {
      "default": 20,
      "description": "Upstream page size; values above 100 are served as 100 with a notice. Keep fixed when continuing.",
      "type": "integer",
      "minimum": 1,
      "maximum": 1000
    },
    "page": {
      "default": 0,
      "description": "Zero-based upstream page; restart at 0 when changing limit.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "extendWindowSeconds": {
      "default": 0,
      "description": "Seconds before from and after until to also return transitions from; zero, the default, returns only transitions inside the window. Without entityType, large extensions are slow globally and can time out, so add entityType or keep the extension small. Values above 1209600 (14 days) are served as 1209600 with a notice.",
      "type": "integer",
      "minimum": 0,
      "maximum": 12096000
    }
  },
  "required": [
    "from",
    "until",
    "limit",
    "page",
    "extendWindowSeconds"
  ],
  "additionalProperties": false
}
view source ↗