devops-status-mcp-server

v0.8.1 pre-1.0

Check vendor status pages, inspect SSL/TLS certificates, verify DNS propagation, and get incident-response playbooks via MCP. STDIO or Streamable HTTP.

devops-status.caseyjhand.com/mcp
claude mcp add --transport http devops-status-mcp-server https://devops-status.caseyjhand.com/mcp
codex mcp add devops-status-mcp-server --url https://devops-status.caseyjhand.com/mcp
{
  "mcpServers": {
    "devops-status-mcp-server": {
      "url": "https://devops-status.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http devops-status-mcp-server https://devops-status.caseyjhand.com/mcp
{
  "mcpServers": {
    "devops-status-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://devops-status.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "devops-status-mcp-server": {
      "type": "http",
      "url": "https://devops-status.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://devops-status.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2026-07-28" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2026-07-28","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

7

read 6

devops_list_vendors

List vendors in the built-in registry, optionally filtered by category or name search. Returns slug, display name, category, and status page URL for each entry. Use to discover the correct slug to pass to other tools, or to see which vendors are available before configuring a stack.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_list_vendors",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "query": {
      "description": "Free-text search against vendor name and slug. Case-insensitive. E.g., \"cloud\", \"auth\", \"slack\".",
      "type": "string"
    },
    "category": {
      "description": "Filter to one category: cloud, cdn-edge, dev-platform, data, comms, auth, monitoring, or ai.",
      "type": "string",
      "enum": [
        "cloud",
        "cdn-edge",
        "dev-platform",
        "data",
        "comms",
        "auth",
        "monitoring",
        "ai"
      ]
    }
  },
  "additionalProperties": false
}
view source ↗

devops_status_check

open-world

Check the current health status for one or more vendors. Accepts registered vendor slugs (e.g., "github", "aws", "gcp", "gitlab") or raw Atlassian Statuspage base URLs. Registry entries are served by each vendor's native status API (Statuspage, Status.io, Slack, AWS Health, Google Cloud Service Health, Firehydrant) and normalized to one shape. Returns per-vendor operational indicator (none = all clear, minor, major, critical, maintenance = scheduled window), degraded components, and active incidents. Use mode: "detailed" for component lists and maintenance windows, narrowed with component_filter and bounded by component_limit. Batch-friendly — pass a list to check your full stack in one call; a vendor that cannot be resolved or reached is reported in its own result row, so one bad entry never discards the rest.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_status_check",
    "arguments": {
      "vendors": "<vendors>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "vendors": {
      "minItems": 1,
      "maxItems": 20,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "description": "A vendor slug (e.g., \"github\") or raw Atlassian Statuspage base URL."
      },
      "description": "Vendor slugs from the built-in registry (e.g., \"github\", \"aws\") or raw Atlassian Statuspage base URLs (non-Statuspage backends are supported via registry slugs only). Mix freely. Use devops_list_vendors to discover available slugs."
    },
    "mode": {
      "default": "summary",
      "description": "summary: indicator + degraded components + active incidents only. detailed: adds the component list and scheduled maintenance windows.",
      "type": "string",
      "enum": [
        "summary",
        "detailed"
      ]
    },
    "component_filter": {
      "description": "Case-insensitive substring matched against component names in detailed mode (e.g., \"api\" to check just the API components). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. Ignored in summary mode.",
      "type": "string"
    },
    "component_limit": {
      "default": 50,
      "description": "Maximum components returned per vendor in detailed mode (1-500). Large status pages publish hundreds of components, so a multi-vendor batch at a high limit returns a very large response; narrow with component_filter instead where possible.",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "vendors",
    "mode",
    "component_limit"
  ],
  "additionalProperties": false
}
view source ↗

devops_get_incidents

open-world

