Skip to main content
Glama

Server Details

Vendor status pages, TLS cert inspection, DNS propagation checks, and incident-response playbooks.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 43 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/devops-status-mcp-server
GitHub Stars
2
Server Listing
devops-status-mcp-server

TDQS

A4.5/5.0

Scored across 7 tools

Disambiguation4/5

Most tools target a distinct concern: certs, DNS, incidents, vendor discovery, and action suggestions are clearly separated. However, devops_status_check and devops_watch_stack overlap in purpose—both check vendor health—though watch_stack adds stack persistence and an aggregate rollup, which reduces but does not eliminate ambiguity.

Naming Consistency4/5

All tools share a consistent 'devops_' prefix and mostly follow a verb_noun pattern (check_certs, check_dns, get_incidents, list_vendors, suggest_action, watch_stack). The exception is devops_status_check, which reverses to noun_verb, a minor but noticeable deviation.

Tool Count5/5

Seven tools is well-scoped for a devops status monitoring server. Each tool covers a distinct aspect of the workflow—certificates, DNS, current status, history, vendor discovery, stack monitoring, and response playbooks—without unnecessary bloat or obvious omissions.

Completeness5/5

The tool surface covers the core domain comprehensively: health status checks, incident history, certificate and DNS diagnostics, vendor discovery, persistent stacks, and guided action suggestions. The tools chain together naturally (e.g., check DNS before certs, status_check triggering suggest_action), leaving no significant dead ends for typical monitoring scenarios.

Available Tools

7 tools
devops_check_certsDevops Check CertsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
portNoTLS port. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints.
domainsYesDomains to inspect. Do not include "https://" — pass the bare hostname. Up to 10 per call.
timeout_msNoConnection 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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
resultsNoPer-domain certificate inspection results.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnly/openWorld/idempotent, but the description adds substantial behavioral detail: handshakes complete even for rejected certificates, TLS 1.0/1.1 are flagged insecure, and error fields hostname_verification_error and authorization_error carry critical status. These non-obvious behaviors directly affect how an agent interprets results, going far beyond the annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences cover purpose, scope, output highlights, error behavior, and a sibling fallback. Every clause earns its place and the core purpose is front-loaded with no fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is thorough for a complex check tool: it states what is checked, constraints, edge-case behavior, and when to switch to another tool. With an output schema present, it needn't enumerate return values, and it even names specific error fields, leaving few gaps for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers 100% of parameters with descriptive text, so the description doesn't need to re-explain port, domains, or timeout. It implicitly confirms multi-domain use but adds little over the schema; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Inspect SSL/TLS certificate health for one or more domains by performing a real TLS handshake.' It also differentiates itself from a sibling by mentioning devops_check_dns for connection failures, so an agent can identify the tool's unique role without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear usage context: works for any internet-accessible domain, no vendor registry needed, and explicitly routes connection failures to devops_check_dns. While it doesn't contrast with every sibling, the DNS fallback and domain scope provide solid directional guidance for when to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_check_dnsDevops Check DnsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainsYesDomain names to query. Up to 10 per call.
resolversNoResolver IP addresses to query. Defaults to Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9). An empty array uses the same defaults. 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.
timeout_msNoQuery timeout per domain+resolver combination in milliseconds. Defaults to the DEVOPS_STATUS_DNS_TIMEOUT_MS env var (3000 when unset).
record_typesNoDNS record types to resolve. Defaults to A, AAAA, MX, and TXT. An empty array uses the same defaults. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
resultsNoPer-domain DNS resolution results.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description explains what the tool returns (record types, latency, per-resolver outcomes), and how ambiguous cases are classified (partial_resolution vs value_variation). It also clarifies that resolver disagreements are surfaced without asserting a cause, which is behavior an agent would not infer from annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence carries functional value: core behavior, resolver semantics, outcome typing, and sibling routing. The most important information is front-loaded in the first sentence, and the rest is organized logically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description does not need to enumerate return values, yet it still summarizes the key outcomes. The combination of schema, annotations, and description gives an agent everything needed to select and invoke the tool correctly, including defaults and edge-case behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaningful context by explaining the purpose of resolver comparison, the meaning of empty array defaults, private-target restrictions, and when to add NS or CNAME. This enriches the parameter semantics beyond the schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Resolve DNS records for one or more domains across multiple public resolvers" and immediately distinguishes the tool from siblings by focusing on DNS and resolver comparison. Its scope is unambiguous and clearly separates it from devops_check_certs and devops_status_check.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives concrete usage context: it works for any domain with no vendor registry required, and it explicitly pairs with devops_check_certs when a domain resolves but TLS fails. This provides actionable guidance on when to use this tool versus a sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_get_incidentsDevops Get IncidentsA
Read-onlyIdempotent
Inspect

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 not reachable at a higher offset. On Atlassian Statuspage vendors, since (a date up to 24 months back) also reads the status page's quarterly history archive back to that date where the page publishes one; those records are marked source: "history" and carry the title, impact, start and end times, and final update message only. An empty result, or a history read that stopped short of since, explains itself in notice.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum incidents to return per call (1–50). Page through longer history with offset rather than raising this.
sinceNoEarliest start date to include, as YYYY-MM-DD (UTC), at most 24 months back. Accepted with filter "all" or "resolved". Incidents that started before it are left out, and limit/offset page the rest. On Atlassian Statuspage vendors it also reads the status page's quarterly history archive back to this date, reaching incidents older than the 50 the status API serves. Omit to read only the status API.
filterNoall: 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" lists a resolved event only until it drops off its feed, "azure" lists open items only (never resolved), and "aws", "azure", "gcp", and "slack" publish no maintenance windows. An empty result names which case applied.all
offsetNoNumber 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.
vendorYesVendor slug (e.g., "github", "aws") or raw Atlassian Statuspage base URL. Use devops_list_vendors to find slugs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe limit that was applied. Present only when truncated.
nameNoDisplay name of the vendor.
errorNoPresent when the call failed. Absent on success.
shownNoNumber of incidents returned after applying the limit. Present only when truncated.
noticeNoPlain-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, an offset past the end, or a since date that left everything out), that the vendor feed capped the history, or how far the history archive was read when it stopped short of since. Absent when the result needs no explanation.
vendorNoVendor slug or URL as provided.
incidentsNoMatching incidents.
truncatedNoTrue when more incidents matched than the limit returned. Absent when the result was not capped.
nextOffsetNoThe 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.
totalCountNoTotal incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated.
statuspage_urlNoStatus page base URL used.
total_returnedNoNumber of incidents in the response.
upstreamCeilingNoMaximum 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. On Atlassian Statuspage vendors, since reads past it from the page's history archive. Absent when the vendor feed is unbounded, returned less than its ceiling, or since was set and the history archive was read back to it.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description richly discloses behavior beyond the readOnly/openWorld/idempotent annotations: pagination through nextOffset, upstreamCeiling indicating vendor-side history caps, Statuspage quarterly archive behavior with source: 'history' records, and notice fields explaining empty or shortened results. This gives the agent accurate expectations about edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence carries distinct operational value: scope, filter use cases, paging mechanics, vendor ceilings, Statuspage archive behavior, and empty-result notices. It is front-loaded with the core purpose and then layers complexity, with no redundant restatement of the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, vendor-variant tool with five parameters and an output schema, the description covers the critical context: when to use each filter, how paging works, what vendor caps mean, and how to interpret truncated results. The existing schema covers parameter syntax, and the output schema covers return structure, so nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it ties filter values to deployment/postmortem workflows, explains how offset/limit and nextOffset interact in truncation, and clarifies vendor-specific filter limitations such as 'aws' only listing resolved events until they drop off. This materially helps the agent pick values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch incident history and scheduled maintenance windows for a vendor.' It also clarifies what the returned timeline contains (investigator updates, affected components, resolution), making the tool's scope unmistakable and distinct from sibling status-check tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit use context: 'use before deploy' for active incidents, 'for postmortem' for resolved history, and upcoming maintenance windows. It does not explicitly name when to prefer a sibling like devops_status_check, but the clear task-oriented guidance is strong enough to select the right tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_list_vendorsDevops List VendorsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFree-text search against vendor name and slug. Case-insensitive. E.g., "cloud", "auth", "slack".
categoryNoFilter to one category: cloud, cdn-edge, dev-platform, data, comms, auth, monitoring, or ai.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal number of vendors returned.
vendorsNoMatching vendors from the built-in registry.
categoriesNoAll available category values for use in the category filter.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful behavioral detail beyond them: it operates on the built-in registry, supports optional filtering, and returns a specific field set. No contradictions with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences place the core action first, then outputs, then concrete use cases. There is no filler or redundancy; every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity list tool with an output schema and annotations already covering safety, the description is complete: it states what is listed, how to filter, what is returned, and why an agent would call it. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both 'query' and 'category' have clear descriptions, the category enum lists all values, and the query description includes examples. The description repeats the filtering concept but adds no parameter meaning beyond the schema, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('List vendors in the built-in registry') and immediately clarifies scope via optional filters and the exact returned fields (slug, display name, category, status page URL). It is clearly distinct from the sibling tools, which all concern checking, incidents, or stack actions rather than registry discovery.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool: 'discover the correct slug to pass to other tools' or 'see which vendors are available before configuring a stack.' It does not name alternatives or exclusions, but no sibling tool has a comparable listing role, so the context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_status_checkDevops Status CheckA
Read-onlyIdempotent
Inspect

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, Azure status, 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. Every vendor with an active problem gets a pre-filled devops_suggest_action call in nextToolSuggestions.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNosummary: indicator + degraded components + active incidents only. detailed: adds the component list and scheduled maintenance windows.summary
vendorsYesVendor 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.
component_limitNoMaximum 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.
component_filterNoCase-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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-vendor component_limit that was applied. Present only when truncated.
errorNoPresent when the call failed. Absent on success.
shownNoComponents returned across all vendors. Present only when truncated.
noticeNoPlain-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.
resultsNoPer-vendor status results in the same order as the input vendors list.
summaryNoAggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + maintenance + unavailable = total.
truncatedNoTrue when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.
totalCountNoComponents matching component_filter across all vendors before the cap. Present only when truncated.
nextToolSuggestionsNoOne devops_suggest_action call per vendor with an active problem — an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance — with its arguments filled from that vendor's result. Vendors that could not be checked never appear. Empty when no checked vendor has an active problem.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even with readOnlyHint and idempotentHint already present, the description adds valuable behavioral detail: batch results keep unresolved/unreachable vendors in their own rows, heterogeneous vendor APIs are normalized to one shape, and vendors with active problems trigger pre-filled devops_suggest_action calls. It also warns about response size with component_limit. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: core purpose, accepted input formats, normalization behavior, output contents, mode semantics, batch behavior, and next-step tool suggestions. The most important information is front-loaded in the first sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description does not need to detail return structures. It fully covers input types, mode selection, filtering/limits, failure isolation, and follow-up actions. For a four-parameter read-only tool, nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents every parameter well, so the description does not need to compensate. It still adds meaning by naming the supported backend providers, explaining batch-friendly use of the vendors array, and describing how mode, component_filter, and component_limit interact in practice.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Check the current health status for one or more vendors.' It goes on to specify accepted inputs, the normalized output shape, and the operational indicators returned, so an agent can clearly separate this from certificate, DNS, incident, and watch siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete usage guidance: pass a batch list, use mode 'detailed' for component lists and maintenance windows, narrow with component_filter, and bound with component_limit. It also explains the failure-isolation behavior. However, it does not explicitly say when to prefer devops_get_incidents or devops_watch_stack instead, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_suggest_actionDevops Suggest ActionA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
vendorYesVendor slug or display name (e.g., "cloudflare", "github"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage).
your_domainNoYour own domain or service URL. When provided, nextToolSuggestions will be pre-filled with your domain for cert and DNS checks.
incident_summaryNoLatest incident description or update body from devops_get_incidents. Paste the most recent update to get more targeted advice.
vendor_indicatorNoOverall 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.
affected_componentsNoComponent names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Used to tailor suggestions to the impacted subsystem.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
vendorNoVendor as provided.
guidanceNoMarkdown playbook — immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category, reported severity, and affected components.
vendor_categoryNoDetected category from registry (e.g., "cdn-edge", "auth"). Null for unrecognized vendors.
diagnostics_summaryNoSummary of input context used to generate the playbook.
nextToolSuggestionsNoRecommended follow-up calls with arguments already populated. Execute these in sequence to gather diagnostic data.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Given the annotations already declare readOnlyHint and idempotentHint, the description adds useful behavioral context by explaining that the tool synthesizes built-in incident knowledge and provided context into a playbook, and that it returns pre-filled follow-up tool calls. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The first sentence states the core purpose and output characteristic; the second explains the knowledge synthesis and the exact workflow position. Every sentence earns its place, and the most important info is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives enough context for an agent to know when to call this tool, what it does, and how it relates to upstream status/incident tools. The output schema exists, so the description does not need to enumerate return fields, and the input schema fully covers parameter semantics. The tool's role among its siblings is clear.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents each parameter's meaning, including the vendor enum semantics and how your_domain is used. The description itself does not add parameter-specific detail, but it does not need to because the schema is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Return an incident-response playbook tailored to a vendor degradation, with pre-filled follow-up tool calls.' It clearly differentiates this advisory/synthesis tool from siblings like devops_check_certs and devops_status_check, which perform direct checks or status retrieval rather than generating next-step guidance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage guidance is explicit and actionable: 'Use after devops_status_check or devops_get_incidents surfaces a problem to determine what to investigate next.' This clearly communicates the appropriate point in the workflow, though it does not explicitly list what not to use the tool for or name alternative advisory tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

