io.github.cyanheads/ioda-outages-mcp-server
Investigate Internet outages with IODA events, alerts, and connectivity signals via MCP.
Que pouvez-vous faire avec io.github.cyanheads/ioda-outages-mcp-server ?
- 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 atuntil. Adjacent windows can duplicate boundary detections. Si... ignoreMethods: string[]on events, alerts, and rankings excludes detections upstream before event construction and scoring:source.method,source.*, or*.method, with sourcesbgp,ping-slash24,merit-nt, andgtr. Case/whitespace normalize an...- Every related-scope outage response warns that membership coverage is unverified, even on short or empty pages. Page
ioda_search_entitieswith the same entity type, scope, and limit, then query selected codes individually with the original window, source/... - Pagination is zero-based; follow
nextPagewith filters andlimitunchanged.more: "possible"signals possible continuation, not a known total; restart at page 0 after changing the limit. - Numeric inputs accept up to ten times their served cap (
limit100,maxPoints2,000,lookbackHours24,extendWindowSeconds1,209,600); a larger value is served at the cap and a notice names the requested value, the served value, and the route to the ... - 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.
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
claude mcp add --transport http ioda-outages-mcp-server 'https://ioda-outages.caseyjhand.com/mcp'
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "http",
"url": "https://ioda-outages.caseyjhand.com/mcp"
}
}
}
@cyanheads/ioda-outages-mcp-serverclaude mcp add ioda-outages-mcp-server -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/ioda-outages-mcp-server@0.3.0
{
"mcpServers": {
"ioda-outages-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/ioda-outages-mcp-server@0.3.0"
],
"env": {
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
@cyanheads/ioda-outages-mcp-serverclaude mcp add ioda-outages-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/ioda-outages-mcp-server@0.3.0
{
"mcpServers": {
"ioda-outages-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/ioda-outages-mcp-server@0.3.0"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
@cyanheads/ioda-outages-mcp-server
Investigate Internet outages with IODA events, alerts, and connectivity signals via MCP. STDIO or Streamable HTTP.
6 Tools
Public Hosted Server: https://ioda-outages.caseyjhand.com/mcp
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
| Tool | Description |
|---|---|
ioda_search_entities | Resolve country, region, ASN, or geoasn names and codes |
ioda_get_status | Inspect recent detection evidence and coverage across three numeric sources |
ioda_find_outages | Retrieve overlapping outage events for an entity or globally |
ioda_summarize_outages | Rank the entities of one type by IODA's per-window outage score |
ioda_get_signals | Fetch BGP, active IPv4 /24 probing, or Merit telescope numeric series |
ioda_get_alerts | Retrieve detection and recovery transitions with source baselines |
Capability reference
ioda_search_entities tool
- Required
entityType: country | region | asn | geoasn(a geoasn is one ASN within a region or country); choosequery(up to 200 UTF-16 code units after trimming) orentityCode, 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
relatedToTypeandrelatedToCodelistentityTypeentities within one country, region, ASN, or geoasn; both or neither,entityTyperequired, noentityCode, and a scope combines withquery. Page this resolver to select codes for individual outage investigations. limitis 1–1,000, default 20, served at most 100;pagestarts at 0. Returns originalentities,pagination, andprovenance; a metadata match does not establish measurement coverage.
ioda_get_status tool
- Required
entityType(country,region,asn, orgeoasn) andentityCode;lookbackHoursis 1–240, default 6, served at most 24 with a notice naming the uncovered earlier window. Collects events, alerts, andbgp,ping-slash24, andmerit-ntsummaries within the returnedwindow. detectionisobserved,none_returned, orunknown; sourcecoverageis independentlyrecent,stale,no_data, orunknown.recentmeans 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 aspendingCount, notnullCount.- Each
signalsentry carries IODA'sunitfor its source (Visible /24s,Up /24s,Unique Source IPs);latest,minimum, andmaximumare in that unit. componentsdisclose partial failures and standalone-tool recovery. Event/alert pages carry continuation metadata; raw samples come fromioda_get_signals. All-component failure fails the call; an unknown country, region, or geoasn code fails withentity_not_found.
ioda_find_outages tool
- Required
fromanduntil; optionalentityType(country,region,asn, orgeoasn),entityCode, andsource: bgp | ping-slash24 | merit-nt | gtr. Omit entity filters for global scope; a code requires its type. OptionalrelatedToTypeandrelatedToCodelimit results toentityTypeentities within one country, region, ASN, or geoasn (both or neither,entityTyperequired, noentityCode).limitis 1–1,000, default 20, served at most 100. - Returns source
events,pagination, andprovenance. Scores retain their source meaning; starts may precede the window and an end clipped atuntildoes not establish recovery. includeAlertsdefaults to false;extendWindowSecondsis 0–12,096,000, served at most 1,209,600. Omitted, it is 1,209,600 withentityTypeand 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 addentityType. Zero extension can miss long-running detections.
ioda_summarize_outages tool
- Required
entityType,from, anduntil; optionalentityCodefor one entity, orrelatedToTypeandrelatedToCodeto rankentityTypeentities within one country, region, ASN, or geoasn (both or neither, noentityCode).limitis 1–1,000, default 20, served at most 100;extendWindowSecondsis 0–12,096,000, default 1,209,600, served at most 1,209,600. There is nosourceinput. - Returns
summariesin IODA's order, descendingscores.overall, withpaginationandprovenance. Each row carries theentity,event_cnt(IODA's count of source events before merging), and unmodifiedscores:overallplus 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 intooverall. - 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
entityCodeor a related scope. An empty result is not an all-clear.
ioda_get_signals tool
- Required entity pair (
entityTypemay begeoasn),from,until, andsource: bgp | ping-slash24 | merit-nt(gtranducsd-ntare not numeric sources here).maxPointsis 1–20,000, default 200, served at most 2,000: an upstream aggregation target, not a hard returned-sample cap. - Returns every numeric subtype in
series, source-specificsemantics(measurement, IODA'sunit, caveat), andprovenance. An unknown country, region, or geoasn code fails withentity_not_found. Returneduntilis 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 staysunknownfor coarse series.
ioda_get_alerts tool
- Required
fromanduntil; optional entity, source, and related-scope filters matchioda_find_outages; a related scope is served at page 0 only, because IODA cannot continue scoped alerts.limitis 1–1,000, default 20, served at most 100;extendWindowSecondsis 0–12,096,000, default 0, served at most 1,209,600. - Returns
alerts,pagination, andprovenance, retaining sourcelevel,condition,value, andhistoryValuewhen reported.valueandhistoryValueare in the source unit forbgp,ping-slash24, andmerit-nt; forgtrthey are IODA Traffic divided by 1,000,000 and truncated. A missing transition does not establish health or rule out an event that began earlier.
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 atuntil. Adjacent windows can duplicate boundary detections. Signal bounds describe aligned buckets; status echoes the requested window across components with different selection rules. ignoreMethods: string[]on events, alerts, and rankings excludes detections upstream before event construction and scoring:source.method,source.*, or*.method, with sourcesbgp,ping-slash24,merit-nt, andgtr. Case/whitespace normalize and duplicates collapse; an empty array excludes nothing. Malformed terms and*.*failinvalid_arguments; an explicitsourceplus its ownsource.*failsinvalid_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_entitieswith 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.moredescribes row pages, not scope completeness. - Pagination is zero-based; follow
nextPagewith filters andlimitunchanged.more: "possible"signals possible continuation, not a known total; restart at page 0 after changing the limit. - Numeric inputs accept up to ten times their served cap (
limit100,maxPoints2,000,lookbackHours24,extendWindowSeconds1,209,600); a larger value is served at the cap and a notice names the requested value, the served value, and the route to the rest. Minimums and values above the accepted maximum fail argument validation. - 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;
appliedechoes effective inputs. - Explicit uncertainty — null samples, missing fields, source coverage, and partial component failures stay distinct.
- Complete, bounded responses —
content[]andstructuredContentcarry the same data, enrichment included. Upstream bodies cap at 2 MiB and the combined response at 96 KiB; past that,response_too_largenames a smaller call instead of dropping records.
Getting started
Public Hosted Instance
A public instance is available at https://ioda-outages.caseyjhand.com/mcp — no installation required. It serves Streamable HTTP; each client takes its own config shape.
For Claude Code:
claude mcp add --transport http ioda-outages-mcp-server https://ioda-outages.caseyjhand.com/mcp
For Cline (cline_mcp_settings.json):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "streamableHttp",
"url": "https://ioda-outages.caseyjhand.com/mcp"
}
}
}
For Cursor (mcp.json):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"url": "https://ioda-outages.caseyjhand.com/mcp"
}
}
}
Claude Desktop adds remote servers under Settings → Connectors.
Self-Hosted / Local
Add the following to your MCP client configuration file. IODA requires no API key.
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/ioda-outages-mcp-server@latest"]
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"ioda-outages-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/ioda-outages-mcp-server@latest"]
}
}
}
Or with 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"]
}
}
}
For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcp
Prerequisites
- Bun v1.4.0 or higher (or Node.js v24+).
- Outbound HTTPS to
api.ioda.inetintel.cc.gatech.edu. No API key or account.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/ioda-outages-mcp-server.git
- Navigate into the directory:
cd ioda-outages-mcp-server
- Install dependencies:
bun install
- Configure environment (optional):
cp .env.example .env
# no server-specific variables; edit framework overrides as needed
Configuration
The server has no settings of its own. The common framework variables:
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_HOST | HTTP bind address. | 127.0.0.1 |
MCP_HTTP_PORT | HTTP server port. | 3010 |
MCP_HTTP_ENDPOINT_PATH | MCP endpoint path. | /mcp |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for the full list of framework overrides.
Running the server
Local development
- Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio - Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
| Directory | Purpose |
|---|---|
src/index.ts | Server identity, tool registration, service lifecycle |
src/mcp-server/tools/definitions/ | Six read-only tools |
src/mcp-server/tools/ioda-common.ts | Shared input normalization, rendering, response budgeting |
src/services/ioda/ | Fixed-origin API client, schemas, pacing, status assessment |
tests/ | Contract, service, and formatting tests |
docs/design.md | Domain contracts, design decisions, API evidence |
docs/tree.md | Generated 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/catchin tool logic - Use
ctx.logfor logging,ctx.signalfor cancellation, andctx.enrichfor applied inputs and notices - Register new tools in the
createApp()arrays insrc/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:
bun run devcheck
bun 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.
Questions fréquentes
Qu'est-ce que io.github.cyanheads/ioda-outages-mcp-server ?
Investigate Internet outages with IODA events, alerts, and connectivity signals via MCP.
Comment installer io.github.cyanheads/ioda-outages-mcp-server ?
Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http ioda-outages-mcp-server 'https://ioda-outages.caseyjhand.com/mcp'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour io.github.cyanheads/ioda-outages-mcp-server ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
io.github.cyanheads/ioda-outages-mcp-server est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient io.github.cyanheads/ioda-outages-mcp-server ?
Il est publié par cyanheads. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.