devops-status-mcp-server
Vendor status pages, TLS cert inspection, DNS propagation checks, and incident-response playbooks.
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"devops-status-mcp-server": {
"command": "bun",
"args": [
"@cyanheads/devops-status-mcp-server"
]
}
}
}可运行的软件包
0.9.0streamable-http远程端点
https://devops-status.caseyjhand.com/mcpstreamable-http它能做什么
工具清单
工具(7)
🟢devops_list_vendors(query, category)
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.
输入模式
{
"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"
]
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"vendors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Use this as the vendor identifier in other tools."
},
"name": {
"type": "string",
"description": "Display name of the vendor."
},
"category": {
"type": "string",
"description": "Vendor category (e.g., \"dev-platform\", \"ai\")."
},
"statuspage_url": {
"type": "string",
"description": "Status page base URL — the Statuspage API base for Statuspage-backed vendors, the public status page URL for adapter-backed vendors (aws, gcp, gitlab, slack, neon, redis-cloud)."
}
},
"required": [
"slug",
"name",
"category",
"statuspage_url"
],
"additionalProperties": false,
"description": "A vendor entry from the built-in registry."
},
"description": "Matching vendors from the built-in registry."
},
"total": {
"type": "number",
"description": "Total number of vendors returned."
},
"categories": {
"type": "array",
"items": {
"type": "string"
},
"description": "All available category values for use in the category filter."
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode."
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"vendors",
"total",
"categories"
]
},
{
"required": [
"error"
]
}
]
}🟢devops_status_check(vendors, mode, component_filter, component_limit)
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.
输入模式
{
"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"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"vendor": {
"type": "string",
"description": "Vendor slug or URL as provided."
},
"name": {
"type": "string",
"description": "Display name of the vendor."
},
"indicator": {
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
],
"description": "Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage, maintenance = scheduled window in progress, planned rather than a fault."
},
"description": {
"type": "string",
"description": "Human-readable status description (e.g., \"All Systems Operational\")."
},
"degraded_components": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Component name."
},
"status": {
"type": "string",
"enum": [
"degraded_performance",
"partial_outage",
"major_outage",
"under_maintenance"
],
"description": "Degradation level: degraded_performance = slow/intermittent, partial_outage = some requests failing, major_outage = most requests failing, under_maintenance = scheduled maintenance in progress."
}
},
"required": [
"name",
"status"
],
"additionalProperties": false,
"description": "A degraded component entry."
},
"description": "Every component not in an operational state, uncapped — a vendor with a large edge-node fleet routinely publishes dozens. Includes in-progress maintenance windows (status under_maintenance) alongside genuine outages; read status to tell a planned window from a fault. Empty when all clear."
},
"active_incidents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique incident identifier from the vendor's status API."
},
"name": {
"type": "string",
"description": "Incident title."
},
"impact": {
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
],
"description": "Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history."
},
"status": {
"type": "string",
"description": "Current incident status (e.g., investigating, monitoring, resolved)."
},
"started_at": {
"description": "ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor.",
"type": [
"string",
"null"
]
},
"latest_update": {
"type": "string",
"description": "Most recent incident_update body text."
}
},
"required": [
"id",
"name",
"impact",
"status",
"latest_update"
],
"additionalProperties": false,
"description": "An active incident entry."
},
"description": "Active (non-resolved) incidents."
},
"scheduled_maintenances": {
"description": "Upcoming or in-progress maintenance windows. Present in detailed mode only.",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Maintenance window name."
},
"scheduled_for": {
"type": "string",
"description": "ISO 8601 UTC start time."
},
"scheduled_until": {
"type": "string",
"description": "ISO 8601 UTC end time."
},
"status": {
"type": "string",
"description": "Maintenance status (scheduled, in_progress, completed)."
}
},
"required": [
"name",
"scheduled_for",
"scheduled_until",
"status"
],
"additionalProperties": false,
"description": "A scheduled maintenance entry."
}
},
"all_components": {
"description": "Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only.",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Component name."
},
"status": {
"type": "string",
"description": "Component operational status."
},
"description": {
"description": "Component description, or null if not provided.",
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"status",
"description"
],
"additionalProperties": false,
"description": "A component entry."
}
},
"all_components_total": {
"description": "Components matching component_filter for this vendor before the component_limit cap. Larger than the length of all_components when this vendor was capped. Present in detailed mode only.",
"type": "number"
},
"cached": {
"type": "boolean",
"description": "True when this result was served from the 60s in-memory cache."
},
"checked_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp of this check."
},
"statuspage_url": {
"type": "string",
"description": "Status page base URL used for this vendor."
},
"error": {
"description": "Why this vendor could not be checked — unreachable status API, timeout, non-2xx, or a response that is not a Statuspage payload. Reported here rather than thrown so one bad vendor does not fail the batch. Absent when the vendor was fetched successfully.",
"type": "string"
}
},
"required": [
"vendor",
"name",
"indicator",
"description",
"degraded_components",
"active_incidents",
"cached",
"checked_at",
"statuspage_url"
],
"additionalProperties": false,
"description": "Status result for a single vendor."
},
"description": "Per-vendor status results in the same order as the input vendors list."
},
"summary": {
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total number of vendors checked."
},
"operational": {
"type": "number",
"description": "Vendors with indicator = none and no error."
},
"degraded": {
"type": "number",
"description": "Vendors with indicator = minor or major."
},
"down": {
"type": "number",
"description": "Vendors with indicator = critical."
},
"maintenance": {
"type": "number",
"description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults."
},
"unavailable": {
"type": "number",
"description": "Vendors that could not be checked (carry an error) — unresolvable slug, blocked target, or failed status fetch. Counted as unknown, never operational."
}
},
"required": [
"total",
"operational",
"degraded",
"down",
"maintenance",
"unavailable"
],
"additionalProperties": false,
"description": "Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + maintenance + unavailable = total."
},
"truncated": {
"description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.",
"type": "boolean"
},
"shown": {
"description": "Components returned across all vendors. Present only when truncated.",
"type": "number"
},
"cap": {
"description": "The per-vendor component_limit that was applied. Present only when truncated.",
"type": "number"
},
"totalCount": {
"description": "Components matching component_filter across all vendors before the cap. Present only when truncated.",
"type": "number"
},
"notice": {
"description": "Plain-language explanation of the capped component lists — how many components were omitted and how to reach them (component_filter to target one, component_limit to raise the cap). Present only when truncated.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode. Declared by this tool: `vendor_not_found`: No requested vendor could be checked and the first failure was a slug that matches no registry entry and is not a valid URL. `target_blocked`: No requested vendor could be checked and the first failure was a raw URL resolving to a private, loopback, or cloud-metadata address. Other values are possible when a failure originates below the handler.",
"examples": [
"vendor_not_found",
"target_blocked"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"results",
"summary"
]
},
{
"required": [
"error"
]
}
]
}🟢devops_get_incidents(vendor, filter, limit, offset)
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.
输入模式
{
"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"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"vendor": {
"type": "string",
"description": "Vendor slug or URL as provided."
},
"name": {
"type": "string",
"description": "Display name of the vendor."
},
"incidents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique incident identifier from the vendor's status API."
},
"name": {
"type": "string",
"description": "Incident title."
},
"impact": {
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
],
"description": "Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window."
},
"status": {
"type": "string",
"description": "Current status: investigating | identified | monitoring | resolved | postmortem | scheduled | in_progress | completed."
},
"created_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp when the incident was created."
},
"started_at": {
"description": "ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor.",
"type": [
"string",
"null"
]
},
"resolved_at": {
"description": "ISO 8601 UTC timestamp when resolved, or null if still active.",
"type": [
"string",
"null"
]
},
"scheduled_for": {
"description": "Present for scheduled maintenances — ISO 8601 UTC start time.",
"type": [
"string",
"null"
]
},
"scheduled_until": {
"description": "Present for scheduled maintenances — ISO 8601 UTC end time.",
"type": [
"string",
"null"
]
},
"duration_minutes": {
"description": "Minutes from started_at to resolved_at. Null for active or scheduled incidents, or when the vendor-authored timestamps are missing, invalid, or inverted.",
"type": [
"number",
"null"
]
},
"shortlink": {
"description": "Direct URL to the incident page, or null/absent if not provided by the vendor.",
"type": [
"string",
"null"
]
},
"affected_components": {
"type": "array",
"items": {
"type": "string"
},
"description": "Component names affected by this incident."
},
"updates": {
"type": "array",
"items": {
"type": "object",
"properties": {
"status": {
"type": "string",
"description": "Incident status at the time of this update."
},
"body": {
"type": "string",
"description": "Update text from the vendor."
},
"created_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp of this update."
}
},
"required": [
"status",
"body",
"created_at"
],
"additionalProperties": false,
"description": "A single status update from the vendor."
},
"description": "Chronological list of incident updates (oldest first)."
}
},
"required": [
"id",
"name",
"impact",
"status",
"created_at",
"resolved_at",
"scheduled_for",
"scheduled_until",
"duration_minutes",
"affected_components",
"updates"
],
"additionalProperties": false,
"description": "An incident or scheduled maintenance entry."
},
"description": "Matching incidents."
},
"total_returned": {
"type": "number",
"description": "Number of incidents in the response."
},
"statuspage_url": {
"type": "string",
"description": "Status page base URL used."
},
"truncated": {
"description": "True when more incidents matched than the limit returned. Absent when the result was not capped.",
"type": "boolean"
},
"shown": {
"description": "Number of incidents returned after applying the limit. Present only when truncated.",
"type": "number"
},
"cap": {
"description": "The limit that was applied. Present only when truncated.",
"type": "number"
},
"totalCount": {
"description": "Total incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated.",
"type": "number"
},
"nextOffset": {
"description": "The offset to pass on the next call to continue from where this page stopped, already computed as offset + the number returned. Present only when truncated — its absence means this page reached the end of what the filter matched.",
"type": "number"
},
"upstreamCeiling": {
"description": "Maximum incidents the vendor's own status API serves in one fetch, present only when that ceiling was reached on this call. It bounds the history independently of limit and offset: incidents older than the oldest one returned cannot be fetched at any offset, only browsed on the vendor status page. Absent when the vendor feed is unbounded or returned less than its ceiling.",
"type": "number"
},
"notice": {
"description": "Plain-language explanation of this result — how to page onward, why it came back empty (the vendor currently publishes nothing at all, a filter the backend cannot satisfy, or an offset past the end), or that the vendor feed capped the history. Absent when the result needs no explanation.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode. Declared by this tool: `vendor_not_found`: Vendor slug not in registry and input is not a valid URL. `target_blocked`: A raw URL resolves to a private, loopback, or cloud-metadata address. `statuspage_unavailable`: The vendor's status API returned an error or timed out. Other values are possible when a failure originates below the handler.",
"examples": [
"vendor_not_found",
"target_blocked",
"statuspage_unavailable"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"vendor",
"name",
"incidents",
"total_returned",
"statuspage_url"
]
},
{
"required": [
"error"
]
}
]
}🟡devops_watch_stack(vendors, stack_name, mode, component_filter, component_limit)
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").
输入模式
{
"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
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"stack_name": {
"type": "string",
"description": "Name of the stack checked."
},
"health": {
"type": "string",
"enum": [
"all_operational",
"maintenance",
"degraded",
"partial_outage",
"major_outage",
"unknown"
],
"description": "Aggregate health rollup: all_operational = everything clear, maintenance = at least one vendor in a scheduled window and nothing worse open, degraded = at least one minor issue, partial_outage = at least one major issue, major_outage = at least one critical outage, unknown = at least one vendor could not be checked (unresolvable entry, blocked target, or failed fetch) and no checked vendor reported a worse issue. Never all_operational when any vendor errored or is in a window."
},
"summary": {
"type": "object",
"properties": {
"total": {
"type": "number",
"description": "Total vendors in the stack."
},
"operational": {
"type": "number",
"description": "Vendors with indicator = none and no error."
},
"degraded": {
"type": "number",
"description": "Vendors with indicator = minor or major."
},
"down": {
"type": "number",
"description": "Vendors with indicator = critical."
},
"maintenance": {
"type": "number",
"description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults."
},
"unavailable": {
"type": "number",
"description": "Vendors that could not be checked (carry an error) — unresolvable entry, blocked target, or failed status fetch. Counted as unknown, never operational."
}
},
"required": [
"total",
"operational",
"degraded",
"down",
"maintenance",
"unavailable"
],
"additionalProperties": false,
"description": "Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + maintenance + unavailable = total."
},
"vendors": {
"type": "array",
"items": {
"type": "object",
"properties": {
"vendor": {
"type": "string",
"description": "Vendor slug or URL as provided."
},
"name": {
"type": "string",
"description": "Display name of the vendor."
},
"indicator": {
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
],
"description": "Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage, maintenance = scheduled window in progress, planned rather than a fault."
},
"description": {
"type": "string",
"description": "Human-readable status description (e.g., \"All Systems Operational\")."
},
"degraded_components": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Component name."
},
"status": {
"type": "string",
"enum": [
"degraded_performance",
"partial_outage",
"major_outage",
"under_maintenance"
],
"description": "Degradation level: degraded_performance = slow/intermittent, partial_outage = some requests failing, major_outage = most requests failing, under_maintenance = scheduled maintenance in progress."
}
},
"required": [
"name",
"status"
],
"additionalProperties": false,
"description": "A degraded component entry."
},
"description": "Every component not in an operational state, uncapped — a vendor with a large edge-node fleet routinely publishes dozens. Includes in-progress maintenance windows (status under_maintenance) alongside genuine outages; read status to tell a planned window from a fault. Empty when all clear."
},
"active_incidents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique incident identifier from the vendor's status API."
},
"name": {
"type": "string",
"description": "Incident title."
},
"impact": {
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
],
"description": "Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history."
},
"status": {
"type": "string",
"description": "Current incident status (e.g., investigating, monitoring, resolved)."
},
"started_at": {
"description": "ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor.",
"type": [
"string",
"null"
]
},
"latest_update": {
"type": "string",
"description": "Most recent incident_update body text."
}
},
"required": [
"id",
"name",
"impact",
"status",
"latest_update"
],
"additionalProperties": false,
"description": "An active incident entry."
},
"description": "Active (non-resolved) incidents."
},
"scheduled_maintenances": {
"description": "Upcoming or in-progress maintenance windows. Present in detailed mode only.",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Maintenance window name."
},
"scheduled_for": {
"type": "string",
"description": "ISO 8601 UTC start time."
},
"scheduled_until": {
"type": "string",
"description": "ISO 8601 UTC end time."
},
"status": {
"type": "string",
"description": "Maintenance status (scheduled, in_progress, completed)."
}
},
"required": [
"name",
"scheduled_for",
"scheduled_until",
"status"
],
"additionalProperties": false,
"description": "A scheduled maintenance entry."
}
},
"all_components": {
"description": "Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only.",
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Component name."
},
"status": {
"type": "string",
"description": "Component operational status."
},
"description": {
"description": "Component description, or null if not provided.",
"type": [
"string",
"null"
]
}
},
"required": [
"name",
"status",
"description"
],
"additionalProperties": false,
"description": "A component entry."
}
},
"all_components_total": {
"description": "Components matching component_filter for this vendor before the component_limit cap. Larger than the length of all_components when this vendor was capped. Present in detailed mode only.",
"type": "number"
},
"cached": {
"type": "boolean",
"description": "True when this result was served from the 60s in-memory cache."
},
"checked_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp of this check."
},
"statuspage_url": {
"type": "string",
"description": "Status page base URL used for this vendor."
},
"error": {
"description": "Why this vendor could not be checked — unreachable status API, timeout, non-2xx, or a response that is not a Statuspage payload. Reported here rather than thrown so one bad vendor does not fail the batch. Absent when the vendor was fetched successfully.",
"type": "string"
}
},
"required": [
"vendor",
"name",
"indicator",
"description",
"degraded_components",
"active_incidents",
"cached",
"checked_at",
"statuspage_url"
],
"additionalProperties": false,
"description": "Status result for a single vendor."
},
"description": "Per-vendor status results."
},
"stack_persisted": {
"type": "boolean",
"description": "True when the vendor list was saved to state on this call. Only the vendors that resolved are saved — see omitted_vendors."
},
"omitted_vendors": {
"type": "array",
"items": {
"type": "string",
"description": "A vendor entry that cannot be part of a usable stack."
},
"description": "Entries that could not be resolved or whose URL was blocked; they still appear in vendors[] with an error. A call that saved the stack left them out of the write; a call that reused a saved stack leaves them in it until you re-provide the vendors list. Empty when every entry resolved."
},
"checked_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp of this check."
},
"truncated": {
"description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.",
"type": "boolean"
},
"shown": {
"description": "Components returned across the stack. Present only when truncated.",
"type": "number"
},
"cap": {
"description": "The per-vendor component_limit that was applied. Present only when truncated.",
"type": "number"
},
"totalCount": {
"description": "Components matching component_filter across the stack before the cap. Present only when truncated.",
"type": "number"
},
"notice": {
"description": "Plain-language explanation of the capped component lists — how many components were omitted and how to reach them (component_filter to target one, component_limit to raise the cap). Present only when truncated.",
"type": "string"
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode. Declared by this tool: `no_stack`: No vendors provided and no saved stack found for stack_name. `vendor_not_found`: No vendor in the stack could be checked and the first failure was a slug that is not in the registry and is not a valid URL. `target_blocked`: No vendor in the stack could be checked and the first failure was a raw URL resolving to a private, loopback, or cloud-metadata address. Other values are possible when a failure originates below the handler.",
"examples": [
"no_stack",
"vendor_not_found",
"target_blocked"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"stack_name",
"health",
"summary",
"vendors",
"stack_persisted",
"omitted_vendors",
"checked_at"
]
},
{
"required": [
"error"
]
}
]
}🟢devops_check_certs(domains, port, timeout_ms)
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.
输入模式
{
"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"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain that was inspected."
},
"port": {
"type": "number",
"description": "The port used for the TLS connection."
},
"status": {
"type": "string",
"enum": [
"ok",
"warning",
"critical",
"error"
],
"description": "Overall status. \"critical\" — the certificate expires in < 7 days or has already expired, the hostname is not covered by the certificate, chain verification failed (self-signed or untrusted root), or an insecure TLS version was negotiated; every one of these is rejected by ordinary clients. \"warning\" — expires in < 30 days. \"ok\" — none of the above. \"error\" — the connection failed and no certificate was retrieved."
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Human-readable warnings and issues found: \"Expires in 12 days (warning)\", \"Certificate expired 40 days ago\", \"Hostname mismatch — the certificate does not cover api.example.com; clients will reject it\", \"Certificate chain not trusted (SELF_SIGNED_CERT_IN_CHAIN); clients will reject it\", \"Self-signed certificate\", \"Insecure TLS version in use: TLSv1.1\", \"HSTS present\" / \"HSTS not configured\"."
},
"cert": {
"anyOf": [
{
"type": "object",
"properties": {
"subject": {
"type": "string",
"description": "Certificate subject CN."
},
"san": {
"type": "array",
"items": {
"type": "string"
},
"description": "Subject Alternative Names covered by this certificate."
},
"issuer": {
"type": "string",
"description": "Issuer common name."
},
"valid_from": {
"type": "string",
"description": "ISO 8601 UTC timestamp of certificate validity start."
},
"valid_until": {
"type": "string",
"description": "ISO 8601 UTC timestamp of certificate expiry."
},
"days_until_expiry": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Days remaining until certificate expiry. Negative = already expired."
},
"chain_depth": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
{
"type": "null"
}
],
"description": "Number of certificates the server sent, counting the leaf. Null when the runtime does not expose the issuer chain — read \"chain_depth_unavailable_reason\" in that case. Not a self-signed indicator: use \"authorization_error\" for that."
},
"chain_depth_unavailable_reason": {
"description": "Why \"chain_depth\" is null, or null when a depth was measured. Absence of a depth is a runtime limitation, not a finding about the certificate.",
"type": [
"string",
"null"
]
},
"hostname_verification_error": {
"description": "Node's hostname-verification message when the requested domain is not covered by the certificate's CN or SANs (e.g. \"Hostname/IP does not match certificate's altnames: …\"), or null when the hostname is covered. A non-null value means ordinary clients reject this certificate for this hostname; compare against the \"san\" list to see what it does cover.",
"type": [
"string",
"null"
]
},
"authorization_error": {
"description": "OpenSSL chain-verification code when the certificate chain does not validate against the system trust store, or null when it validates. Common values: \"DEPTH_ZERO_SELF_SIGNED_CERT\" (self-signed leaf), \"SELF_SIGNED_CERT_IN_CHAIN\" / \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\" (issuing root not trusted), \"CERT_HAS_EXPIRED\" (also reported in \"days_until_expiry\"). This is the authoritative chain-trust signal — the issuer and subject fields alone cannot detect an untrusted root.",
"type": [
"string",
"null"
]
},
"serial": {
"type": "string",
"description": "Certificate serial number."
}
},
"required": [
"subject",
"san",
"issuer",
"valid_from",
"valid_until",
"days_until_expiry",
"chain_depth",
"chain_depth_unavailable_reason",
"hostname_verification_error",
"authorization_error",
"serial"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "Certificate details, or null when connection failed (error status)."
},
"tls": {
"anyOf": [
{
"type": "object",
"properties": {
"protocol": {
"type": "string",
"description": "Negotiated TLS version, e.g., \"TLSv1.3\"."
},
"cipher": {
"type": "string",
"description": "Negotiated cipher suite name."
}
},
"required": [
"protocol",
"cipher"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "TLS session details, or null when connection failed."
},
"checked_at": {
"type": "string",
"description": "ISO 8601 UTC timestamp of this check."
},
"error": {
"description": "Connection error message when status is \"error\".",
"type": [
"string",
"null"
]
}
},
"required": [
"domain",
"port",
"status",
"flags",
"cert",
"tls",
"checked_at",
"error"
],
"additionalProperties": false,
"description": "Certificate inspection result for one domain."
},
"description": "Per-domain certificate inspection results."
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode. Declared by this tool: `invalid_domain`: A domain string contains a protocol prefix or invalid characters. Other values are possible when a failure originates below the handler.",
"examples": [
"invalid_domain"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"results"
]
},
{
"required": [
"error"
]
}
]
}🟢devops_check_dns(domains, record_types, resolvers, timeout_ms)
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.
输入模式
{
"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"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"domain": {
"type": "string",
"description": "The domain that was queried."
},
"records": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Resolved records from a single resolver, keyed by record type (A, AAAA, CNAME, MX, TXT, NS). Taken from the primary resolver (first in \"resolvers\"), or from the first resolver that returned records when the primary returned none. Read \"records_source\" for which resolver these came from, and \"resolver_results\" for the full per-resolver picture. This is also the reference set the per-resolver answers are reported against: a resolver that returned exactly these values for a type names it in \"records_same_as_domain\" rather than repeating them."
},
"records_source": {
"description": "Resolver IP whose answers populated \"records\", or null when no resolver was queried.",
"type": [
"string",
"null"
]
},
"resolver_results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"resolver": {
"type": "string",
"description": "Resolver IP address used."
},
"latency_ms": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Round-trip resolution latency in milliseconds."
},
"records": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Records returned by this resolver, keyed by type — carrying only the types whose values differ from the domain-level \"records\" set. A type this resolver answered identically is named in \"records_same_as_domain\" instead of repeated here. A requested type in neither place returned nothing from this resolver; \"status_by_type\" says why."
},
"records_same_as_domain": {
"type": "array",
"items": {
"type": "string",
"description": "A record type answered exactly as the domain-level set."
},
"description": "Record types this resolver answered with exactly the domain-level \"records\" values, omitted from \"records\" above rather than duplicated. Read their values from the domain-level set. Resolvers agreeing is the common case, so this list is usually where most of the answer is."
},
"status": {
"type": "string",
"enum": [
"ok",
"nodata",
"nxdomain",
"servfail",
"refused",
"timeout",
"error"
],
"description": "Headline outcome for this resolver: \"ok\" when any requested record type resolved, otherwise the most actionable failure across the requested types (servfail, timeout, refused, error, nxdomain, nodata — in that order). Read \"status_by_type\" for the per-record-type detail."
},
"status_by_type": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"ok",
"nodata",
"nxdomain",
"servfail",
"refused",
"timeout",
"error"
]
},
"description": "Outcome for each requested record type, keyed by type. \"ok\" = records returned; \"nodata\" = the domain exists but has no record of this type; \"nxdomain\" = the domain does not exist (check for a typo, an expired registration, or a missing delegation); \"servfail\" = the resolver could not complete the query, commonly a DNSSEC validation failure; \"refused\" = the resolver declined; \"timeout\" = no answer within timeout_ms; \"error\" = any other failure, described in \"error\"."
},
"error": {
"description": "Failure summary for this resolver in the form \"SERVFAIL on A, MX\", or null when every requested type either resolved or returned nodata. Nodata is never reported as an error — it is a valid DNS answer.",
"type": [
"string",
"null"
]
}
},
"required": [
"resolver",
"latency_ms",
"records",
"records_same_as_domain",
"status",
"status_by_type",
"error"
],
"additionalProperties": false,
"description": "DNS resolution result from one resolver."
},
"description": "Per-resolver breakdown for propagation analysis."
},
"propagation_discrepancies": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record_type": {
"type": "string",
"description": "The DNS record type resolvers disagreed on."
},
"resolvers_agree": {
"type": "boolean",
"description": "Always false — an entry only exists when resolvers disagreed."
},
"kind": {
"type": "string",
"enum": [
"value_variation",
"partial_resolution"
],
"description": "What the disagreement is. \"partial_resolution\" = at least one resolver returned records and at least one returned nothing; this is the signal worth investigating (in-flight propagation, a broken resolver, or a partial delegation) — read \"status_by_resolver\" for why each empty resolver was empty. \"value_variation\" = every resolver answered but with different values; this is the expected steady state for anycast and geo-steered domains such as CDN-fronted hostnames, and is also consistent with an in-flight DNS change. Neither value asserts a cause on its own."
},
"values_by_resolver": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
},
"description": "Values reported per resolver IP address. An empty array means that resolver returned no records of this type."
},
"status_by_resolver": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"enum": [
"ok",
"nodata",
"nxdomain",
"servfail",
"refused",
"timeout",
"error"
]
},
"description": "Outcome for this record type per resolver IP address — explains an empty entry in \"values_by_resolver\" as nodata, nxdomain, servfail, timeout, refused, or error."
}
},
"required": [
"record_type",
"resolvers_agree",
"kind",
"values_by_resolver",
"status_by_resolver"
],
"additionalProperties": false,
"description": "A record type where resolvers returned different answers."
},
"description": "Record types where resolvers returned different answers, each labelled by \"kind\". Empty when all resolvers agree."
},
"flags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Human-readable observations that need attention: \"NXDOMAIN from 8.8.8.8, 1.1.1.1 on A, MX — the domain does not exist …\", \"Partial resolution on A records — 9.9.9.9 (nodata) returned nothing while 8.8.8.8 answered\", \"No MX records found\", \"CNAME detected — further records resolve via the CNAME target\". A value_variation disagreement is not flagged here — it is reported in \"propagation_discrepancies\" because it is normal for geo-steered domains."
},
"error": {
"description": "Set only when the domain could not be queried at all — every resolver failed and none returned records. Each failing resolver is named with its own outcome (\"8.8.8.8: SERVFAIL on A; 1.1.1.1: NXDOMAIN on A\") so a split result stays visible. Null when at least one resolver answered; per-resolver failures are still in \"resolver_results\" and \"flags\".",
"type": [
"string",
"null"
]
}
},
"required": [
"domain",
"records",
"records_source",
"resolver_results",
"propagation_discrepancies",
"flags",
"error"
],
"additionalProperties": false,
"description": "DNS resolution result for one domain."
},
"description": "Per-domain DNS resolution results."
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode. Declared by this tool: `invalid_domain`: A domain string contains a protocol prefix or invalid format. `target_blocked`: A resolver is a private, loopback, or otherwise non-public address, or is not an IP literal at all. Other values are possible when a failure originates below the handler.",
"examples": [
"invalid_domain",
"target_blocked"
]
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"results"
]
},
{
"required": [
"error"
]
}
]
}🟢devops_suggest_action(vendor, incident_summary, affected_components, your_domain, vendor_indicator)
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.
输入模式
{
"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"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}输出模式
{
"type": "object",
"properties": {
"vendor": {
"type": "string",
"description": "Vendor as provided."
},
"vendor_category": {
"description": "Detected category from registry (e.g., \"cdn-edge\", \"auth\"). Null for unrecognized vendors.",
"type": [
"string",
"null"
]
},
"guidance": {
"type": "string",
"description": "Markdown playbook — immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category, reported severity, and affected components."
},
"diagnostics_summary": {
"type": "object",
"properties": {
"vendor_indicator": {
"anyOf": [
{
"type": "string",
"enum": [
"none",
"minor",
"major",
"critical",
"maintenance"
]
},
{
"type": "null"
}
],
"description": "Vendor status indicator echoed from the vendor_indicator input, or null when not provided."
},
"affected_components": {
"type": "array",
"items": {
"type": "string"
},
"description": "Affected component names echoed from the affected_components input."
},
"incident_snippet": {
"description": "The incident_summary input echoed in full for context, or null when not provided.",
"type": [
"string",
"null"
]
}
},
"required": [
"vendor_indicator",
"affected_components",
"incident_snippet"
],
"additionalProperties": false,
"description": "Summary of input context used to generate the playbook."
},
"nextToolSuggestions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"toolName": {
"type": "string",
"description": "Tool to call next (e.g., \"devops_check_dns\", \"devops_check_certs\")."
},
"reason": {
"type": "string",
"description": "Why this step is recommended given the incident context."
},
"args": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "Ready-to-use arguments for the suggested tool call."
}
},
"required": [
"toolName",
"reason",
"args"
],
"additionalProperties": false,
"description": "A recommended follow-up tool call with pre-filled arguments."
},
"description": "Recommended follow-up calls with arguments already populated. Execute these in sequence to gather diagnostic data."
},
"error": {
"description": "Present when the call failed. Absent on success.",
"type": "object",
"properties": {
"code": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "JSON-RPC error code for this failure."
},
"message": {
"type": "string",
"description": "Human-readable description of what went wrong."
},
"data": {
"type": "object",
"properties": {
"reason": {
"type": "string",
"description": "Machine-readable failure mode."
},
"recovery": {
"description": "Actionable next step for the caller.",
"type": "object",
"properties": {
"hint": {
"type": "string"
}
},
"required": [
"hint"
],
"additionalProperties": {}
},
"retryable": {
"description": "Whether retrying may succeed.",
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"required": [
"code",
"message"
],
"additionalProperties": {}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"anyOf": [
{
"not": {
"required": [
"error"
]
},
"required": [
"vendor",
"vendor_category",
"guidance",
"diagnostics_summary",
"nextToolSuggestions"
]
},
{
"required": [
"error"
]
}
]
}社区
证据