Fetch incident history and scheduled maintenance windows for a vendor. Returns full incident timeline — each investigator update, affected components, and resolution. Filter by status to focus on active incidents (use before deploy), resolved history (for postmortem), or upcoming maintenance windows. Page through long histories with limit + offset — a truncated result discloses the total and returns the value to page with in nextOffset. Some vendor feeds cap their own history: when upstreamCeiling is present the vendor API returned everything it will serve, and older incidents are reachable only on the vendor status page, not at a higher offset. An empty result explains itself in notice.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_get_incidents",
    "arguments": {
      "vendor": "<vendor>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "vendor": {
      "type": "string",
      "minLength": 1,
      "description": "Vendor slug (e.g., \"github\", \"aws\") or raw Atlassian Statuspage base URL. Use devops_list_vendors to find slugs."
    },
    "filter": {
      "default": "all",
      "description": "all: incidents plus scheduled maintenances. active: only incidents with status investigating/identified/monitoring. resolved: only fully resolved incidents. scheduled: only scheduled maintenance windows. Not every vendor backend serves every filter — \"aws\" publishes currently-open events only (never resolved, no maintenance windows), and \"gcp\" and \"slack\" publish no maintenance windows. An empty result names which case applied.",
      "type": "string",
      "enum": [
        "all",
        "active",
        "resolved",
        "scheduled"
      ]
    },
    "limit": {
      "default": 20,
      "description": "Maximum incidents to return per call (1–50). Page through longer history with offset rather than raising this.",
      "type": "integer",
      "minimum": 1,
      "maximum": 50
    },
    "offset": {
      "default": 0,
      "description": "Number of matching incidents to skip before applying limit, for paging through history. 0 (default) returns the most recent page; a truncated result returns the value to use next in the nextOffset field. Raising offset past the number of matches returns an empty list and says so.",
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "vendor",
    "filter",
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

devops_check_certs

open-world

Inspect SSL/TLS certificate health for one or more domains by performing a real TLS handshake. Works for any internet-accessible domain — no vendor registry required. Reports days to expiry (flagged at < 30 days warning and < 7 days critical), certificate subject and SANs, issuer, hostname coverage, chain-trust verification, TLS protocol version negotiated (flags TLS 1.0/1.1 as insecure), cipher suite, and HSTS presence. The handshake completes even for a certificate clients would reject, so a broken certificate is reported rather than hidden behind a connection error: a hostname mismatch surfaces in cert.hostname_verification_error and a chain-trust failure (self-signed, untrusted root) in cert.authorization_error, both status "critical". If a domain fails to connect at all, check devops_check_dns first — the name may not resolve.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_check_certs",
    "arguments": {
      "domains": "<domains>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "domains": {
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "description": "Domain name without protocol (e.g., \"api.github.com\", \"example.com\")."
      },
      "description": "Domains to inspect. Do not include \"https://\" — pass the bare hostname. Up to 10 per call."
    },
    "port": {
      "default": 443,
      "description": "TLS port. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints.",
      "type": "integer",
      "minimum": 1,
      "maximum": 65535
    },
    "timeout_ms": {
      "default": 5000,
      "description": "Connection timeout per domain in milliseconds. Defaults to the DEVOPS_STATUS_CERT_TIMEOUT_MS env var (5000 when unset). Increase for slow or geographically distant endpoints.",
      "type": "integer",
      "minimum": 1000,
      "maximum": 15000
    }
  },
  "required": [
    "domains",
    "port",
    "timeout_ms"
  ],
  "additionalProperties": false
}
view source ↗

devops_check_dns

open-world

Resolve DNS records for one or more domains across multiple public resolvers and compare what each resolver returned. Works for any domain — no vendor registry required. Reports records found (A/AAAA/CNAME/MX/TXT/NS), resolution latency per resolver, and a typed outcome per resolver and record type so "the domain does not exist" (nxdomain), "the resolver could not answer" (servfail), and "no record of this type" (nodata) stay distinguishable. Resolver disagreements are reported without asserting a cause: partial_resolution (some resolvers answered, others returned nothing) points at a real propagation or resolver problem, while value_variation (every resolver answered with different values) is the normal steady state for anycast and geo-steered domains. Pair with devops_check_certs when a domain resolves but TLS to it is failing.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_check_dns",
    "arguments": {
      "domains": "<domains>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "domains": {
      "minItems": 1,
      "maxItems": 10,
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "description": "A domain name to query (e.g., \"github.com\", \"api.example.com\")."
      },
      "description": "Domain names to query. Up to 10 per call."
    },
    "record_types": {
      "default": [
        "A",
        "AAAA",
        "MX",
        "TXT"
      ],
      "description": "DNS record types to resolve. Defaults to A, AAAA, MX, and TXT. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "A",
          "AAAA",
          "CNAME",
          "MX",
          "TXT",
          "NS"
        ]
      }
    },
    "resolvers": {
      "default": [
        "8.8.8.8",
        "1.1.1.1",
        "9.9.9.9"
      ],
      "description": "Resolver IP addresses to query. Defaults to Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9). Add custom resolvers to test resolver-specific behavior. Each must be an IP literal, not a hostname; resolvers in private, loopback, or cloud-metadata ranges are rejected unless DEVOPS_STATUS_ALLOW_PRIVATE_TARGETS=true.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "description": "A resolver IP literal — IPv4 (\"8.8.8.8\"), IPv6 (\"2001:4860:4860::8888\"), or either with a port (\"1.1.1.1:53\", \"[2001:4860:4860::8888]:53\"). A hostname is rejected."
      }
    },
    "timeout_ms": {
      "default": 3000,
      "description": "Query timeout per domain+resolver combination in milliseconds. Defaults to the DEVOPS_STATUS_DNS_TIMEOUT_MS env var (3000 when unset).",
      "type": "integer",
      "minimum": 1000,
      "maximum": 10000
    }
  },
  "required": [
    "domains",
    "record_types",
    "resolvers",
    "timeout_ms"
  ],
  "additionalProperties": false
}
view source ↗