devops_watch_stackDevops Watch StackA
Idempotent
Inspect

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. Every vendor with an active problem gets a pre-filled devops_suggest_action call in nextToolSuggestions. Ideal for morning status checks or pre-deploy sweeps. Multiple stacks can coexist (e.g., "production", "staging").

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNosummary: indicator + degraded components + active incidents. detailed: adds component lists and maintenance windows.summary
vendorsNoVendor 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.
stack_nameNoName 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.default
component_limitNoMaximum 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.
component_filterNoCase-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.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe per-vendor component_limit that was applied. Present only when truncated.
errorNoPresent when the call failed. Absent on success.
shownNoComponents returned across the stack. Present only when truncated.
healthNoAggregate 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.
noticeNoPlain-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.
summaryNoAggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + maintenance + unavailable = total.
vendorsNoPer-vendor status results.
truncatedNoTrue when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.
checked_atNoISO 8601 UTC timestamp of this check.
stack_nameNoName of the stack checked.
totalCountNoComponents matching component_filter across the stack before the cap. Present only when truncated.
omitted_vendorsNoEntries 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.
stack_persistedNoTrue when the vendor list was saved to state on this call. Only the vendors that resolved are saved — see omitted_vendors.
nextToolSuggestionsNoOne devops_suggest_action call per vendor with an active problem — an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance — with its arguments filled from that vendor's result. Vendors that could not be checked never appear. Empty when no checked vendor has an active problem.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide idempotentHint, openWorldHint, readOnlyHint=false, and destructiveHint=false, and the description adds substantial behavioral context beyond those: unreachable vendors are 'reported in its own row and left out of the saved stack', ensuring 'one bad entry never discards the sweep', and active problems trigger pre-filled devops_suggest_action calls. This is rich, non-obvious behavior that an agent needs to know. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then covers lifecycle, return shape, error handling, follow-up suggestions, and multi-stack support. Each of the seven sentences adds distinct value, and none repeat schema field descriptions verbatim. It is appropriately sized for a tool with this much behavioral nuance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and 100% parameter coverage, the description still provides the non-obvious context an agent needs: stack definition vs reuse, degraded-vendor isolation, the nextToolSuggestions behavior, and typical use cases. There is no critical missing behavioral or usage context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces the vendors lifecycle ('subsequent calls can omit vendors to reuse the persisted list') and stack coexistability, but it does not add meaning beyond the schema's already-detailed parameter descriptions. It neither hurts nor significantly improves this dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Check the health of a named vendor stack', and immediately clarifies what a stack is ('a saved list of vendors'). It also distinguishes the tool from generic health checks by describing the aggregate rollup plus per-vendor detail and the persisted-list lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit lifecycle guidance: 'On the first call, provide vendors to define the stack; subsequent calls can omit vendors to reuse the persisted list.' It also names an intended use case ('Ideal for morning status checks or pre-deploy sweeps'). However, it never explicitly contrasts this tool with siblings like devops_status_check or devops_check_certs, so the agent must infer when to choose one over the other.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changeddevops_get_incidents16 fields changed
      • changedInput schema / properties / filter / description
        Previous value: -"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."New value: +"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\" lists a resolved event only until it drops off its feed, \"azure\" lists open items only (never resolved), and \"aws\", \"azure\", \"gcp\", and \"slack\" publish no maintenance windows. An empty result names which case applied."
      • addedInput schema / properties / since
        Added value: +{
        +  "anyOf": [
        +    {
        +      "const": "",
        +      "type": "string"
        +    },
        +    {
        +      "description": "Earliest start date to include, as YYYY-MM-DD (UTC), e.g. \"2025-10-01\".",
        +      "format": "date",
        +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$",
        +      "type": "string"
        +    }
        +  ],
        +  "description": "Earliest start date to include, as YYYY-MM-DD (UTC), at most 24 months back. Accepted with filter \"all\" or \"resolved\". Incidents that started before it are left out, and limit/offset page the rest. On Atlassian Statuspage vendors it also reads the status page's quarterly history archive back to this date, reaching incidents older than the 50 the status API serves. Omit to read only the status API."
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"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."New value: +"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. `invalid_since`: since was passed with filter \"active\" or \"scheduled\", or is more than 24 months back. `statuspage_unavailable`: The vendor's status API returned an error or timed out. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "vendor_not_found",
        -  "target_blocked",
        -  "statuspage_unavailable"
        -]New value: +[
        +  "vendor_not_found",
        +  "target_blocked",
        +  "invalid_since",
        +  "statuspage_unavailable"
        +]
      • changedOutput schema / properties / incidents / items / properties / created_at / description
        Previous value: -"ISO 8601 UTC timestamp when the incident was created."New value: +"ISO 8601 timestamp when the incident was created, carrying the UTC offset the vendor published (Z, +00:00, or a local offset such as -07:00). For a history-archive record, the start time its status page displays, to the minute, in UTC."
      • changedOutput schema / properties / incidents / items / properties / resolved_at / description
        Previous value: -"ISO 8601 UTC timestamp when resolved, or null if still active."New value: +"ISO 8601 timestamp, with the vendor's UTC offset, when resolved, or null if still active. For a history-archive record, to the minute, in UTC."
      • changedOutput schema / properties / incidents / items / properties / scheduled_for / description
        Previous value: -"Present for scheduled maintenances — ISO 8601 UTC start time."New value: +"Present for scheduled maintenances — ISO 8601 start time with the vendor's UTC offset."
      • changedOutput schema / properties / incidents / items / properties / scheduled_until / description
        Previous value: -"Present for scheduled maintenances — ISO 8601 UTC end time."New value: +"Present for scheduled maintenances — ISO 8601 end time with the vendor's UTC offset."
      • addedOutput schema / properties / incidents / items / properties / source
        Added value: +{
        +  "description": "Where this record came from. api: the vendor's status API, with the full update timeline and affected components. history: the status page's quarterly history archive, read only when since is set — title, impact, start and end times, and the final update message, with no components and no started_at, scheduled window, or duration.",
        +  "enum": [
        +    "api",
        +    "history"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / incidents / items / properties / started_at / description
        Previous value: -"ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor."New value: +"ISO 8601 timestamp, with the vendor's UTC offset, when the incident started, or null/absent if not set by the vendor."
      • changedOutput schema / properties / incidents / items / properties / status / description
        Previous value: -"Current status: investigating | identified | monitoring | resolved | postmortem | scheduled | in_progress | completed."New value: +"Current status: investigating | identified | monitoring | resolved | postmortem | scheduled | in_progress | completed | unknown. unknown marks a history-archive record with no end time, whose lifecycle stage the archive does not publish."
      • changedOutput schema / properties / incidents / items / properties / updates / description
        Previous value: -"Chronological list of incident updates (oldest first)."New value: +"Chronological list of incident updates (oldest first). A history-archive record carries only its final update, dated at its end time (or its start when it has none)."
      • changedOutput schema / properties / incidents / items / properties / updates / items / properties / created_at / description
        Previous value: -"ISO 8601 UTC timestamp of this update."New value: +"ISO 8601 timestamp of this update, with the vendor's UTC offset."
      • changedOutput schema / properties / incidents / items / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "impact",
        -  "status",
        -  "created_at",
        -  "resolved_at",
        -  "scheduled_for",
        -  "scheduled_until",
        -  "duration_minutes",
        -  "affected_components",
        -  "updates"
        -]New value: +[
        +  "id",
        +  "name",
        +  "impact",
        +  "status",
        +  "created_at",
        +  "resolved_at",
        +  "scheduled_for",
        +  "scheduled_until",
        +  "duration_minutes",
        +  "affected_components",
        +  "updates",
        +  "source"
        +]
      • changedOutput schema / properties / notice / description
        Previous value: -"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."New value: +"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, an offset past the end, or a since date that left everything out), that the vendor feed capped the history, or how far the history archive was read when it stopped short of since. Absent when the result needs no explanation."
      • changedOutput schema / properties / upstreamCeiling / description
        Previous value: -"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."New value: +"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. On Atlassian Statuspage vendors, since reads past it from the page's history archive. Absent when the vendor feed is unbounded, returned less than its ceiling, or since was set and the history archive was read back to it."
    • Changeddevops_list_vendors1 field changed
      • changedOutput schema / properties / vendors / items / properties / statuspage_url / description
        Previous value: -"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)."New value: +"Status page base URL — the Statuspage API base for Statuspage-backed vendors, the public status page URL for adapter-backed vendors (aws, gcp, azure, gitlab, slack, neon, redis-cloud)."
    • Changeddevops_status_check3 fields changed
      • changedOutput schema / properties / results / items / properties / active_incidents / items / properties / started_at / description
        Previous value: -"ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor."New value: +"ISO 8601 timestamp, with the vendor's UTC offset (Z, +00:00, or a local offset such as -07:00), when the incident started, or null/absent if not set by the vendor."
      • changedOutput schema / properties / results / items / properties / scheduled_maintenances / items / properties / scheduled_for / description
        Previous value: -"ISO 8601 UTC start time."New value: +"ISO 8601 start time, with the vendor's UTC offset."
      • changedOutput schema / properties / results / items / properties / scheduled_maintenances / items / properties / scheduled_until / description
        Previous value: -"ISO 8601 UTC end time."New value: +"ISO 8601 end time, with the vendor's UTC offset."
    • Changeddevops_watch_stack3 fields changed
      • changedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / description
        Previous value: -"ISO 8601 UTC timestamp when the incident started, or null/absent if not set by the vendor."New value: +"ISO 8601 timestamp, with the vendor's UTC offset (Z, +00:00, or a local offset such as -07:00), when the incident started, or null/absent if not set by the vendor."
      • changedOutput schema / properties / vendors / items / properties / scheduled_maintenances / items / properties / scheduled_for / description
        Previous value: -"ISO 8601 UTC start time."New value: +"ISO 8601 start time, with the vendor's UTC offset."
      • changedOutput schema / properties / vendors / items / properties / scheduled_maintenances / items / properties / scheduled_until / description
        Previous value: -"ISO 8601 UTC end time."New value: +"ISO 8601 end time, with the vendor's UTC offset."
  2. 4 tool updates
    • Changeddevops_check_certs5 fields changed
      • changedOutput schema / properties / results / items / properties / cert / description
        Previous value: -"Certificate details, or null when connection failed (error status)."New value: +"Certificate details, or null when no certificate was retrieved (status \"error\")."
      • changedOutput schema / properties / results / items / properties / error / description
        Previous value: -"Connection error message when status is \"error\"."New value: +"Why status is \"error\". Either no handshake completed — the domain was rejected as a private, loopback, or cloud-metadata target, a connection failure such as \"getaddrinfo ENOTFOUND …\", or \"Timed out after 5000ms\" — with cert and tls null and flags empty; or the handshake completed but the server presented no certificate, with cert null and the TLS session still reported in tls and flags. Null for every other status."
      • changedOutput schema / properties / results / items / properties / flags / description
        Previous value: -"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\"."New value: +"Human-readable findings about the certificate and TLS session that were read: \"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\". Empty when the connection never completed a handshake (rejected target, connection failure, or timeout) — the reason is in \"error\" only. A handshake that completed without a certificate keeps its TLS-session findings here alongside \"error\"."
      • changedOutput schema / properties / results / items / properties / status / description
        Previous value: -"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."New value: +"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\" — no certificate was retrieved: the domain was rejected, the connection failed or timed out, or the server presented no certificate; the reason is in \"error\"."
      • changedOutput schema / properties / results / items / properties / tls / description
        Previous value: -"TLS session details, or null when connection failed."New value: +"TLS session details, or null when no TLS handshake completed."
    • Changeddevops_check_dns4 fields changed
      • changedInput schema / properties / record_types / description
        Previous value: -"DNS record types to resolve. Defaults to A, AAAA, MX, and TXT. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains."New value: +"DNS record types to resolve. Defaults to A, AAAA, MX, and TXT. An empty array uses the same defaults. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains."
      • changedInput schema / properties / resolvers / description
        Previous value: -"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."New value: +"Resolver IP addresses to query. Defaults to Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9). An empty array uses the same defaults. 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."
      • changedOutput schema / properties / results / items / properties / error / description
        Previous value: -"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\"."New value: +"Set only when the domain could not be queried at all. Either it was rejected before any query (for example a private, loopback, or cloud-metadata target) and \"resolver_results\" is empty, or every resolver failed and none returned records, in which case 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\"."
      • changedOutput schema / properties / results / items / properties / flags / description
        Previous value: -"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."New value: +"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. Empty for a domain rejected before any query, whose reason is in \"error\"."
    • Changeddevops_status_check2 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "results",
        -      "summary"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "summary",
        +      "nextToolSuggestions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / nextToolSuggestions
        Added value: +{
        +  "description": "One devops_suggest_action call per vendor with an active problem — an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance — with its arguments filled from that vendor's result. Vendors that could not be checked never appear. Empty when no checked vendor has an active problem.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A recommended follow-up tool call with pre-filled arguments.",
        +    "properties": {
        +      "args": {
        +        "additionalProperties": {},
        +        "description": "Ready-to-use devops_suggest_action arguments: vendor (registry slug, or the normalized status page URL for a raw URL), vendor_indicator (only for minor, major, or critical), affected_components (degraded components outside a maintenance window), incident_summary (title of the most recently started open incident rated minor or worse).",
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "description": "Why the vendor qualifies: its reported indicator, or the open incident behind it.",
        +        "type": "string"
        +      },
        +      "toolName": {
        +        "description": "Tool to call next — \"devops_suggest_action\".",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "toolName",
        +      "reason",
        +      "args"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changeddevops_watch_stack2 fields changed
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "stack_name",
        -      "health",
        -      "summary",
        -      "vendors",
        -      "stack_persisted",
        -      "omitted_vendors",
        -      "checked_at"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stack_name",
        +      "health",
        +      "summary",
        +      "vendors",
        +      "stack_persisted",
        +      "omitted_vendors",
        +      "checked_at",
        +      "nextToolSuggestions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / nextToolSuggestions
        Added value: +{
        +  "description": "One devops_suggest_action call per vendor with an active problem — an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance — with its arguments filled from that vendor's result. Vendors that could not be checked never appear. Empty when no checked vendor has an active problem.",
        +  "items": {
        +    "additionalProperties": false,
        +    "description": "A recommended follow-up tool call with pre-filled arguments.",
        +    "properties": {
        +      "args": {
        +        "additionalProperties": {},
        +        "description": "Ready-to-use devops_suggest_action arguments: vendor (registry slug, or the normalized status page URL for a raw URL), vendor_indicator (only for minor, major, or critical), affected_components (degraded components outside a maintenance window), incident_summary (title of the most recently started open incident rated minor or worse).",
        +        "propertyNames": {
        +          "type": "string"
        +        },
        +        "type": "object"
        +      },
        +      "reason": {
        +        "description": "Why the vendor qualifies: its reported indicator, or the open incident behind it.",
        +        "type": "string"
        +      },
        +      "toolName": {
        +        "description": "Tool to call next — \"devops_suggest_action\".",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "toolName",
        +      "reason",
        +      "args"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  3. 6 tool updates
    • Changeddevops_check_certs3 fields changed
      • changedOutput schema / properties / results / items / properties / cert / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "authorization_error": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "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."
        -      },
        -      "chain_depth": {
        -        "anyOf": [
        -          {
        -            "maximum": 9007199254740991,
        -            "minimum": -9007199254740991,
        -            "type": "integer"
        -          },
        -          {
        -            "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": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "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."
        -      },
        -      "days_until_expiry": {
        -        "description": "Days remaining until certificate expiry. Negative = already expired.",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      },
        -      "hostname_verification_error": {
        -        "anyOf": [
        -          {
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ],
        -        "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."
        -      },
        -      "issuer": {
        -        "description": "Issuer common name.",
        -        "type": "string"
        -      },
        -      "san": {
        -        "description": "Subject Alternative Names covered by this certificate.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "serial": {
        -        "description": "Certificate serial number.",
        -        "type": "string"
        -      },
        -      "subject": {
        -        "description": "Certificate subject CN.",
        -        "type": "string"
        -      },
        -      "valid_from": {
        -        "description": "ISO 8601 UTC timestamp of certificate validity start.",
        -        "type": "string"
        -      },
        -      "valid_until": {
        -        "description": "ISO 8601 UTC timestamp of certificate expiry.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "subject",
        -      "san",
        -      "issuer",
        -      "valid_from",
        -      "valid_until",
        -      "days_until_expiry",
        -      "chain_depth",
        -      "chain_depth_unavailable_reason",
        -      "hostname_verification_error",
        -      "authorization_error",
        -      "serial"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "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"
        +        ]
        +      },
        +      "chain_depth": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "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"
        +        ]
        +      },
        +      "days_until_expiry": {
        +        "description": "Days remaining until certificate expiry. Negative = already expired.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "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"
        +        ]
        +      },
        +      "issuer": {
        +        "description": "Issuer common name.",
        +        "type": "string"
        +      },
        +      "san": {
        +        "description": "Subject Alternative Names covered by this certificate.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "serial": {
        +        "description": "Certificate serial number.",
        +        "type": "string"
        +      },
        +      "subject": {
        +        "description": "Certificate subject CN.",
        +        "type": "string"
        +      },
        +      "valid_from": {
        +        "description": "ISO 8601 UTC timestamp of certificate validity start.",
        +        "type": "string"
        +      },
        +      "valid_until": {
        +        "description": "ISO 8601 UTC timestamp of certificate expiry.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "subject",
        +      "san",
        +      "issuer",
        +      "valid_from",
        +      "valid_until",
        +      "days_until_expiry",
        +      "chain_depth",
        +      "chain_depth_unavailable_reason",
        +      "hostname_verification_error",
        +      "authorization_error",
        +      "serial"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / results / items / properties / error / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / error / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddevops_check_dns6 fields changed
      • removedOutput schema / properties / results / items / properties / error / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / error / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / records_source / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / records_source / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / resolver_results / items / properties / error / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / resolver_results / items / properties / error / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddevops_get_incidents12 fields changed
      • removedOutput schema / properties / incidents / items / properties / duration_minutes / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / duration_minutes / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / incidents / items / properties / resolved_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / resolved_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / incidents / items / properties / scheduled_for / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / scheduled_for / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / incidents / items / properties / scheduled_until / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / scheduled_until / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / incidents / items / properties / shortlink / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / shortlink / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / incidents / items / properties / started_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / incidents / items / properties / started_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddevops_status_check4 fields changed
      • removedOutput schema / properties / results / items / properties / active_incidents / items / properties / started_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / active_incidents / items / properties / started_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / results / items / properties / all_components / items / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / results / items / properties / all_components / items / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddevops_suggest_action4 fields changed
      • removedOutput schema / properties / diagnostics_summary / properties / incident_snippet / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / diagnostics_summary / properties / incident_snippet / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / vendor_category / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / vendor_category / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddevops_watch_stack4 fields changed
      • removedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / vendors / items / properties / all_components / items / properties / description / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / vendors / items / properties / all_components / items / properties / description / type
        Added value: +[
        +  "string",
        +  "null"
        +]
  4. 7 tool updates
    • Changeddevops_check_certs6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "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"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results"
        -]
    • Changeddevops_check_dns6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "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"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results"
        -]
    • Changeddevops_get_incidents6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "vendor",
        +      "name",
        +      "incidents",
        +      "total_returned",
        +      "statuspage_url"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "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"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "vendor",
        -  "name",
        -  "incidents",
        -  "total_returned",
        -  "statuspage_url"
        -]
    • Changeddevops_list_vendors6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "vendors",
        +      "total",
        +      "categories"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "vendors",
        -  "total",
        -  "categories"
        -]
    • Changeddevops_status_check6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "results",
        +      "summary"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "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"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "results",
        -  "summary"
        -]
    • Changeddevops_suggest_action6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "vendor",
        +      "vendor_category",
        +      "guidance",
        +      "diagnostics_summary",
        +      "nextToolSuggestions"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode.",
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "vendor",
        -  "vendor_category",
        -  "guidance",
        -  "diagnostics_summary",
        -  "nextToolSuggestions"
        -]
    • Changeddevops_watch_stack10 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedInput schema / properties / stack_name / description
        Previous value: -"Name for this vendor stack. Defaults to \"default\". Use distinct names to manage multiple stacks (e.g., \"production\", \"data-layer\")."New value: +"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."
      • addedInput schema / properties / stack_name / maxLength
        Added value: +64
      • addedInput schema / properties / stack_name / minLength
        Added value: +1
      • addedInput schema / properties / stack_name / pattern
        Added value: +"^[a-zA-Z0-9_-]+([./][a-zA-Z0-9_-]+)*$"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stack_name",
        +      "health",
        +      "summary",
        +      "vendors",
        +      "stack_persisted",
        +      "omitted_vendors",
        +      "checked_at"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "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"
        +          ],
        +          "type": "string"
        +        },
        +        "recovery": {
        +          "additionalProperties": {},
        +          "description": "Actionable next step for the caller.",
        +          "properties": {
        +            "hint": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "hint"
        +          ],
        +          "type": "object"
        +        },
        +        "retryable": {
        +          "description": "Whether retrying may succeed.",
        +          "type": "boolean"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "message": {
        +      "description": "Human-readable description of what went wrong.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "code",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stack_name",
        -  "health",
        -  "summary",
        -  "vendors",
        -  "stack_persisted",
        -  "omitted_vendors",
        -  "checked_at"
        -]
  5. 5 tool updates
    • Changeddevops_check_dns4 fields changed
      • changedOutput schema / properties / results / items / properties / records / description
        Previous value: -"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."New value: +"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."
      • changedOutput schema / properties / results / items / properties / resolver_results / items / properties / records / description
        Previous value: -"Records returned by this resolver, keyed by type."New value: +"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."
      • addedOutput schema / properties / results / items / properties / resolver_results / items / properties / records_same_as_domain
        Added value: +{
        +  "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.",
        +  "items": {
        +    "description": "A record type answered exactly as the domain-level set.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / results / items / properties / resolver_results / items / required
        Previous value: -[
        -  "resolver",
        -  "latency_ms",
        -  "records",
        -  "status",
        -  "status_by_type",
        -  "error"
        -]New value: +[
        +  "resolver",
        +  "latency_ms",
        +  "records",
        +  "records_same_as_domain",
        +  "status",
        +  "status_by_type",
        +  "error"
        +]
    • Changeddevops_get_incidents1 field changed
      • changedOutput schema / properties / notice / description
        Previous value: -"Plain-language explanation of this result — how to page onward, why it came back empty (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."New value: +"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."
    • Changeddevops_status_check6 fields changed
      • changedOutput schema / properties / results / items / properties / degraded_components / description
        Previous value: -"Components not in operational state. Empty when all clear."New value: +"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."
      • changedOutput schema / properties / results / items / properties / indicator / description
        Previous value: -"Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage."New value: +"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."
      • changedOutput schema / properties / results / items / properties / indicator / enum
        Previous value: -[
        -  "none",
        -  "minor",
        -  "major",
        -  "critical"
        -]New value: +[
        +  "none",
        +  "minor",
        +  "major",
        +  "critical",
        +  "maintenance"
        +]
      • changedOutput schema / properties / summary / description
        Previous value: -"Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + unavailable = total."New value: +"Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + maintenance + unavailable = total."
      • addedOutput schema / properties / summary / properties / maintenance
        Added value: +{
        +  "description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "total",
        -  "operational",
        -  "degraded",
        -  "down",
        -  "unavailable"
        -]New value: +[
        +  "total",
        +  "operational",
        +  "degraded",
        +  "down",
        +  "maintenance",
        +  "unavailable"
        +]
    • Changeddevops_suggest_action2 fields changed
      • changedInput schema / properties / vendor_indicator / enum
        Previous value: -[
        -  "none",
        -  "minor",
        -  "major",
        -  "critical"
        -]New value: +[
        +  "none",
        +  "minor",
        +  "major",
        +  "critical",
        +  "maintenance"
        +]
      • changedOutput schema / properties / diagnostics_summary / properties / vendor_indicator / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "none",
        -      "minor",
        -      "major",
        -      "critical"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "none",
        +      "minor",
        +      "major",
        +      "critical",
        +      "maintenance"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changeddevops_watch_stack8 fields changed
      • changedOutput schema / properties / health / description
        Previous value: -"Aggregate health rollup: all_operational = everything clear, 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."New value: +"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."
      • changedOutput schema / properties / health / enum
        Previous value: -[
        -  "all_operational",
        -  "degraded",
        -  "partial_outage",
        -  "major_outage",
        -  "unknown"
        -]New value: +[
        +  "all_operational",
        +  "maintenance",
        +  "degraded",
        +  "partial_outage",
        +  "major_outage",
        +  "unknown"
        +]
      • changedOutput schema / properties / summary / description
        Previous value: -"Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + unavailable = total."New value: +"Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + maintenance + unavailable = total."
      • addedOutput schema / properties / summary / properties / maintenance
        Added value: +{
        +  "description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "total",
        -  "operational",
        -  "degraded",
        -  "down",
        -  "unavailable"
        -]New value: +[
        +  "total",
        +  "operational",
        +  "degraded",
        +  "down",
        +  "maintenance",
        +  "unavailable"
        +]
      • changedOutput schema / properties / vendors / items / properties / degraded_components / description
        Previous value: -"Components not in operational state. Empty when all clear."New value: +"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."
      • changedOutput schema / properties / vendors / items / properties / indicator / description
        Previous value: -"Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage."New value: +"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."
      • changedOutput schema / properties / vendors / items / properties / indicator / enum
        Previous value: -[
        -  "none",
        -  "minor",
        -  "major",
        -  "critical"
        -]New value: +[
        +  "none",
        +  "minor",
        +  "major",
        +  "critical",
        +  "maintenance"
        +]
  6. 2 tool updates
    • Changeddevops_get_incidents1 field changed
      • changedInput schema / properties / filter / description
        Previous value: -"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 \"slack\" publishes no maintenance windows. An empty result names which case applied."New value: +"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."
    • Changeddevops_list_vendors1 field changed
      • changedOutput schema / properties / vendors / items / properties / statuspage_url / description
        Previous value: -"Status page base URL — the Statuspage API base for Statuspage-backed vendors, the public status page URL for adapter-backed vendors (aws, gitlab, slack, neon)."New value: +"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)."
  7. 5 tool updates
    • Changeddevops_check_certs3 fields changed
      • changedOutput schema / properties / results / items / properties / cert / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "chain_depth": {
        -        "description": "Number of certificates in the chain (1 = self-signed).",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      },
        -      "days_until_expiry": {
        -        "description": "Days remaining until certificate expiry. Negative = already expired.",
        -        "maximum": 9007199254740991,
        -        "minimum": -9007199254740991,
        -        "type": "integer"
        -      },
        -      "issuer": {
        -        "description": "Issuer common name.",
        -        "type": "string"
        -      },
        -      "san": {
        -        "description": "Subject Alternative Names covered by this certificate.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": "array"
        -      },
        -      "serial": {
        -        "description": "Certificate serial number.",
        -        "type": "string"
        -      },
        -      "subject": {
        -        "description": "Certificate subject CN.",
        -        "type": "string"
        -      },
        -      "valid_from": {
        -        "description": "ISO 8601 UTC timestamp of certificate validity start.",
        -        "type": "string"
        -      },
        -      "valid_until": {
        -        "description": "ISO 8601 UTC timestamp of certificate expiry.",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "subject",
        -      "san",
        -      "issuer",
        -      "valid_from",
        -      "valid_until",
        -      "days_until_expiry",
        -      "chain_depth",
        -      "serial"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "authorization_error": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "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."
        +      },
        +      "chain_depth": {
        +        "anyOf": [
        +          {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          {
        +            "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": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "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."
        +      },
        +      "days_until_expiry": {
        +        "description": "Days remaining until certificate expiry. Negative = already expired.",
        +        "maximum": 9007199254740991,
        +        "minimum": -9007199254740991,
        +        "type": "integer"
        +      },
        +      "hostname_verification_error": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ],
        +        "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."
        +      },
        +      "issuer": {
        +        "description": "Issuer common name.",
        +        "type": "string"
        +      },
        +      "san": {
        +        "description": "Subject Alternative Names covered by this certificate.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "serial": {
        +        "description": "Certificate serial number.",
        +        "type": "string"
        +      },
        +      "subject": {
        +        "description": "Certificate subject CN.",
        +        "type": "string"
        +      },
        +      "valid_from": {
        +        "description": "ISO 8601 UTC timestamp of certificate validity start.",
        +        "type": "string"
        +      },
        +      "valid_until": {
        +        "description": "ISO 8601 UTC timestamp of certificate expiry.",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "subject",
        +      "san",
        +      "issuer",
        +      "valid_from",
        +      "valid_until",
        +      "days_until_expiry",
        +      "chain_depth",
        +      "chain_depth_unavailable_reason",
        +      "hostname_verification_error",
        +      "authorization_error",
        +      "serial"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / results / items / properties / flags / description
        Previous value: -"Human-readable warnings and issues found: \"expires in 12 days\", \"TLS 1.1 in use\", \"self-signed certificate\", \"HSTS present\", etc."New value: +"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\"."
      • changedOutput schema / properties / results / items / properties / status / description
        Previous value: -"Overall status: ok, warning (< 30 days), critical (< 7 days or insecure TLS), or error (connection failed)."New value: +"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."
    • Changeddevops_check_dns17 fields changed
      • changedOutput schema / properties / results / items / properties / error / description
        Previous value: -"Overall error message if the domain could not be queried at all."New value: +"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\"."
      • changedOutput schema / properties / results / items / properties / flags / description
        Previous value: -"Human-readable observations: \"propagation mismatch on A records\", \"no MX records found\", \"CNAME detected — further records resolve via the CNAME target\", etc."New value: +"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."
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / description
        Previous value: -"Record types where resolvers returned different values. Empty when all resolvers agree."New value: +"Record types where resolvers returned different answers, each labelled by \"kind\". Empty when all resolvers agree."
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / items / description
        Previous value: -"A record type where resolvers returned different values."New value: +"A record type where resolvers returned different answers."
      • addedOutput schema / properties / results / items / properties / propagation_discrepancies / items / properties / kind
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "value_variation",
        +    "partial_resolution"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / items / properties / record_type / description
        Previous value: -"The DNS record type with differing values."New value: +"The DNS record type resolvers disagreed on."
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / items / properties / resolvers_agree / description
        Previous value: -"False when resolvers returned different values."New value: +"Always false — an entry only exists when resolvers disagreed."
      • addedOutput schema / properties / results / items / properties / propagation_discrepancies / items / properties / status_by_resolver
        Added value: +{
        +  "additionalProperties": {
        +    "enum": [
        +      "ok",
        +      "nodata",
        +      "nxdomain",
        +      "servfail",
        +      "refused",
        +      "timeout",
        +      "error"
        +    ],
        +    "type": "string"
        +  },
        +  "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.",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / items / properties / values_by_resolver / description
        Previous value: -"Values reported per resolver IP address."New value: +"Values reported per resolver IP address. An empty array means that resolver returned no records of this type."
      • changedOutput schema / properties / results / items / properties / propagation_discrepancies / items / required
        Previous value: -[
        -  "record_type",
        -  "resolvers_agree",
        -  "values_by_resolver"
        -]New value: +[
        +  "record_type",
        +  "resolvers_agree",
        +  "kind",
        +  "values_by_resolver",
        +  "status_by_resolver"
        +]
      • changedOutput schema / properties / results / items / properties / records / description
        Previous value: -"Resolved records from the primary resolver (first in list). Keyed by record type (A, AAAA, CNAME, MX, TXT, NS)."New value: +"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."
      • addedOutput schema / properties / results / items / properties / records_source
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Resolver IP whose answers populated \"records\", or null when no resolver was queried."
        +}
      • changedOutput schema / properties / results / items / properties / resolver_results / items / properties / error / description
        Previous value: -"Error message if this resolver failed, or null on success."New value: +"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."
      • addedOutput schema / properties / results / items / properties / resolver_results / items / properties / status
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "ok",
        +    "nodata",
        +    "nxdomain",
        +    "servfail",
        +    "refused",
        +    "timeout",
        +    "error"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / resolver_results / items / properties / status_by_type
        Added value: +{
        +  "additionalProperties": {
        +    "enum": [
        +      "ok",
        +      "nodata",
        +      "nxdomain",
        +      "servfail",
        +      "refused",
        +      "timeout",
        +      "error"
        +    ],
        +    "type": "string"
        +  },
        +  "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\".",
        +  "propertyNames": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / results / items / properties / resolver_results / items / required
        Previous value: -[
        -  "resolver",
        -  "latency_ms",
        -  "records",
        -  "error"
        -]New value: +[
        +  "resolver",
        +  "latency_ms",
        +  "records",
        +  "status",
        +  "status_by_type",
        +  "error"
        +]
      • changedOutput schema / properties / results / items / required
        Previous value: -[
        -  "domain",
        -  "records",
        -  "resolver_results",
        -  "propagation_discrepancies",
        -  "flags",
        -  "error"
        -]New value: +[
        +  "domain",
        +  "records",
        +  "records_source",
        +  "resolver_results",
        +  "propagation_discrepancies",
        +  "flags",
        +  "error"
        +]
    • Changeddevops_get_incidents5 fields changed
      • changedInput schema / properties / filter / description
        Previous value: -"all: incidents plus scheduled maintenances. active: only incidents with status investigating/identified/monitoring. resolved: only fully resolved incidents. scheduled: only scheduled maintenance windows."New value: +"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 \"slack\" publishes no maintenance windows. An empty result names which case applied."
      • changedInput schema / properties / offset / description
        Previous value: -"Number of matching incidents to skip before applying limit, for paging through history. 0 (default) returns the most recent page; a truncated result names the next offset to use."New value: +"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."
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "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"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Plain-language explanation of this result — how to page onward, why it came back empty (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"
        +}
      • addedOutput schema / properties / upstreamCeiling
        Added value: +{
        +  "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"
        +}
    • Changeddevops_status_check1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "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"
        +}
    • Changeddevops_watch_stack1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "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"
        +}
  8. 2 tool updates
    • Changeddevops_status_check13 fields changed
      • addedInput schema / properties / component_filter
        Added value: +{
        +  "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"
        +}
      • addedInput schema / properties / component_limit
        Added value: +{
        +  "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.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"summary: indicator + degraded components + active incidents only. detailed: adds full component list and scheduled maintenance windows."New value: +"summary: indicator + degraded components + active incidents only. detailed: adds the component list and scheduled maintenance windows."
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The per-vendor component_limit that was applied. Present only when truncated.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / results / items / properties / all_components / description
        Previous value: -"All components including operational ones. Present in detailed mode only."New value: +"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only."
      • addedOutput schema / properties / results / items / properties / all_components_total
        Added value: +{
        +  "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"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Components returned across all vendors. Present only when truncated.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / description
        Previous value: -"Aggregate health counts across all checked vendors."New value: +"Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + unavailable = total."
      • changedOutput schema / properties / summary / properties / operational / description
        Previous value: -"Vendors with indicator = none."New value: +"Vendors with indicator = none and no error."
      • addedOutput schema / properties / summary / properties / unavailable
        Added value: +{
        +  "description": "Vendors that could not be checked (carry an error) — unresolvable slug, blocked target, or failed status fetch. Counted as unknown, never operational.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "total",
        -  "operational",
        -  "degraded",
        -  "down"
        -]New value: +[
        +  "total",
        +  "operational",
        +  "degraded",
        +  "down",
        +  "unavailable"
        +]
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Components matching component_filter across all vendors before the cap. Present only when truncated.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.",
        +  "type": "boolean"
        +}
    • Changeddevops_watch_stack15 fields changed
      • addedInput schema / properties / component_filter
        Added value: +{
        +  "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"
        +}
      • addedInput schema / properties / component_limit
        Added value: +{
        +  "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.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / mode / description
        Previous value: -"summary: indicator + degraded components + active incidents. detailed: adds full component lists and maintenance windows."New value: +"summary: indicator + degraded components + active incidents. detailed: adds component lists and maintenance windows."
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The per-vendor component_limit that was applied. Present only when truncated.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / health / description
        Previous value: -"Aggregate health rollup: all_operational = everything clear, 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 (fetch error) and no checked vendor reported a worse issue. Never all_operational when any vendor errored."New value: +"Aggregate health rollup: all_operational = everything clear, 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."
      • addedOutput schema / properties / omitted_vendors
        Added value: +{
        +  "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.",
        +  "items": {
        +    "description": "A vendor entry that cannot be part of a usable stack.",
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Components returned across the stack. Present only when truncated.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / stack_persisted / description
        Previous value: -"True when the vendor list was saved to state on this call."New value: +"True when the vendor list was saved to state on this call. Only the vendors that resolved are saved — see omitted_vendors."
      • changedOutput schema / properties / summary / properties / operational / description
        Previous value: -"Vendors with indicator = none and no fetch error."New value: +"Vendors with indicator = none and no error."
      • changedOutput schema / properties / summary / properties / unavailable / description
        Previous value: -"Vendors whose status could not be fetched (carry an error). Counted as unknown — never operational."New value: +"Vendors that could not be checked (carry an error) — unresolvable entry, blocked target, or failed status fetch. Counted as unknown, never operational."
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Components matching component_filter across the stack before the cap. Present only when truncated.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / vendors / items / properties / all_components / description
        Previous value: -"All components including operational ones. Present in detailed mode only."New value: +"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only."
      • addedOutput schema / properties / vendors / items / properties / all_components_total
        Added value: +{
        +  "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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stack_name",
        -  "health",
        -  "summary",
        -  "vendors",
        -  "stack_persisted",
        -  "checked_at"
        -]New value: +[
        +  "stack_name",
        +  "health",
        +  "summary",
        +  "vendors",
        +  "stack_persisted",
        +  "omitted_vendors",
        +  "checked_at"
        +]
  9. 3 tool updates
    • Changeddevops_check_dns2 fields changed
      • changedInput schema / properties / resolvers / description
        Previous value: -"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 check internal DNS or test resolver-specific behavior."New value: +"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."
      • changedInput schema / properties / resolvers / items / description
        Previous value: -"A resolver IP address (e.g., \"8.8.8.8\")."New value: +"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."
    • Changeddevops_status_check3 fields changed
      • changedOutput schema / properties / results / items / properties / active_incidents / items / properties / impact / description
        Previous value: -"Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage."New value: +"Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history."
      • changedOutput schema / properties / results / items / properties / active_incidents / items / properties / impact / enum
        Previous value: -[
        -  "none",
        -  "minor",
        -  "major",
        -  "critical"
        -]New value: +[
        +  "none",
        +  "minor",
        +  "major",
        +  "critical",
        +  "maintenance"
        +]
      • changedOutput schema / properties / results / items / properties / error / description
        Previous value: -"Fetch error message. Absent when the vendor was fetched successfully."New value: +"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."
    • Changeddevops_watch_stack3 fields changed
      • changedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / impact / description
        Previous value: -"Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage."New value: +"Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history."
      • changedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / impact / enum
        Previous value: -[
        -  "none",
        -  "minor",
        -  "major",
        -  "critical"
        -]New value: +[
        +  "none",
        +  "minor",
        +  "major",
        +  "critical",
        +  "maintenance"
        +]
      • changedOutput schema / properties / vendors / items / properties / error / description
        Previous value: -"Fetch error message. Absent when the vendor was fetched successfully."New value: +"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."
  10. 1 tool update
    • Changeddevops_get_incidents3 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum incidents to return. Vendor status APIs return at most ~50 recent entries per call. Use a lower limit for recent-history queries."New value: +"Maximum incidents to return per call (1–50). Page through longer history with offset rather than raising this."
      • addedInput schema / properties / offset
        Added value: +{
        +  "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 names the next offset to use.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated.",
        +  "type": "number"
        +}
  11. 1 tool update
    • Changeddevops_check_certs2 fields changed
      • addedInput schema / properties / domains / items / minLength
        Added value: +1
      • removedInput schema / properties / domains / items / pattern
        Removed value: -"^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$"
  12. 1 tool update
    • Changeddevops_suggest_action1 field changed
      • changedOutput schema / properties / diagnostics_summary / properties / incident_snippet / description
        Previous value: -"First 200 characters of incident_summary truncated for context, or null when not provided."New value: +"The incident_summary input echoed in full for context, or null when not provided."
  13. 1 tool update
    • Changeddevops_watch_stack6 fields changed
      • changedOutput schema / properties / health / description
        Previous value: -"Aggregate health rollup: all_operational = everything clear, degraded = at least one minor issue, partial_outage = at least one major issue, major_outage = at least one critical outage."New value: +"Aggregate health rollup: all_operational = everything clear, 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 (fetch error) and no checked vendor reported a worse issue. Never all_operational when any vendor errored."
      • changedOutput schema / properties / health / enum
        Previous value: -[
        -  "all_operational",
        -  "degraded",
        -  "partial_outage",
        -  "major_outage"
        -]New value: +[
        +  "all_operational",
        +  "degraded",
        +  "partial_outage",
        +  "major_outage",
        +  "unknown"
        +]
      • changedOutput schema / properties / summary / description
        Previous value: -"Aggregate health counts across all checked vendors."New value: +"Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + unavailable = total."
      • changedOutput schema / properties / summary / properties / operational / description
        Previous value: -"Vendors with indicator = none."New value: +"Vendors with indicator = none and no fetch error."
      • addedOutput schema / properties / summary / properties / unavailable
        Added value: +{
        +  "description": "Vendors whose status could not be fetched (carry an error). Counted as unknown — never operational.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / summary / required
        Previous value: -[
        -  "total",
        -  "operational",
        -  "degraded",
        -  "down"
        -]New value: +[
        +  "total",
        +  "operational",
        +  "degraded",
        +  "down",
        +  "unavailable"
        +]
  14. 6 tool updates
    • Changeddevops_check_certs1 field changed
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Connection timeout per domain in milliseconds. Increase for slow or geographically distant endpoints."New value: +"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."
    • Changeddevops_check_dns1 field changed
      • changedInput schema / properties / timeout_ms / description
        Previous value: -"Query timeout per domain+resolver combination in milliseconds."New value: +"Query timeout per domain+resolver combination in milliseconds. Defaults to the DEVOPS_STATUS_DNS_TIMEOUT_MS env var (3000 when unset)."
    • Changeddevops_get_incidents4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum incidents to return. Statuspage returns at most 50 per call. Use a lower limit for recent-history queries."New value: +"Maximum incidents to return. Vendor status APIs return at most ~50 recent entries per call. Use a lower limit for recent-history queries."
      • changedInput schema / properties / vendor / description
        Previous value: -"Vendor slug (e.g., \"github\") or raw Statuspage base URL. Use devops_list_vendors to find slugs."New value: +"Vendor slug (e.g., \"github\", \"aws\") or raw Atlassian Statuspage base URL. Use devops_list_vendors to find slugs."
      • changedOutput schema / properties / incidents / items / properties / id / description
        Previous value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API."
      • changedOutput schema / properties / statuspage_url / description
        Previous value: -"Statuspage base URL used."New value: +"Status page base URL used."
    • Changeddevops_list_vendors1 field changed
      • changedOutput schema / properties / vendors / items / properties / statuspage_url / description
        Previous value: -"Statuspage base URL used to fetch status data."New value: +"Status page base URL — the Statuspage API base for Statuspage-backed vendors, the public status page URL for adapter-backed vendors (aws, gitlab, slack, neon)."
    • Changeddevops_status_check4 fields changed
      • changedInput schema / properties / vendors / description
        Previous value: -"Vendor slugs from the built-in registry (e.g., \"github\", \"cloudflare\") or raw Statuspage base URLs. Mix freely. Use devops_list_vendors to discover available slugs."New value: +"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."
      • changedInput schema / properties / vendors / items / description
        Previous value: -"A vendor slug (e.g., \"github\") or raw Statuspage base URL."New value: +"A vendor slug (e.g., \"github\") or raw Atlassian Statuspage base URL."
      • changedOutput schema / properties / results / items / properties / active_incidents / items / properties / id / description
        Previous value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API."
      • changedOutput schema / properties / results / items / properties / statuspage_url / description
        Previous value: -"Statuspage base URL used for this vendor."New value: +"Status page base URL used for this vendor."
    • Changeddevops_watch_stack4 fields changed
      • changedInput schema / properties / vendors / description
        Previous value: -"Vendor slugs or raw Statuspage URLs. When provided, saves this list as the stack. When omitted, uses the previously saved list for stack_name."New value: +"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."
      • changedInput schema / properties / vendors / items / description
        Previous value: -"A vendor slug (e.g., \"github\") or raw Statuspage base URL."New value: +"A vendor slug (e.g., \"github\") or raw Atlassian Statuspage base URL."
      • changedOutput schema / properties / vendors / items / properties / active_incidents / items / properties / id / description
        Previous value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API."
      • changedOutput schema / properties / vendors / items / properties / statuspage_url / description
        Previous value: -"Statuspage base URL used for this vendor."New value: +"Status page base URL used for this vendor."
  15. 2 tool updates
    • Changeddevops_get_incidents5 fields changed
      • changedOutput schema / properties / cap / description
        Previous value: -"The limit that was applied."New value: +"The limit that was applied. Present only when truncated."
      • changedOutput schema / properties / incidents / items / properties / duration_minutes / description
        Previous value: -"Minutes from started_at to resolved_at. Null for active or scheduled incidents."New value: +"Minutes from started_at to resolved_at. Null for active or scheduled incidents, or when the vendor-authored timestamps are missing, invalid, or inverted."
      • changedOutput schema / properties / shown / description
        Previous value: -"Number of incidents returned after applying the limit."New value: +"Number of incidents returned after applying the limit. Present only when truncated."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more incidents matched than the limit returned."New value: +"True when more incidents matched than the limit returned. Absent when the result was not capped."
      • changedOutput schema / required
        Previous value: -[
        -  "vendor",
        -  "name",
        -  "incidents",
        -  "total_returned",
        -  "statuspage_url",
        -  "truncated",
        -  "shown",
        -  "cap"
        -]New value: +[
        +  "vendor",
        +  "name",
        +  "incidents",
        +  "total_returned",
        +  "statuspage_url"
        +]
    • Changeddevops_suggest_action4 fields changed
      • addedInput schema / properties / vendor_indicator
        Added value: +{
        +  "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.",
        +  "enum": [
        +    "none",
        +    "minor",
        +    "major",
        +    "critical"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / diagnostics_summary / properties / vendor_indicator / anyOf
        Previous value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "none",
        +      "minor",
        +      "major",
        +      "critical"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / diagnostics_summary / properties / vendor_indicator / description
        Previous value: -"Overall vendor indicator from the calling context, or null when not provided as input."New value: +"Vendor status indicator echoed from the vendor_indicator input, or null when not provided."
      • changedOutput schema / properties / guidance / description
        Previous value: -"Markdown playbook — immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category and affected components."New value: +"Markdown playbook — immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category, reported severity, and affected components."
  16. 1 tool update
    • Changeddevops_get_incidents4 fields changed
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The limit that was applied.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of incidents returned after applying the limit.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when more incidents matched than the limit returned.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "vendor",
        -  "name",
        -  "incidents",
        -  "total_returned",
        -  "statuspage_url"
        -]New value: +[
        +  "vendor",
        +  "name",
        +  "incidents",
        +  "total_returned",
        +  "statuspage_url",
        +  "truncated",
        +  "shown",
        +  "cap"
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides live infrastructure monitoring for AI agents, including domain health checks, MCP server security posture, email blacklists, broken-link scans, and cloud vendor status. No signup or API key needed for public tools.
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Provides comprehensive tools for real-time DNS queries across 53 record types, global propagation checks, and SSL certificate analysis. It also enables domain security scans for SPF/DKIM/DMARC configurations and HTTP uptime monitoring.
    8
    58 npm
    23
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Let agents read and manage your org’s independent monitors, incidents, status pages, and alerts (honest measured state, no false greens).
    -
  • A
    license
    A
    quality
    C
    maintenance
    Six-layer website monitoring (uptime, performance, SSL, DNS, visual regression, content change) from Claude, Cline, and Cursor. Free tools (DNS lookup, SSL check, speed test, website checker) work without an account; monitor, incident, alert, and status-page tools use a personal API key.
    16
    10 npm
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.