About devops-status-mcp-server
An MCP server for checking vendor status pages, incidents, TLS certificates, and DNS propagation. It is aimed at operations teams, combining normalized status checks for a built-in vendor registry with domain diagnostics and deterministic incident playbooks.
Key features
- 01Check vendor status and incident timelines
- 02Save and recheck named vendor stacks
- 03Inspect TLS certificates and domain security details
- 04Compare DNS responses across public resolvers
- 05Generate incident-response playbooks
Use cases
- 01Check provider health during an outage
- 02Review incident updates for affected vendors
- 03Verify certificates before renewal deadlines
- 04Investigate DNS propagation discrepancies
MCP support
Exposes seven tools and a vendor registry resource to MCP clients. Supports STDIO and Streamable HTTP; status checks, certificate inspection, and DNS checks require no API keys.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://devops-status.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-devops-status https://devops-status.caseyjhand.com/mcp{"mcpServers":{"cyanheads-devops-status":{"type":"http","url":"https://devops-status.caseyjhand.com/mcp"}}}Open in Cursor{"servers":{"cyanheads-devops-status":{"type":"http","url":"https://devops-status.caseyjhand.com/mcp"}}}Open in VS Code{"mcpServers":{"cyanheads-devops-status":{"type":"http","url":"https://devops-status.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-devops-status":{"serverUrl":"https://devops-status.caseyjhand.com/mcp"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
7| Parameter | Type | Required | Description |
|---|---|---|---|
| query | string | No | Substring search against vendor slug and display name. Case-insensitive; surrounding whitespace is ignored. E.g., "cloud", "auth", "slack". |
| category | enum | No | Filter to one category: cloud, cdn-edge, dev-platform, data, comms, auth, monitoring, or ai.cloud | cdn-edge | dev-platform | data | comms | auth | monitoring | ai |
Details
From the project README@cyanheads/devops-status-mcp-server
Check vendor status pages, inspect SSL/TLS certificates, verify DNS propagation, and get incident-response playbooks via MCP. STDIO or Streamable HTTP.
Public Hosted Server: https://devops-status.caseyjhand.com/mcp
Overview
Status pages for 53 vendors — AWS, Google Cloud, Azure, Slack, and more — in one normalized format. Check who's down, pull incident timelines, watch your stack, and get an incident-response playbook. Plus TLS certificate and DNS checks for any domain. No API keys required.
Tools
| Tool | Description |
|---|---|
devops_list_vendors | List vendors in the built-in registry, optionally filtered by name or category. Returns slug, display name, category, and status page URL. |
devops_status_check | Check the current health status for one or more vendors. Returns per-vendor indicator (none / minor / major / critical / maintenance), degraded components, and active incident summaries. |
devops_get_incidents | Fetch incident history for a vendor — active, resolved, or scheduled maintenance. Returns the full incident timeline with per-update bodies and affected components. |
devops_watch_stack | Check the health of a named vendor stack. Where the server identifies the caller (stdio, or HTTP with jwt/oauth auth), pass vendors once to save the list and later calls reuse it; on HTTP with MCP_AUTH_MODE=none nothing is saved and vendors is required on every call. Returns an aggregate health rollup plus per-vendor detail. |
devops_check_certs | Inspect SSL/TLS certificate health for one or more domains via a real TLS handshake. Reports expiry, chain depth, protocol version, cipher suite, and HSTS presence on HTTP ports. Pure TypeScript — no external API. |
devops_check_dns | Resolve DNS records and verify propagation for one or more domains across Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9). Reports per-resolver latency and resolver discrepancies. Pure TypeScript — no external API. |
devops_suggest_action | Instruction tool — returns a tailored incident-response playbook and pre-filled follow-up tool calls given a vendor name and optional incident context. No external calls; fully deterministic. |
Resources
| Resource | Description |
|---|---|
devops-status://vendors/{name} | Full registry entry for a vendor by slug — status page URL, category, and API type. |
All resource data is also reachable via tools. Tool-only agents are fully supported.
Capability reference
devops_list_vendors tool
- Optional free-text
query(name and slug, case-insensitive) and optionalcategory:cloud,cdn-edge,dev-platform,data,comms,auth,monitoring,ai - Returns slug (what to pass to other tools), display name, category, and status page URL; an empty result carries a
noticenaming what missed - 53 built-in entries, most on Atlassian Statuspage;
aws,gcp,azure,azure-devops,gitlab,neon,slack, andredis-clouduse native-API adapters. Statuspage-compatible pages not in the registry work by passing a raw base URL to other tools
Built-in vendor registry:
| Category | Vendors |
|---|---|
cloud | digitalocean, linode, aws, gcp, azure |
cdn-edge | cloudflare, akamai |
dev-platform | gitlab, github, azure-devops, npm, vercel, netlify, render, fly-io, circleci, travis-ci, snyk, atlassian, figma, launchdarkly |
data | mongodb-atlas, planetscale, supabase, neon, redis-cloud, elastic, influxdb, upstash, cloudinary, segment |
comms | slack, discord, twilio, sendgrid, mailgun, hubspot, brevo, courier, loops |
auth | auth0, clerk, workos |
monitoring | datadog, sentry, new-relic, grafana-cloud, honeycomb |
ai | openai, anthropic, elevenlabs, pinecone, cohere |
devops_status_check tool
- Accepts vendor slugs (e.g.,
github,aws) or raw Atlassian Statuspage base URLs, mixed freely. Up to 20 are checked per call; the rest come back indeferred_vendorswith anoticeto resend them. More than 100 entries is rejected (invalid_arguments) mode: "summary"(default) returns the indicator, degraded components, and active incidents;mode: "detailed"adds the full component list (component_limit, default 50, clamped to 500) and scheduled maintenance windows.component_filtermatches component or group names- One failing vendor never blocks the rest (per-vendor
errorfield). Results are cached for 60 seconds (cached: true), andsummarycountsoperational/degraded/down/maintenance/unavailable nextToolSuggestionspre-fills adevops_suggest_actioncall for each vendor with an active problem
devops_get_incidents tool
filter:all(default),active,resolved, orscheduled(maintenance windows only).limit(default 20, max 50) withoffsetfor paging- Returns per-update bodies as plain text in chronological order, affected component names, duration in minutes for resolved incidents, and a shortlink. Each incident carries
source:api, orhistoryfor an archive record (title, impact, times, and final message only) sinceanduntil(YYYY-MM-DD, UTC) bound the start date and work withfilter: "all"or"resolved";sincealso reads the Statuspage history archive back up to 24 months, past the API's newest-50 limit.matchkeeps incidents whose title or component names contain every word given (up to 200 characters)- Responses are capped at 64,000 bytes per surface; a cut page sets
truncated: trueandnextOffset.full_updates: truekeeps every update on a single oversized incident - Errors:
invalid_sinceandinvalid_until(filter: "active"or"scheduled", oruntilbeforesince) - Feeds with no data for a filter return empty:
resolvedfor Azure,scheduledfor AWS, Azure, Azure DevOps, Google Cloud, and Slack
devops_watch_stack tool
- Pass
vendors(up to 20) once to save the stack understack_name(1-64 characters; several stacks can coexist, e.g."production"); later calls can omitvendors. Over 20 is rejected withstack_too_large. Saving works on stdio and on HTTP withMCP_AUTH_MODE=jwt|oauth; with the defaultin-memorystorage, saved stacks do not survive a restart - On HTTP with
MCP_AUTH_MODE=nonenothing is saved: a call withvendorsruns the sweep and returnsstack_persisted: false, and a call withoutvendorsfails withvendors_required - Aggregate
health:all_operational/maintenance/degraded/partial_outage/major_outage/unknown(a vendor could not be reached).component_limitandnextToolSuggestionswork as indevops_status_check
devops_check_certs tool
- Accepts hostnames, IP addresses,
host:port, or URLs; a port on the entry overridesport(default 443). The first 10 entries are inspected (up to 100 accepted); the rest come back indeferred_domainsto resend - Reports days to expiry (
warningunder 30 days,criticalunder 7), subject and SANs, issuer, chain depth, TLS version (1.0 and 1.1 flagged insecure), cipher suite, and HSTS on HTTP ports status: "critical"separates a hostname mismatch (hostname_verification_error) from an untrusted chain (authorization_error). Per-domain failures come back inline asstatus: "error"with the reason inerrortimeout_msis one deadline per domain (max 15000)
devops_check_dns tool
- Accepts domain names, URLs, or
host:port; the first 10 domains are queried (up to 100 accepted) and the rest come back indeferred_domains. IP addresses get their ownerrorrow - Queries Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9) in parallel for A, AAAA, CNAME, MX, TXT, NS, CAA, and SOA (default A, AAAA, MX, TXT)
- Reports per-resolver latency and typed discrepancies:
partial_resolution(some resolvers did not answer) is a real problem;value_variation(different values) is normal for anycast or geo-steered domains - Custom
resolverstake public IP literals, first 5 queried and the rest indeferred_resolvers; private and loopback addresses needDEVOPS_STATUS_ALLOW_PRIVATE_TARGETS=true.timeout_msapplies per domain and resolver (max 10000)
devops_suggest_action tool
- Takes a vendor slug or display name and returns a category-tailored markdown playbook, with generic guidance for unrecognized vendors
- Optional
incident_summary,affected_components, andvendor_indicatoradd a subsystem section and severity-based urgency nextToolSuggestionspre-fills follow-up calls, including cert and DNS checks whenyour_domainis given. WithDEVOPS_STATUS_DISABLE_ACTIVE_PROBES=true, guidance uses manual commands (dig,openssl s_client) instead
devops-status://vendors/{name} resource
- Returns the full registry entry for a vendor slug: status page URL, category, API type (
statuspage,statusio,slack,aws,gcp,azure,azure-devops,firehydrant), andcomponent_scope_prefixwhere a vendor covers part of a shared page (sendgrid) - Cached publicly for 1 hour; the same data is reachable via
devops_list_vendors
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.
DevOps-status-specific:
- No API keys required — every status backend is a public API; TLS and DNS use the Node.js standard library
- 53-vendor built-in registry across eight categories; native adapters normalize Status.io, Slack, AWS Health, Google Cloud, Azure, Azure DevOps, and Firehydrant into the Statuspage shape
- Vendor-authored text, DNS record values, and certificate names are escaped so they read as data, not markup
- 60-second in-memory cache on status reads, shared across tenants
devops_watch_stacksaves named vendor lists for repeat checks and pre-deploy sweepsdevops_suggest_actionis deterministic, with no LLM sampling dependency
Agent-friendly output:
- Batch tools never let one failing target block the rest; errors come back as inline
errorfields cachedandchecked_aton every status result show when data was fetched- Fixed indicator and status enums (
none/minor/major/critical/maintenance) let callers branch on data nextToolSuggestionspre-fills follow-up tool arguments from incident context
Getting started
Public Hosted Instance
A public instance is available at https://devops-status.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:
{
"mcpServers": {
"devops-status-mcp-server": {
"type": "streamable-http",
"url": "https://devops-status.caseyjhand.com/mcp"
}
}
}
Self-Hosted / Local
No API key required. Add the following to your MCP client configuration file:
{
"mcpServers": {
"devops-status-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/devops-status-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with npx (no Bun required):
{
"mcpServers": {
"devops-status-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/devops-status-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Or with Docker:
{
"mcpServers": {
"devops-status-mcp-server": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "MCP_TRANSPORT_TYPE=stdio",
"ghcr.io/cyanheads/devops-status-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+).
- No API keys or external accounts required.
Installation
- Clone the repository:
git clone https://github.com/cyanheads/devops-status-mcp-server.git
- Navigate into the directory:
cd devops-status-mcp-server
- Install dependencies:
bun install
- Configure environment:
cp .env.example .env
# edit .env if you want to override defaults
Configuration
No API keys required. All environment variables are optional.
| Variable | Description | Default |
|---|---|---|
DEVOPS_STATUS_CACHE_TTL_MS | In-memory cache TTL for vendor status reads (all backends) in milliseconds. | 60000 |
DEVOPS_STATUS_FETCH_TIMEOUT_MS | Per-request timeout for vendor status API calls (all backends) in milliseconds. | 8000 |
DEVOPS_STATUS_CERT_TIMEOUT_MS | Default timeout_ms for devops_check_certs (1000–15000). | 5000 |
DEVOPS_STATUS_DNS_TIMEOUT_MS | Default timeout_ms for devops_check_dns (1000–10000). | 3000 |
DEVOPS_STATUS_ALLOW_PRIVATE_TARGETS | When true, disables SSRF guards for user-supplied URLs and domains. Trusted local deployments only. | false |
DEVOPS_STATUS_DISABLE_ACTIVE_PROBES | When true, removes devops_check_dns and devops_check_certs. For shared public instances. | false |
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Port for HTTP server. | 3010 |
MCP_SESSION_MODE | HTTP session handling: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Auth mode: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (RFC 5424). | info |
LOGS_DIR | Directory for log files (Node.js only). | <project-root>/logs |
OTEL_ENABLED | Enable OpenTelemetry instrumentation. | false |
An invalid DEVOPS_STATUS_* value stops startup with an error naming the variable.
See .env.example for the full list of optional overrides.
Running the server
Local development
-
Build and run:
bun run rebuild bun run start:stdio # or bun run start:http -
Run checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t devops-status-mcp-server .
docker run --rm -p 3010:3010 devops-status-mcp-server
The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/devops-status-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
| Path | Purpose |
|---|---|
src/index.ts | createApp() entry point — registers tools, resources, and inits services. |
src/config/ | Server-specific environment variable parsing and validation with Zod. |
src/mcp-server/tools/ | Tool definitions (*.tool.ts). |
src/mcp-server/resources/ | Resource definitions (*.resource.ts). |
src/services/cert/ | node:tls — TLS handshake, X.509 parsing, expiry and protocol flagging, legacy-TLS retry, HSTS read. |
src/services/dns/ | DNS wire client (node:dgram / node:net): message encoding and bounds-checked decoding, UDP with TCP retry; multi-resolver fan-out and propagation discrepancy detection. |
src/services/statuspage/ | Statuspage public API client (reads through the shared cache in src/utils/cached-fetch.ts). |
src/services/status-adapters/ | Native-API adapters (Status.io, Slack, AWS Health, Google Cloud Service Health, Azure status, Azure DevOps status, Firehydrant), the shared RSS extractor, + api_type dispatch, normalizing into the Statuspage shapes. |
src/services/vendor-registry/ | In-memory vendor registry loaded from src/data/vendor-registry.ts. |
src/data/ | Static vendor registry data file (vendor-registry.ts). |
src/utils/ | Shared helpers — response cache and fetch, SSRF guard, domain-entry normalizer, HTML-to-text, vendor-text markdown escaping, input-bound notices, word matching. |
tests/ | Vitest tests mirroring src/. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storage - Register new tools and resources via the barrels in
src/mcp-server/*/definitions/index.ts devops_check_certsanddevops_check_dnsuse only Node.js stdlib — add no external deps for these paths
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run test
License
Apache-2.0 — see LICENSE for details.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.