devops_suggest_action

Return an incident-response playbook tailored to a vendor degradation, with pre-filled follow-up tool calls. Synthesizes category-specific guidance (cloud, CDN, dev-platform, auth, etc.) from built-in incident knowledge and the provided context. Use after devops_status_check or devops_get_incidents surfaces a problem to determine what to investigate next.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_suggest_action",
    "arguments": {
      "vendor": "<vendor>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "vendor": {
      "type": "string",
      "minLength": 1,
      "description": "Vendor slug or display name (e.g., \"cloudflare\", \"github\"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage)."
    },
    "incident_summary": {
      "description": "Latest incident description or update body from devops_get_incidents. Paste the most recent update to get more targeted advice.",
      "type": "string"
    },
    "affected_components": {
      "description": "Component names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Used to tailor suggestions to the impacted subsystem.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "your_domain": {
      "description": "Your own domain or service URL. When provided, nextToolSuggestions will be pre-filled with your domain for cert and DNS checks.",
      "type": "string"
    },
    "vendor_indicator": {
      "description": "Overall vendor status indicator from a prior devops_status_check call (its indicator field). When provided, the playbook leads with severity-tailored urgency guidance. Omit if status has not been checked yet.",
      "type": "string",
      "enum": [
        "none",
        "minor",
        "major",
        "critical",
        "maintenance"
      ]
    }
  },
  "required": [
    "vendor"
  ],
  "additionalProperties": false
}
view source ↗

write 1

devops_watch_stack

open-world

Check the health of a named vendor stack — a saved list of vendors representing your infrastructure dependencies. On the first call, provide vendors to define the stack; subsequent calls can omit vendors to reuse the persisted list. Returns a unified health snapshot with an aggregate rollup plus per-vendor detail. A vendor that cannot be resolved or reached is reported in its own row and left out of the saved stack, so one bad entry never discards the sweep. Ideal for morning status checks or pre-deploy sweeps. Multiple stacks can coexist (e.g., "production", "staging").

write
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "devops_watch_stack",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "vendors": {
      "description": "Vendor slugs (e.g., \"github\", \"aws\") or raw Atlassian Statuspage base URLs. When provided, saves this list as the stack. When omitted, uses the previously saved list for stack_name.",
      "type": "array",
      "items": {
        "type": "string",
        "description": "A vendor slug (e.g., \"github\") or raw Atlassian Statuspage base URL."
      }
    },
    "stack_name": {
      "default": "default",
      "description": "Name for this vendor stack. Defaults to \"default\". Use distinct names to manage multiple stacks (e.g., \"production\", \"data-layer\"). Letters, digits, hyphens, and underscores, optionally separated by single dots or slashes (\"prod.eu\", \"team/prod\"); 1-64 characters. No spaces or colons.",
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[a-zA-Z0-9_-]+([./][a-zA-Z0-9_-]+)*$"
    },
    "mode": {
      "default": "summary",
      "description": "summary: indicator + degraded components + active incidents. detailed: adds component lists and maintenance windows.",
      "type": "string",
      "enum": [
        "summary",
        "detailed"
      ]
    },
    "component_filter": {
      "description": "Case-insensitive substring matched against component names in detailed mode (e.g., \"api\" to check just the API components). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. Ignored in summary mode.",
      "type": "string"
    },
    "component_limit": {
      "default": 50,
      "description": "Maximum components returned per vendor in detailed mode (1-500). Large status pages publish hundreds of components, so a full stack at a high limit returns a very large response; narrow with component_filter instead where possible.",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "stack_name",
    "mode",
    "component_limit"
  ],
  "additionalProperties": false
}
view source ↗

Resources

1

Full registry entry for a vendor by slug — status page URL, category, and API type. Read-only, stable. Use devops_list_vendors to discover available slugs.

uri devops-status://vendors/{name} mime application/json