devops-status-mcp-server
Server Details
Vendor status pages, TLS cert inspection, DNS propagation checks, and incident-response playbooks.
- Status
- Healthy
- Uptime
- 99.8% over 63 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
Scored across 7 tools
Most tools target distinct actions (cert check, DNS check, incident history, playbook, vendor discovery). The main overlap is devops_status_check vs devops_watch_stack, which both check multiple vendors' health; the saved-stack-vs-ad-hoc distinction is described but could still cause selection hesitation. Active incidents also surface in both status_check and get_incidents, though scope differs.
All tools share the devops_ prefix and snake_case, and nearly all follow a verb_noun pattern (check_certs, check_dns, get_incidents, list_vendors, suggest_action, watch_stack). The one inversion is status_check (noun_verb), a minor deviation from an otherwise consistent scheme.
Seven tools is well-scoped for a devops status/monitoring server. Each tool has a clear role: vendor discovery, ad-hoc status, saved-stack status, incident history, response playbook, and two targeted network diagnostics. Nothing feels redundant or missing at the count level.
The surface covers discovery, current health, historical incidents, remediation guidance, and network-level DNS/TLS checks, which is strong lifecycle coverage for a monitoring server. Minor gaps exist in saved-stack lifecycle management (no explicit tool to list, update, or delete saved stacks) and no dedicated single-vendor detail retrieval beyond status_check.
Available Tools
7 toolsdevops_check_certsDevops Check CertsARead-onlyIdempotentInspect
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 — a server offering only those is still inspected), cipher suite, and HSTS presence when the port answers HTTP. 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". Non-HTTP TLS ports (IMAPS 993, SMTPS 465, DNS over TLS 853) are graded the same way, with HSTS reported as not checked. If a domain fails to connect at all, check devops_check_dns first — the name may not resolve. When a certificate fails to issue or renew, run devops_check_dns with record_types ["CAA"] to see which certificate authorities the domain allows.
| Name | Required | Description | Default |
|---|---|---|---|
| port | No | TLS port for entries that do not carry their own. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints, or 993, 465, 853, and the like for other TLS services. A port written on an entry ("example.com:8443") wins for that entry. | |
| domains | Yes | Hosts to inspect. The first 10 entries are inspected; up to 100 are accepted, and entries past the 10th come back uninspected and verbatim in deferred_domains, to resend in another call. Each entry is read as one host: surrounding whitespace and letter case are ignored, a scheme, path, query, or fragment is dropped, an internationalized name is converted to its ASCII form ("münchen.de" → "xn--mnchen-3ya.de"), and a port written on the entry is used for that entry in place of "port". An entry with no single host — a user name before "@", a bad port, or a malformed label — gets its own result with status "error" and is never connected to; the other entries still run. | |
| timeout_ms | No | Time limit in milliseconds for each domain, covering the connection, the handshake, a second handshake with TLS 1.0/1.1 enabled when the server offers nothing newer, and the HSTS request. A port that completes the handshake and then sends nothing is reported at this limit, certificate included. At least 1000; a value over 15000 is served as 15000, and the notice says so. Defaults to 5000 unless the server is configured otherwise. Increase for slow or geographically distant endpoints. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when the call was served at a bound: hosts past the per-call cap, named in deferred_domains, or a timeout_ms over 15000 that was served as 15000. Absent otherwise. |
| results | No | Per-domain certificate inspection results. |
| deferred_domains | No | Host entries past the first 10, not inspected on this call, verbatim and in input order. Resend them in another call. Empty when every entry was inspected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, openWorld), and the description goes well beyond them: it discloses that the handshake completes even for certs clients would reject, where failures surface (cert.hostname_verification_error, cert.authorization_error, both "critical"), how non-HTTP TLS ports are graded, and that HSTS is reported as not checked. This is rich behavioral context an agent could not get from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and handshake mechanics, then failure semantics, then the routing advice. It is dense and long, but nearly every sentence carries information; only the SAN/issuer/cipher enumeration is close to filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the description still names the key error fields and their critical status. For a read-only inspection tool with three documented params, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 modestly reinforces usage by noting entry-level ports win over the port param and by framing domains as hosts/URLs reduced to their host. It adds little syntax beyond the schema, but the extra behavioral framing of deferred entries nudges it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Inspect SSL/TLS certificate health") and the mechanism (a real TLS handshake), and explicitly scopes it to any internet-accessible domain rather than a vendor registry. This is immediately distinguishable from the DNS, incidents, and vendor siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative explicitly and the condition that selects it: use devops_check_dns when the domain fails to connect, and with record_types ["CAA"] when issuance/renewal fails. These are concrete when-to-use and when-to-switch rules, not inference.
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 DnsARead-onlyIdempotentInspect
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/CAA/SOA), 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.
| Name | Required | Description | Default |
|---|---|---|---|
| domains | Yes | Domain names to query. The first 10 entries are queried; up to 100 are accepted, and entries past the 10th come back unqueried and verbatim in deferred_domains, to resend in another call. Each entry is read as one name: surrounding whitespace and letter case are ignored, a scheme, port, path, query, or fragment is dropped, and an internationalized name is converted to its ASCII form ("münchen.de" → "xn--mnchen-3ya.de"); a trailing dot and underscore labels are kept. An entry that is not a domain name — an IP address, a user name before "@", a bad port, or a malformed label — gets its own result with "error" set and is never queried; the other entries still run. | |
| resolvers | No | 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. A resolver listed more than once — the same address and port, however written ("8.8.8.8" and "8.8.8.8:53") — is queried once, under its first spelling. The first 5 distinct resolvers are queried; up to 20 entries are accepted, and the rest come back unqueried in deferred_resolvers, to resend with the same domains in another call. 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_ms | No | Time limit in milliseconds for each domain+resolver pair, covering every requested record type and any retry over TCP. A resolver that has not answered within it reports "timeout" for the unanswered types. At least 1000; a value over 10000 is served as 10000, and the notice says so. Defaults to 3000 unless the server is configured otherwise. | |
| record_types | No | DNS record types to resolve. Defaults to A, AAAA, MX, and TXT. An empty array uses the same defaults. A type listed more than once is queried once. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains. Add CAA when a certificate will not issue or renew: it lists the certificate authorities allowed to issue for the name. CAA is reported for the exact name only; a CA that finds none there checks the parent domains, so no CAA at a subdomain does not mean any CA may issue. Add SOA to compare zone serials across resolvers. SOA answers only at a zone apex, so a name below it returns nodata (a name that is a CNAME returns the SOA of its target). A serial difference means a zone change has not reached every resolver only when those resolvers report the same primary nameserver; a different primary means more than one DNS provider serves the zone. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Present when the call was served at a bound: domains or resolvers past the per-call cap, named in deferred_domains and deferred_resolvers, or a timeout_ms over 10000 that was served as 10000. Absent otherwise. |
| results | No | Per-domain DNS resolution results. |
| deferred_domains | No | Domain entries past the first 10, not queried on this call, verbatim and in input order. Resend them in another call. Empty when every entry was queried. |
| deferred_resolvers | No | Distinct resolvers past the first 5, not queried on this call, verbatim and in input order. Resend them with the same domains in another call. Empty when every resolver was queried. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the safety profile is covered. The description adds genuine value beyond that: it explains the typed outcome model (nxdomain vs servfail vs nodata) and, crucially, how to interpret resolver disagreement (partial_resolution vs value_variation being normal steady state). That interpretive context is not in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose in the first sentence and keeps every subsequent sentence substantive (outcome types, disagreement interpretation, sibling pairing). Dense but not padded; only minor tightening would help.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values, and it supplies the interpretive semantics (outcome types, disagreement meanings) that an agent needs to act on results correctly. Complete for this tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all four parameters including deferred_domains/deferred_resolvers and CAA/SOA caveats. The description adds little parameter-level detail beyond what the schema already states, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Resolve DNS records for one or more domains across multiple public resolvers and compare what each resolver returned') and distinguishes itself from siblings by explicitly naming devops_check_certs and the condition for pairing. An agent can identify this as the DNS-resolution tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear routing condition: 'Pair with devops_check_certs when a domain resolves but TLS to it is failing.' That names the alternative and the trigger. It stops short of explicit when-not-to-use exclusions, so it lands at 4 rather than 5.
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 IncidentsARead-onlyIdempotentInspect
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, and narrow further with match (words in the title or affected component names) and since/until (a start-date range) — all applied before paging, so totals count only what they keep. Page through long histories with limit + offset — a truncated result discloses the total and returns the value to page with in nextOffset. Each response is held to 64,000 bytes per surface: a page can stop short of limit at that budget (the paging fields and notice say so), and an incident too large on its own keeps only its newest updates, with updates_omitted counting the rest — full_updates: true returns them all. 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) also reads the status page's quarterly history archive back to that date, or 24 months back at most, where the page publishes one — not on a vendor that covers only part of a shared page, such as "sendgrid"; 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum incidents to return per call, at least 1. A value over 50 is served as 50, and the notice says so. Page through longer history with offset rather than raising this. | |
| match | No | Words to look for in each incident's title and affected component names, ignoring case and punctuation ("git-operations" reads as "git operations"). An incident is kept when every word appears, as all or part of a word, in its title or in one of its component names. History-archive records, and vendors that publish no components, match on title alone. Applied before limit/offset, so totals and paging count only the matches. Leave blank to keep every incident. | |
| since | No | Earliest start date to include, as YYYY-MM-DD (UTC). 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 — except on a vendor that covers only part of a shared status page (such as "sendgrid" on Twilio's page), whose archive records carry no components to narrow by. The archive is read back 24 months at most: for an earlier date, older records come only from what the status API still returns (such as completed maintenance windows), and the notice gives the date the archive was read back to. Omit to read only the status API. | |
| until | No | Latest start date to include, as YYYY-MM-DD (UTC) — the whole day, so until equal to since returns that one day. Accepted with filter "all" or "resolved", and on or after since. Incidents that started after it are left out before limit/offset page the rest. It reads no history archive on its own: set since as well to reach incidents older than the status API returns, through an archive read back 24 months at most. | |
| filter | No | 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", "azure-devops", "gcp", and "slack" publish no maintenance windows. An empty result names which case applied. | all |
| offset | No | 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. | |
| vendor | Yes | Vendor slug (e.g., "github", "aws") or raw Atlassian Statuspage base URL. Use devops_list_vendors to find slugs. | |
| full_updates | No | Return every update of an incident that is too large for the response size budget on its own, instead of only its newest updates. Default false. Pair it with limit: 1 and the offset the notice names; the response can then run past the budget. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The limit that was applied: the requested limit, or 50 when a larger one was requested. Present only when truncated. |
| name | No | Display name of the vendor. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of incidents on this page: the limit, or fewer when the page stopped at the response size budget. Present only when truncated. |
| notice | No | Plain-language explanation of this result — a limit over 50 that was served as 50 (with the requested and effective values), a since older than the 24-month history-archive floor (with the date the archive was read back to), how to page onward, that the page stopped at the response size budget or left out an oversized incident's oldest updates (and the call that returns them all), why it came back empty (the vendor currently publishes nothing at all, a filter the backend cannot satisfy, an offset past the end, a since/until range or match words that left everything out — naming the archive floor when the range starts before it), that the vendor feed capped the history, or how far the history archive was read when it stopped short of since or its floor. Absent when the result needs no explanation. |
| vendor | No | Vendor slug or URL as provided. |
| incidents | No | Matching incidents. |
| truncated | No | True when more incidents matched than this page returned — because of limit, or because the page stopped at the response size budget. Absent when this page reached the end of the matches. |
| nextOffset | No | 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. |
| totalCount | No | Total incidents matching the filter, date range, and match, across all pages, before offset/limit windowing. Present only when the result was truncated. |
| statuspage_url | No | Status page base URL used. |
| total_returned | No | Number of incidents in the response. |
| upstreamCeiling | No | 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, except on a vendor that covers only part of a shared page, such as "sendgrid". 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 (or to its 24-month floor, when since is older). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering read-only, open-world, and idempotent traits, the description adds substantial behavioral context: response size budget of 64,000 bytes per surface, truncated results and nextOffset, full_updates behavior with updates_omitted, vendor history caps via upstreamCeiling, and Atlassian Statuspage history archive limits (24 months, partial shared page exclusion). This is rich, specific disclosure that goes well beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose but then becomes a single dense paragraph of ~350 words. While the complexity justifies some length, the lack of structure (e.g., bullets for paging, archive, and size rules) makes it harder to parse, and several details duplicate the schema, reducing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the presence of annotations and a full output schema, the description is complete enough for an agent to call it correctly. It covers filtering, paging, size limits, archive behavior, vendor-specific caveats, and empty-result notices, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% description coverage, so the baseline is 3. The description repeats much of the schema's parameter information (e.g., filter usage, match behavior, since/until archive reading), but it adds little semantic meaning beyond what each parameter's schema description already provides. The integration of parameter interactions is helpful but not sufficiently novel to raise the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Fetch) and resources (incident history and scheduled maintenance windows) and details what the response contains (full incident timeline, investigator updates, affected components, resolution). It does not explicitly distinguish this tool from siblings like devops_status_check, so it falls short of the 5-level criterion that requires naming the sibling it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for using the filter parameter ('use before deploy' for active, 'for postmortem' for resolved, etc.) and directs the user to devops_list_vendors for slugs. It does not provide explicit when-not-to-use guidance or name alternative tools for overlapping tasks, so it is clear but not exhaustive.
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 VendorsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Substring search against vendor slug and display name. Case-insensitive; surrounding whitespace is ignored. E.g., "cloud", "auth", "slack". | |
| category | No | Filter to one category: cloud, cdn-edge, dev-platform, data, comms, auth, monitoring, or ai. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| total | No | Total number of vendors returned. |
| notice | No | Why nothing matched and what to call next. Present only when vendors is empty. |
| vendors | No | Matching vendors from the built-in registry. |
| categories | No | All available category values for use in the category filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and closed-world, so the safety profile is covered. The description adds context beyond them: the registry is built-in (a closed, stable set) and it is meant as a pre-step before other tools. It does not discuss result size limits or pagination, which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first defines the resource and filters, the second gives return fields and intended usage. Purpose and the highest-value guidance are front-loaded with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and 100% parameter coverage, the description only needs to supply purpose and usage routing — both of which it does. An agent has everything required to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented with examples and enum values, so the baseline is 3. The description only restates the filters ('optionally filtered by category or name search') without adding semantics beyond the schema's substring/case-insensitivity details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List vendors') plus scope ('in the built-in registry') and the two optional filters. Nothing in the sibling set (devops_check_certs, devops_check_dns, devops_get_incidents, etc.) overlaps with a registry-listing/discovery tool, so an agent can route here 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: 'to discover the correct slug to pass to other tools, or to see which vendors are available before configuring a stack.' That is a clear upstream/discovery role relative to siblings. It stops short of stating when not to use it or naming a specific alternative tool.
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 CheckARead-onlyIdempotentInspect
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, Azure DevOps 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; up to 20 vendors are checked per call, and any past the 20th come back in deferred_vendors to resend. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | summary: indicator + degraded components + active incidents only. detailed: adds the component list and scheduled maintenance windows. | summary |
| vendors | Yes | 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. The first 20 are checked, in the order given; entries past the 20th are returned unchecked in deferred_vendors to resend in another call. Lists longer than 100 are rejected. | |
| component_limit | No | Maximum components returned per vendor in detailed mode, at least 1. A value above 500 is reduced to 500, and notice says so. 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_filter | No | Case-insensitive substring matched against component names and their group names in detailed mode (e.g., "api" to check just the API components, or a product or region a page groups components under). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. A filter that matches nothing for a vendor is reported in notice. Ignored in summary mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per-vendor component_limit that was applied. Present only when truncated. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Components returned across all vendors. Present only when truncated. |
| notice | No | Plain-language explanation of what this call left out or adjusted: vendors past the first 20 (listed in deferred_vendors), a component_limit above 500 reduced to 500, and in detailed mode how many components the cap omitted and how to reach them (component_filter to target one, or component_limit to raise a cap below 500), and which checked vendors component_filter matched no component of, with how many each publishes. Present only when one of these applies. |
| results | No | Per-vendor status results for the vendors checked, in the same order as the input vendors list. |
| summary | No | Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + maintenance + unavailable = total. |
| truncated | No | True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped. |
| totalCount | No | Components matching component_filter across all vendors before the cap. Present only when truncated. |
| deferred_vendors | No | Entries past the first 20 in vendors, verbatim and in input order. They were not checked; resend them in another call. Empty when every entry was checked. |
| nextToolSuggestions | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, openWorld), and the description adds substantial operational context beyond them: a 20-vendor cap with overflow returned in deferred_vendors, per-vendor failure isolation ('one bad entry never discards the rest'), cross-backend normalization, and pre-filled nextToolSuggestions. This is exactly the behavioral detail an agent needs before batching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and input types before diving into response shape and batch mechanics; every sentence carries information. It is dense and long, but no sentence is filler, so trimming would lose substance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering safety, and fully documented parameters, the description's remaining job is to explain batch limits, failure isolation, and response composition — all of which it does. An agent can call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds strategic guidance the schema lacks — that component_filter is applied before component_limit and is the way to reach components the cap would otherwise omit — which meaningfully deepens understanding of the two interacting parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('check the current health status for one or more vendors') and enumerates the accepted inputs (registry slugs vs raw Statuspage URLs). It clearly differentiates from siblings by pointing at devops_list_vendors for slug discovery and devops_suggest_action via nextToolSuggestions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete context: use mode 'detailed' for component lists and maintenance windows, narrow with component_filter, and pass a list to check a full stack in one call. It routes to devops_list_vendors for slug discovery, but never states when to prefer a sibling like devops_get_incidents over this tool, so usage is clear but not exclusionary.
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 ActionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| vendor | Yes | Vendor slug, display name, or raw status page URL (e.g., "cloudflare", "Amazon Web Services"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage). A name that matches no registry vendor gets a devops_list_vendors search as its first follow-up instead of an incidents call. | |
| your_domain | No | Your own domain or service URL. When provided, nextToolSuggestions will be pre-filled with your domain for cert and DNS checks. | |
| incident_summary | No | Latest incident description or update body from devops_get_incidents. Paste the most recent update to get more targeted advice. | |
| vendor_indicator | No | 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. | |
| affected_components | No | Component names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Values pre-filled by devops_status_check read "Group / Leaf" for a component the status page files under a group. Used to tailor suggestions to the impacted subsystem. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| vendor | No | Vendor as provided. |
| guidance | No | Markdown playbook — immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category, reported severity, and affected components. |
| vendor_category | No | Detected category from registry (e.g., "cdn-edge", "auth"). Null for unrecognized vendors. |
| diagnostics_summary | No | Summary of input context used to generate the playbook. |
| nextToolSuggestions | No | Recommended follow-up calls with arguments already populated. Execute these in sequence to gather diagnostic data. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, closed-world behavior, so the bar is lower. The description adds genuine context: guidance is synthesized from built-in incident knowledge plus the caller's context, and the output is a playbook with pre-filled follow-up calls. It stops short of noting any limits or caveats on that generated guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the verb and deliverable, then the synthesis mechanism, then the trigger. Every sentence carries information and none is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 needn't enumerate return values. It covers purpose, trigger conditions, input tailoring, and behavioral nature — everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the per-parameter descriptions (vendor slug fallback, your_domain pre-fill, indicator enum, component grouping) are richer than anything the prose adds. Baseline 3 is appropriate since the schema carries the parameter burden; the description only alludes to 'provided context'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (return) and resource (incident-response playbook), plus distinguishing detail: pre-filled follow-up tool calls tailored to vendor degradation. It names the sibling tools that surface the problem, so an agent can tell it apart from devops_status_check and devops_get_incidents without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to invoke it (after devops_status_check or devops_get_incidents surfaces a problem) and the goal (determine what to investigate next). Clear context, but no explicit exclusions or counter-indications for when a different sibling would be preferable.
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 StackAIdempotentInspect
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 saved list. Stacks are saved per authenticated caller, or per local server process; a shared deployment that does not authenticate callers saves nothing, so there vendors is required on every call and the response says so. Up to 20 vendors are saved per stack and checked per call; use several stack names for a larger set. 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").
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | summary: indicator + degraded components + active incidents. detailed: adds component lists and maintenance windows. | summary |
| vendors | No | Vendor slugs (e.g., "github", "aws") or raw Atlassian Statuspage base URLs. When provided, saves this list as the stack where stacks are saved; a list longer than 20 is then rejected and nothing is saved. When omitted, uses the previously saved list for stack_name; required on every call on a deployment that does not authenticate callers, which saves no stacks — there the first 20 are checked and the rest return in deferred_vendors. Lists longer than 100 are rejected. | |
| stack_name | No | 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. | default |
| component_limit | No | Maximum components returned per vendor in detailed mode, at least 1. A value above 500 is reduced to 500, and notice says so. 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_filter | No | Case-insensitive substring matched against component names and their group names in detailed mode (e.g., "api" to check just the API components, or a product or region a page groups components under). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. A filter that matches nothing for a vendor is reported in notice. Ignored in summary mode. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The per-vendor component_limit that was applied. Present only when truncated. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Components returned across the stack. Present only when truncated. |
| health | No | 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. |
| notice | No | Plain-language explanation of what this call left out or adjusted: vendors past the first 20 (listed in deferred_vendors), a component_limit above 500 reduced to 500, and in detailed mode how many components the cap omitted and how to reach them (component_filter to target one, or component_limit to raise a cap below 500), and which checked vendors component_filter matched no component of, with how many each publishes. Present only when one of these applies. |
| summary | No | Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + maintenance + unavailable = total. |
| vendors | No | Per-vendor status results for the vendors checked, in stack order. |
| truncated | No | True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped. |
| checked_at | No | ISO 8601 UTC timestamp of this check. |
| stack_name | No | Name of the stack checked. |
| totalCount | No | Components matching component_filter across the stack before the cap. Present only when truncated. |
| omitted_vendors | No | 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. |
| stack_persisted | No | True when the vendor list was saved on this call. Only the vendors that resolved are saved — see omitted_vendors. Always false on a deployment that does not authenticate callers, which saves no stacks (persistence_notice says so). |
| deferred_vendors | No | Entries past the first 20, verbatim and in order, that were not checked on this call: the rest of a passed vendors list on a deployment that saves no stacks, or of a saved stack holding more than 20. Resend them in another call. Empty when every entry was checked. |
| persistence_notice | No | Present when this deployment saves no stacks because callers are not authenticated: nothing was saved, and vendors must be passed on every call. |
| nextToolSuggestions | No | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: stacks are saved per authenticated caller or per server process, unauthenticated deployments save nothing and force vendors on every call, a failed vendor is reported in its own row and excluded from the saved stack, and problems emit pre-filled devops_suggest_action calls. This is rich, non-obvious operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the vendor/stack workflow are front-loaded, and each sentence conveys real information. It is somewhat long and overlaps the schema in places, but there is little pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail return values, yet it summarizes the returned shape, plus the cap behavior, unauthenticated-deployment edge case, and follow-up chaining. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already documents vendor saving/rejection limits, stack_name format, and component limits. The description mostly restates this; only the 'multiple stacks can coexist' idea adds anything, so it sits at the high-coverage baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'check the health of a named vendor stack' — and defines what a stack is, so the scope is unambiguous. It does not explicitly contrast itself with checking siblings like devops_status_check, so it is clear but lacks full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use context ('Ideal for morning status checks or pre-deploy sweeps') and explains the provide-vendors-first / omit-later workflow. It stops short of naming when not to use it or pointing to the single-vendor alternative.
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.
7 tool updates
- Changed
devops_check_certs16 fields changed- changed
Input schema / properties / domains / descriptionPrevious value: -"Domains to inspect. Do not include \"https://\" — pass the bare hostname. Up to 10 per call."New value: +"Hosts to inspect. The first 10 entries are inspected; up to 100 are accepted, and entries past the 10th come back uninspected and verbatim in deferred_domains, to resend in another call. Each entry is read as one host: surrounding whitespace and letter case are ignored, a scheme, path, query, or fragment is dropped, an internationalized name is converted to its ASCII form (\"münchen.de\" → \"xn--mnchen-3ya.de\"), and a port written on the entry is used for that entry in place of \"port\". An entry with no single host — a user name before \"@\", a bad port, or a malformed label — gets its own result with status \"error\" and is never connected to; the other entries still run." - changed
Input schema / properties / domains / items / descriptionPrevious value: -"Domain name without protocol (e.g., \"api.github.com\", \"example.com\")."New value: +"A host to inspect: a hostname (\"api.github.com\"), an IP address, a host with a port (\"example.com:8443\", \"[2606:4700:4700::1111]:853\"), or a URL (\"https://example.com/login\"), which is reduced to its host." - changed
Input schema / properties / domains / maxItemsPrevious value: -10New value: +100 - changed
Input schema / properties / port / descriptionPrevious value: -"TLS port. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints."New value: +"TLS port for entries that do not carry their own. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints, or 993, 465, 853, and the like for other TLS services. A port written on an entry (\"example.com:8443\") wins for that entry." - changed
Input schema / properties / timeout_ms / descriptionPrevious 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."New value: +"Time limit in milliseconds for each domain, covering the connection, the handshake, a second handshake with TLS 1.0/1.1 enabled when the server offers nothing newer, and the HSTS request. A port that completes the handshake and then sends nothing is reported at this limit, certificate included. At least 1000; a value over 15000 is served as 15000, and the notice says so. Defaults to 5000 unless the server is configured otherwise. Increase for slow or geographically distant endpoints." - changed
Input schema / properties / timeout_ms / maximumPrevious value: -15000New value: +9007199254740991 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "results" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "deferred_domains" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / deferred_domainsAdded value: +{ + "description": "Host entries past the first 10, not inspected on this call, verbatim and in input order. Resend them in another call. Empty when every entry was inspected.", + "items": { + "description": "A submitted host entry, exactly as sent.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"Machine-readable failure mode." - removed
Output schema / properties / error / properties / data / properties / reason / examplesRemoved value: -[ - "invalid_domain" -] - added
Output schema / properties / noticeAdded value: +{ + "description": "Present when the call was served at a bound: hosts past the per-call cap, named in deferred_domains, or a timeout_ms over 15000 that was served as 15000. Absent otherwise.", + "type": "string" +} - changed
Output schema / properties / results / items / properties / domain / descriptionPrevious value: -"The domain that was inspected."New value: +"The host that was inspected, as read from the submitted entry (lowercase, ASCII, no scheme, port, or path; an IPv6 address without brackets). For an entry with no single host, the submitted string as given." - changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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."New value: +"Why status is \"error\". Either no handshake completed — the entry has no single host (the message names the entry and the accepted shapes), the host was rejected as a private, loopback, or cloud-metadata target, a connection failure such as \"getaddrinfo ENOTFOUND …\" (for a server offering only TLS 1.0/1.1 that still refuses, the failure of the legacy-version attempt), or \"Timed out after 5000ms\" when timeout_ms ran out before a handshake completed — 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, including a completed handshake whose port never answered HTTP." - changed
Output schema / properties / results / items / properties / flags / descriptionPrevious 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\"."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\", and one HSTS finding: \"HSTS present\" or \"HSTS not configured\" when the port answered the HTTP request, or \"HSTS not checked — no HTTP response on port 993\" when it did not (a non-HTTP service such as IMAPS, SMTPS, or DNS over TLS). 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\"." - changed
Output schema / properties / results / items / properties / port / descriptionPrevious value: -"The port used for the TLS connection."New value: +"The port used for the TLS connection: the port written on the entry, otherwise the \"port\" input." - changed
Output schema / properties / results / items / properties / status / descriptionPrevious 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\"."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 (TLS 1.0/1.1, including a server that offers nothing newer); every one of these is rejected by ordinary clients. \"warning\" — expires in < 30 days. \"ok\" — none of the above. Graded from the certificate and session alone: HSTS never changes it, and neither does what the port sends after the handshake. \"error\" — no certificate was retrieved: the entry was rejected, the connection failed or timed out before the handshake completed, or the server presented no certificate; the reason is in \"error\"."
- Changed
devops_check_dns19 fields changed- changed
Input schema / properties / domains / descriptionPrevious value: -"Domain names to query. Up to 10 per call."New value: +"Domain names to query. The first 10 entries are queried; up to 100 are accepted, and entries past the 10th come back unqueried and verbatim in deferred_domains, to resend in another call. Each entry is read as one name: surrounding whitespace and letter case are ignored, a scheme, port, path, query, or fragment is dropped, and an internationalized name is converted to its ASCII form (\"münchen.de\" → \"xn--mnchen-3ya.de\"); a trailing dot and underscore labels are kept. An entry that is not a domain name — an IP address, a user name before \"@\", a bad port, or a malformed label — gets its own result with \"error\" set and is never queried; the other entries still run." - changed
Input schema / properties / domains / items / descriptionPrevious value: -"A domain name to query (e.g., \"github.com\", \"api.example.com\")."New value: +"A domain name to query (e.g., \"github.com\", \"_dmarc.example.com\"). A URL or a host:port is reduced to its host." - changed
Input schema / properties / domains / maxItemsPrevious value: -10New value: +100 - changed
Input schema / properties / record_types / descriptionPrevious 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."New value: +"DNS record types to resolve. Defaults to A, AAAA, MX, and TXT. An empty array uses the same defaults. A type listed more than once is queried once. Add NS to check nameserver delegation. Add CNAME when investigating redirect chains. Add CAA when a certificate will not issue or renew: it lists the certificate authorities allowed to issue for the name. CAA is reported for the exact name only; a CA that finds none there checks the parent domains, so no CAA at a subdomain does not mean any CA may issue. Add SOA to compare zone serials across resolvers. SOA answers only at a zone apex, so a name below it returns nodata (a name that is a CNAME returns the SOA of its target). A serial difference means a zone change has not reached every resolver only when those resolvers report the same primary nameserver; a different primary means more than one DNS provider serves the zone." - changed
Input schema / properties / record_types / items / enumPrevious value: -[ - "A", - "AAAA", - "CNAME", - "MX", - "TXT", - "NS" -]New value: +[ + "A", + "AAAA", + "CNAME", + "MX", + "TXT", + "NS", + "CAA", + "SOA" +] - changed
Input schema / properties / resolvers / descriptionPrevious 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."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. A resolver listed more than once — the same address and port, however written (\"8.8.8.8\" and \"8.8.8.8:53\") — is queried once, under its first spelling. The first 5 distinct resolvers are queried; up to 20 entries are accepted, and the rest come back unqueried in deferred_resolvers, to resend with the same domains in another call. 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." - added
Input schema / properties / resolvers / maxItemsAdded value: +20 - changed
Input schema / properties / timeout_ms / descriptionPrevious value: -"Query timeout per domain+resolver combination in milliseconds. Defaults to the DEVOPS_STATUS_DNS_TIMEOUT_MS env var (3000 when unset)."New value: +"Time limit in milliseconds for each domain+resolver pair, covering every requested record type and any retry over TCP. A resolver that has not answered within it reports \"timeout\" for the unanswered types. At least 1000; a value over 10000 is served as 10000, and the notice says so. Defaults to 3000 unless the server is configured otherwise." - changed
Input schema / properties / timeout_ms / maximumPrevious value: -10000New value: +9007199254740991 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "results" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "deferred_domains", + "deferred_resolvers" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / deferred_domainsAdded value: +{ + "description": "Domain entries past the first 10, not queried on this call, verbatim and in input order. Resend them in another call. Empty when every entry was queried.", + "items": { + "description": "A submitted domain entry, exactly as sent.", + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / deferred_resolversAdded value: +{ + "description": "Distinct resolvers past the first 5, not queried on this call, verbatim and in input order. Resend them with the same domains in another call. Empty when every resolver was queried.", + "items": { + "description": "A submitted resolver entry, exactly as sent.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"Machine-readable failure mode. Declared by this tool: `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_domain", - "target_blocked" -]New value: +[ + "target_blocked" +] - added
Output schema / properties / noticeAdded value: +{ + "description": "Present when the call was served at a bound: domains or resolvers past the per-call cap, named in deferred_domains and deferred_resolvers, or a timeout_ms over 10000 that was served as 10000. Absent otherwise.", + "type": "string" +} - changed
Output schema / properties / results / items / properties / domain / descriptionPrevious value: -"The domain that was queried."New value: +"The domain name that was queried, as read from the submitted entry (lowercase, ASCII, no scheme, port, or path). For an entry that is not a domain name, the submitted string as given." - changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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\"."New value: +"Set only when the domain could not be queried at all. Either it was rejected before any query — the entry is not a domain name (the message names the entry and the accepted shapes), or it is 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\"." - changed
Output schema / properties / results / items / properties / records / descriptionPrevious 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."New value: +"Resolved records from a single resolver, keyed by record type (A, AAAA, CNAME, MX, TXT, NS, CAA, SOA). Names carry no trailing dot; MX renders as \"<preference> <exchange>\", CAA as '<flags> <tag> \"<value>\"', and SOA as \"<primary nameserver> <hostmaster> <serial> <refresh> <retry> <expire> <minimum>\". 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." - changed
Output schema / properties / results / items / properties / resolver_results / items / properties / status_by_type / descriptionPrevious value: -"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\"."New value: +"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 the query or refused the connection; \"timeout\" = no answer within timeout_ms; \"error\" = any other failure, described in \"error\"."
- Changed
devops_get_incidents18 fields changed- changed
Input schema / properties / filter / descriptionPrevious 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."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\", \"azure-devops\", \"gcp\", and \"slack\" publish no maintenance windows. An empty result names which case applied." - added
Input schema / properties / full_updatesAdded value: +{ + "default": false, + "description": "Return every update of an incident that is too large for the response size budget on its own, instead of only its newest updates. Default false. Pair it with limit: 1 and the offset the notice names; the response can then run past the budget.", + "type": "boolean" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum incidents to return per call (1–50). Page through longer history with offset rather than raising this."New value: +"Maximum incidents to return per call, at least 1. A value over 50 is served as 50, and the notice says so. Page through longer history with offset rather than raising this." - changed
Input schema / properties / limit / maximumPrevious value: -50New value: +9007199254740991 - added
Input schema / properties / matchAdded value: +{ + "description": "Words to look for in each incident's title and affected component names, ignoring case and punctuation (\"git-operations\" reads as \"git operations\"). An incident is kept when every word appears, as all or part of a word, in its title or in one of its component names. History-archive records, and vendors that publish no components, match on title alone. Applied before limit/offset, so totals and paging count only the matches. Leave blank to keep every incident.", + "maxLength": 200, + "type": "string" +} - changed
Input schema / properties / since / descriptionPrevious value: -"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."New value: +"Earliest start date to include, as YYYY-MM-DD (UTC). 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 — except on a vendor that covers only part of a shared status page (such as \"sendgrid\" on Twilio's page), whose archive records carry no components to narrow by. The archive is read back 24 months at most: for an earlier date, older records come only from what the status API still returns (such as completed maintenance windows), and the notice gives the date the archive was read back to. Omit to read only the status API." - added
Input schema / properties / untilAdded value: +{ + "anyOf": [ + { + "const": "", + "type": "string" + }, + { + "description": "Latest start date to include, as YYYY-MM-DD (UTC), e.g. \"2025-10-31\".", + "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": "Latest start date to include, as YYYY-MM-DD (UTC) — the whole day, so until equal to since returns that one day. Accepted with filter \"all\" or \"resolved\", and on or after since. Incidents that started after it are left out before limit/offset page the rest. It reads no history archive on its own: set since as well to reach incidents older than the status API returns, through an archive read back 24 months at most." +} - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit that was applied. Present only when truncated."New value: +"The limit that was applied: the requested limit, or 50 when a larger one was requested. Present only when truncated." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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\". `invalid_until`: until was passed with filter \"active\" or \"scheduled\", or names a date earlier than the since date. `statuspage_unavailable`: The vendor's status API returned an error or timed out. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "vendor_not_found", - "target_blocked", - "invalid_since", - "statuspage_unavailable" -]New value: +[ + "vendor_not_found", + "target_blocked", + "invalid_since", + "invalid_until", + "statuspage_unavailable" +] - changed
Output schema / properties / incidents / items / properties / updates / descriptionPrevious 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)."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). An incident too large for the response size budget on its own carries only its newest updates, and updates_omitted counts the rest." - changed
Output schema / properties / incidents / items / properties / updates / items / properties / body / descriptionPrevious value: -"Update text from the vendor."New value: +"Update text from the vendor, as plain text: HTML markup the vendor published is converted (a link reads as its text, then its URL), and any other < is text the vendor wrote." - added
Output schema / properties / incidents / items / properties / updates_omittedAdded value: +{ + "description": "How many of this incident's oldest updates were left out because it alone exceeds the response size budget; the updates returned are its newest. Absent when every update is returned. Call again with full_updates: true and limit: 1 at this incident's offset to read them all.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Output schema / properties / notice / descriptionPrevious 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."New value: +"Plain-language explanation of this result — a limit over 50 that was served as 50 (with the requested and effective values), a since older than the 24-month history-archive floor (with the date the archive was read back to), how to page onward, that the page stopped at the response size budget or left out an oversized incident's oldest updates (and the call that returns them all), why it came back empty (the vendor currently publishes nothing at all, a filter the backend cannot satisfy, an offset past the end, a since/until range or match words that left everything out — naming the archive floor when the range starts before it), that the vendor feed capped the history, or how far the history archive was read when it stopped short of since or its floor. Absent when the result needs no explanation." - changed
Output schema / properties / shown / descriptionPrevious value: -"Number of incidents returned after applying the limit. Present only when truncated."New value: +"Number of incidents on this page: the limit, or fewer when the page stopped at the response size budget. Present only when truncated." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated."New value: +"Total incidents matching the filter, date range, and match, across all pages, before offset/limit windowing. Present only when the result was truncated." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when more incidents matched than the limit returned. Absent when the result was not capped."New value: +"True when more incidents matched than this page returned — because of limit, or because the page stopped at the response size budget. Absent when this page reached the end of the matches." - changed
Output schema / properties / upstreamCeiling / descriptionPrevious 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."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, except on a vendor that covers only part of a shared page, such as \"sendgrid\". 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 (or to its 24-month floor, when since is older)."
- Changed
devops_list_vendors3 fields changed- changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search against vendor name and slug. Case-insensitive. E.g., \"cloud\", \"auth\", \"slack\"."New value: +"Substring search against vendor slug and display name. Case-insensitive; surrounding whitespace is ignored. E.g., \"cloud\", \"auth\", \"slack\"." - added
Output schema / properties / noticeAdded value: +{ + "description": "Why nothing matched and what to call next. Present only when vendors is empty.", + "type": "string" +} - changed
Output schema / properties / vendors / items / properties / statuspage_url / descriptionPrevious 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)."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, azure-devops, gitlab, slack, neon, redis-cloud)."
- Changed
devops_status_check20 fields changed- changed
Input schema / properties / component_filter / descriptionPrevious value: -"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."New value: +"Case-insensitive substring matched against component names and their group names in detailed mode (e.g., \"api\" to check just the API components, or a product or region a page groups components under). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. A filter that matches nothing for a vendor is reported in notice. Ignored in summary mode." - changed
Input schema / properties / component_limit / descriptionPrevious value: -"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."New value: +"Maximum components returned per vendor in detailed mode, at least 1. A value above 500 is reduced to 500, and notice says so. 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." - changed
Input schema / properties / component_limit / maximumPrevious value: -500New value: +9007199254740991 - changed
Input schema / properties / vendors / descriptionPrevious 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."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. The first 20 are checked, in the order given; entries past the 20th are returned unchecked in deferred_vendors to resend in another call. Lists longer than 100 are rejected." - changed
Input schema / properties / vendors / maxItemsPrevious value: -20New value: +100 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "results", - "summary", - "nextToolSuggestions" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "deferred_vendors", + "summary", + "nextToolSuggestions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / deferred_vendorsAdded value: +{ + "description": "Entries past the first 20 in vendors, verbatim and in input order. They were not checked; resend them in another call. Empty when every entry was checked.", + "items": { + "description": "A vendor entry exactly as provided.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"Machine-readable failure mode. Declared by this tool: `vendor_not_found`: No requested vendor among the first 20 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 among the first 20 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." - changed
Output schema / properties / nextToolSuggestions / items / properties / args / descriptionPrevious value: -"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)."New value: +"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, each written \"Group / Leaf\" when it is in a group), incident_summary (title of the most recently started open incident rated minor or worse)." - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"Plain-language explanation of what this call left out or adjusted: vendors past the first 20 (listed in deferred_vendors), a component_limit above 500 reduced to 500, and in detailed mode how many components the cap omitted and how to reach them (component_filter to target one, or component_limit to raise a cap below 500), and which checked vendors component_filter matched no component of, with how many each publishes. Present only when one of these applies." - changed
Output schema / properties / results / descriptionPrevious value: -"Per-vendor status results in the same order as the input vendors list."New value: +"Per-vendor status results for the vendors checked, in the same order as the input vendors list." - changed
Output schema / properties / results / items / properties / active_incidents / items / properties / latest_update / descriptionPrevious value: -"Most recent incident_update body text."New value: +"Most recent update text, as plain text: HTML markup the vendor published is converted, and any other < is text the vendor wrote." - changed
Output schema / properties / results / items / properties / all_components / descriptionPrevious value: -"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only."New value: +"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter (matched against name and group) when given. Present in detailed mode only." - added
Output schema / properties / results / items / properties / all_components / items / properties / groupAdded value: +{ + "description": "Name of the group the status page files this component under — typically the product or region it belongs to — or null when it is not in a group.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / results / items / properties / all_components / items / properties / name / descriptionPrevious value: -"Component name."New value: +"Component name as the status page publishes it — the leaf alone, without its group. Several leaves can share a name (one per region or product); group tells them apart." - changed
Output schema / properties / results / items / properties / all_components / items / requiredPrevious value: -[ - "name", - "status", - "description" -]New value: +[ + "name", + "group", + "status", + "description" +] - added
Output schema / properties / results / items / properties / degraded_components / items / properties / groupAdded value: +{ + "description": "Name of the group the status page files this component under — typically the product or region it belongs to — or null when it is not in a group.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / results / items / properties / degraded_components / items / properties / name / descriptionPrevious value: -"Component name."New value: +"Component name as the status page publishes it — the leaf alone, without its group. Several leaves can share a name (one per region or product); group tells them apart." - changed
Output schema / properties / results / items / properties / degraded_components / items / requiredPrevious value: -[ - "name", - "status" -]New value: +[ + "name", + "group", + "status" +] - changed
Output schema / properties / summary / properties / total / descriptionPrevious value: -"Total number of vendors checked."New value: +"Total number of vendors checked — never counts deferred_vendors."
- Changed
devops_suggest_action3 fields changed- changed
Input schema / properties / affected_components / descriptionPrevious value: -"Component names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Used to tailor suggestions to the impacted subsystem."New value: +"Component names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Values pre-filled by devops_status_check read \"Group / Leaf\" for a component the status page files under a group. Used to tailor suggestions to the impacted subsystem." - changed
Input schema / properties / vendor / descriptionPrevious value: -"Vendor slug or display name (e.g., \"cloudflare\", \"github\"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage)."New value: +"Vendor slug, display name, or raw status page URL (e.g., \"cloudflare\", \"Amazon Web Services\"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage). A name that matches no registry vendor gets a devops_list_vendors search as its first follow-up instead of an incidents call." - changed
Output schema / properties / nextToolSuggestions / items / properties / toolName / descriptionPrevious value: -"Tool to call next (e.g., \"devops_check_dns\", \"devops_check_certs\")."New value: +"Tool to call next (e.g., \"devops_get_incidents\", \"devops_list_vendors\", \"devops_check_dns\")."
- Changed
devops_watch_stack23 fields changed- changed
Input schema / properties / component_filter / descriptionPrevious value: -"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."New value: +"Case-insensitive substring matched against component names and their group names in detailed mode (e.g., \"api\" to check just the API components, or a product or region a page groups components under). Applied before component_limit, so it is the way to reach a component that the cap would otherwise omit. A filter that matches nothing for a vendor is reported in notice. Ignored in summary mode." - changed
Input schema / properties / component_limit / descriptionPrevious value: -"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."New value: +"Maximum components returned per vendor in detailed mode, at least 1. A value above 500 is reduced to 500, and notice says so. 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." - changed
Input schema / properties / component_limit / maximumPrevious value: -500New value: +9007199254740991 - changed
Input schema / properties / vendors / descriptionPrevious 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."New value: +"Vendor slugs (e.g., \"github\", \"aws\") or raw Atlassian Statuspage base URLs. When provided, saves this list as the stack where stacks are saved; a list longer than 20 is then rejected and nothing is saved. When omitted, uses the previously saved list for stack_name; required on every call on a deployment that does not authenticate callers, which saves no stacks — there the first 20 are checked and the rest return in deferred_vendors. Lists longer than 100 are rejected." - added
Input schema / properties / vendors / maxItemsAdded value: +100 - changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "stack_name", - "health", - "summary", - "vendors", - "stack_persisted", - "omitted_vendors", - "checked_at", - "nextToolSuggestions" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stack_name", + "health", + "summary", + "vendors", + "deferred_vendors", + "stack_persisted", + "omitted_vendors", + "checked_at", + "nextToolSuggestions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / deferred_vendorsAdded value: +{ + "description": "Entries past the first 20, verbatim and in order, that were not checked on this call: the rest of a passed vendors list on a deployment that saves no stacks, or of a saved stack holding more than 20. Resend them in another call. Empty when every entry was checked.", + "items": { + "description": "A vendor entry exactly as provided or saved.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"Machine-readable failure mode. Declared by this tool: `no_stack`: No vendors provided and no saved stack found for stack_name. `vendors_required`: No vendors provided on a deployment that saves no stacks because callers are not authenticated. `stack_too_large`: More than 20 vendors were provided on a deployment that saves stacks, so nothing was saved. `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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_stack", - "vendor_not_found", - "target_blocked" -]New value: +[ + "no_stack", + "vendors_required", + "stack_too_large", + "vendor_not_found", + "target_blocked" +] - changed
Output schema / properties / nextToolSuggestions / items / properties / args / descriptionPrevious value: -"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)."New value: +"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, each written \"Group / Leaf\" when it is in a group), incident_summary (title of the most recently started open incident rated minor or worse)." - changed
Output schema / properties / notice / descriptionPrevious value: -"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."New value: +"Plain-language explanation of what this call left out or adjusted: vendors past the first 20 (listed in deferred_vendors), a component_limit above 500 reduced to 500, and in detailed mode how many components the cap omitted and how to reach them (component_filter to target one, or component_limit to raise a cap below 500), and which checked vendors component_filter matched no component of, with how many each publishes. Present only when one of these applies." - added
Output schema / properties / persistence_noticeAdded value: +{ + "description": "Present when this deployment saves no stacks because callers are not authenticated: nothing was saved, and vendors must be passed on every call.", + "type": "string" +} - changed
Output schema / properties / stack_persisted / descriptionPrevious value: -"True when the vendor list was saved to state on this call. Only the vendors that resolved are saved — see omitted_vendors."New value: +"True when the vendor list was saved on this call. Only the vendors that resolved are saved — see omitted_vendors. Always false on a deployment that does not authenticate callers, which saves no stacks (persistence_notice says so)." - changed
Output schema / properties / summary / properties / total / descriptionPrevious value: -"Total vendors in the stack."New value: +"Total vendors checked on this call — never counts deferred_vendors." - changed
Output schema / properties / vendors / descriptionPrevious value: -"Per-vendor status results."New value: +"Per-vendor status results for the vendors checked, in stack order." - changed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / latest_update / descriptionPrevious value: -"Most recent incident_update body text."New value: +"Most recent update text, as plain text: HTML markup the vendor published is converted, and any other < is text the vendor wrote." - changed
Output schema / properties / vendors / items / properties / all_components / descriptionPrevious value: -"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only."New value: +"Components including operational ones, capped at component_limit per vendor and narrowed by component_filter (matched against name and group) when given. Present in detailed mode only." - added
Output schema / properties / vendors / items / properties / all_components / items / properties / groupAdded value: +{ + "description": "Name of the group the status page files this component under — typically the product or region it belongs to — or null when it is not in a group.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / vendors / items / properties / all_components / items / properties / name / descriptionPrevious value: -"Component name."New value: +"Component name as the status page publishes it — the leaf alone, without its group. Several leaves can share a name (one per region or product); group tells them apart." - changed
Output schema / properties / vendors / items / properties / all_components / items / requiredPrevious value: -[ - "name", - "status", - "description" -]New value: +[ + "name", + "group", + "status", + "description" +] - added
Output schema / properties / vendors / items / properties / degraded_components / items / properties / groupAdded value: +{ + "description": "Name of the group the status page files this component under — typically the product or region it belongs to — or null when it is not in a group.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / vendors / items / properties / degraded_components / items / properties / name / descriptionPrevious value: -"Component name."New value: +"Component name as the status page publishes it — the leaf alone, without its group. Several leaves can share a name (one per region or product); group tells them apart." - changed
Output schema / properties / vendors / items / properties / degraded_components / items / requiredPrevious value: -[ - "name", - "status" -]New value: +[ + "name", + "group", + "status" +]
4 tool updates
- Changed
devops_get_incidents16 fields changed- changed
Input schema / properties / filter / descriptionPrevious 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." - added
Input schema / properties / sinceAdded 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." +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "vendor_not_found", - "target_blocked", - "statuspage_unavailable" -]New value: +[ + "vendor_not_found", + "target_blocked", + "invalid_since", + "statuspage_unavailable" +] - changed
Output schema / properties / incidents / items / properties / created_at / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / resolved_at / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / scheduled_for / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / scheduled_until / descriptionPrevious 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." - added
Output schema / properties / incidents / items / properties / sourceAdded 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" +} - changed
Output schema / properties / incidents / items / properties / started_at / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / status / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / updates / descriptionPrevious 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)." - changed
Output schema / properties / incidents / items / properties / updates / items / properties / created_at / descriptionPrevious value: -"ISO 8601 UTC timestamp of this update."New value: +"ISO 8601 timestamp of this update, with the vendor's UTC offset." - changed
Output schema / properties / incidents / items / requiredPrevious 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" +] - changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / upstreamCeiling / descriptionPrevious 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."
- Changed
devops_list_vendors1 field changed- changed
Output schema / properties / vendors / items / properties / statuspage_url / descriptionPrevious 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)."
- Changed
devops_status_check3 fields changed- changed
Output schema / properties / results / items / properties / active_incidents / items / properties / started_at / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / scheduled_maintenances / items / properties / scheduled_for / descriptionPrevious value: -"ISO 8601 UTC start time."New value: +"ISO 8601 start time, with the vendor's UTC offset." - changed
Output schema / properties / results / items / properties / scheduled_maintenances / items / properties / scheduled_until / descriptionPrevious value: -"ISO 8601 UTC end time."New value: +"ISO 8601 end time, with the vendor's UTC offset."
- Changed
devops_watch_stack3 fields changed- changed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / descriptionPrevious 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." - changed
Output schema / properties / vendors / items / properties / scheduled_maintenances / items / properties / scheduled_for / descriptionPrevious value: -"ISO 8601 UTC start time."New value: +"ISO 8601 start time, with the vendor's UTC offset." - changed
Output schema / properties / vendors / items / properties / scheduled_maintenances / items / properties / scheduled_until / descriptionPrevious value: -"ISO 8601 UTC end time."New value: +"ISO 8601 end time, with the vendor's UTC offset."
4 tool updates
- Changed
devops_check_certs5 fields changed- changed
Output schema / properties / results / items / properties / cert / descriptionPrevious value: -"Certificate details, or null when connection failed (error status)."New value: +"Certificate details, or null when no certificate was retrieved (status \"error\")." - changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / flags / descriptionPrevious 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\"." - changed
Output schema / properties / results / items / properties / status / descriptionPrevious 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\"." - changed
Output schema / properties / results / items / properties / tls / descriptionPrevious value: -"TLS session details, or null when connection failed."New value: +"TLS session details, or null when no TLS handshake completed."
- Changed
devops_check_dns4 fields changed- changed
Input schema / properties / record_types / descriptionPrevious 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." - changed
Input schema / properties / resolvers / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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\"." - changed
Output schema / properties / results / items / properties / flags / descriptionPrevious 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\"."
- Changed
devops_status_check2 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "results", - "summary" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "summary", + "nextToolSuggestions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / nextToolSuggestionsAdded 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" +}
- Changed
devops_watch_stack2 fields changed- changed
Output schema / anyOfPrevious 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" + ] + } +] - added
Output schema / properties / nextToolSuggestionsAdded 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" +}
6 tool updates
- Changed
devops_check_certs3 fields changed- changed
Output schema / properties / results / items / properties / cert / anyOfPrevious 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" + } +] - removed
Output schema / properties / results / items / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / error / typeAdded value: +[ + "string", + "null" +]
- Changed
devops_check_dns6 fields changed- removed
Output schema / properties / results / items / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / error / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / records_source / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / records_source / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / resolver_results / items / properties / error / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / resolver_results / items / properties / error / typeAdded value: +[ + "string", + "null" +]
- Changed
devops_get_incidents12 fields changed- removed
Output schema / properties / incidents / items / properties / duration_minutes / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / duration_minutes / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / incidents / items / properties / resolved_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / resolved_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / incidents / items / properties / scheduled_for / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / scheduled_for / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / incidents / items / properties / scheduled_until / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / scheduled_until / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / incidents / items / properties / shortlink / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / shortlink / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / incidents / items / properties / started_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / incidents / items / properties / started_at / typeAdded value: +[ + "string", + "null" +]
- Changed
devops_status_check4 fields changed- removed
Output schema / properties / results / items / properties / active_incidents / items / properties / started_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / active_incidents / items / properties / started_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / results / items / properties / all_components / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / results / items / properties / all_components / items / properties / description / typeAdded value: +[ + "string", + "null" +]
- Changed
devops_suggest_action4 fields changed- removed
Output schema / properties / diagnostics_summary / properties / incident_snippet / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / diagnostics_summary / properties / incident_snippet / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / vendor_category / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / vendor_category / typeAdded value: +[ + "string", + "null" +]
- Changed
devops_watch_stack4 fields changed- removed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / vendors / items / properties / active_incidents / items / properties / started_at / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / vendors / items / properties / all_components / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / vendors / items / properties / all_components / items / properties / description / typeAdded value: +[ + "string", + "null" +]
7 tool updates
- Changed
devops_check_certs6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results" -]
- Changed
devops_check_dns6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results" -]
- Changed
devops_get_incidents6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "vendor", + "name", + "incidents", + "total_returned", + "statuspage_url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "vendor", - "name", - "incidents", - "total_returned", - "statuspage_url" -]
- Changed
devops_list_vendors6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "vendors", + "total", + "categories" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "vendors", - "total", - "categories" -]
- Changed
devops_status_check6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "results", + "summary" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "results", - "summary" -]
- Changed
devops_suggest_action6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "vendor", + "vendor_category", + "guidance", + "diagnostics_summary", + "nextToolSuggestions" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "vendor", - "vendor_category", - "guidance", - "diagnostics_summary", - "nextToolSuggestions" -]
- Changed
devops_watch_stack10 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / stack_name / descriptionPrevious 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." - added
Input schema / properties / stack_name / maxLengthAdded value: +64 - added
Input schema / properties / stack_name / minLengthAdded value: +1 - added
Input schema / properties / stack_name / patternAdded value: +"^[a-zA-Z0-9_-]+([./][a-zA-Z0-9_-]+)*$" - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stack_name", + "health", + "summary", + "vendors", + "stack_persisted", + "omitted_vendors", + "checked_at" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "stack_name", - "health", - "summary", - "vendors", - "stack_persisted", - "omitted_vendors", - "checked_at" -]
5 tool updates
- Changed
devops_check_dns4 fields changed- changed
Output schema / properties / results / items / properties / records / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / resolver_results / items / properties / records / descriptionPrevious 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." - added
Output schema / properties / results / items / properties / resolver_results / items / properties / records_same_as_domainAdded 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" +} - changed
Output schema / properties / results / items / properties / resolver_results / items / requiredPrevious 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" +]
- Changed
devops_get_incidents1 field changed- changed
Output schema / properties / notice / descriptionPrevious 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."
- Changed
devops_status_check6 fields changed- changed
Output schema / properties / results / items / properties / degraded_components / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / indicator / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / indicator / enumPrevious value: -[ - "none", - "minor", - "major", - "critical" -]New value: +[ + "none", + "minor", + "major", + "critical", + "maintenance" +] - changed
Output schema / properties / summary / descriptionPrevious 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." - added
Output schema / properties / summary / properties / maintenanceAdded value: +{ + "description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.", + "type": "number" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "total", - "operational", - "degraded", - "down", - "unavailable" -]New value: +[ + "total", + "operational", + "degraded", + "down", + "maintenance", + "unavailable" +]
- Changed
devops_suggest_action2 fields changed- changed
Input schema / properties / vendor_indicator / enumPrevious value: -[ - "none", - "minor", - "major", - "critical" -]New value: +[ + "none", + "minor", + "major", + "critical", + "maintenance" +] - changed
Output schema / properties / diagnostics_summary / properties / vendor_indicator / anyOfPrevious value: -[ - { - "enum": [ - "none", - "minor", - "major", - "critical" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "none", + "minor", + "major", + "critical", + "maintenance" + ], + "type": "string" + }, + { + "type": "null" + } +]
- Changed
devops_watch_stack8 fields changed- changed
Output schema / properties / health / descriptionPrevious 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." - changed
Output schema / properties / health / enumPrevious value: -[ - "all_operational", - "degraded", - "partial_outage", - "major_outage", - "unknown" -]New value: +[ + "all_operational", + "maintenance", + "degraded", + "partial_outage", + "major_outage", + "unknown" +] - changed
Output schema / properties / summary / descriptionPrevious 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." - added
Output schema / properties / summary / properties / maintenanceAdded value: +{ + "description": "Vendors with indicator = maintenance — in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.", + "type": "number" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "total", - "operational", - "degraded", - "down", - "unavailable" -]New value: +[ + "total", + "operational", + "degraded", + "down", + "maintenance", + "unavailable" +] - changed
Output schema / properties / vendors / items / properties / degraded_components / descriptionPrevious 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." - changed
Output schema / properties / vendors / items / properties / indicator / descriptionPrevious 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." - changed
Output schema / properties / vendors / items / properties / indicator / enumPrevious value: -[ - "none", - "minor", - "major", - "critical" -]New value: +[ + "none", + "minor", + "major", + "critical", + "maintenance" +]
2 tool updates
- Changed
devops_get_incidents1 field changed- changed
Input schema / properties / filter / descriptionPrevious 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."
- Changed
devops_list_vendors1 field changed- changed
Output schema / properties / vendors / items / properties / statuspage_url / descriptionPrevious 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)."
5 tool updates
- Changed
devops_check_certs3 fields changed- changed
Output schema / properties / results / items / properties / cert / anyOfPrevious 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" + } +] - changed
Output schema / properties / results / items / properties / flags / descriptionPrevious 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\"." - changed
Output schema / properties / results / items / properties / status / descriptionPrevious 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."
- Changed
devops_check_dns17 fields changed- changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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\"." - changed
Output schema / properties / results / items / properties / flags / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / propagation_discrepancies / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / propagation_discrepancies / items / descriptionPrevious value: -"A record type where resolvers returned different values."New value: +"A record type where resolvers returned different answers." - added
Output schema / properties / results / items / properties / propagation_discrepancies / items / properties / kindAdded 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" +} - changed
Output schema / properties / results / items / properties / propagation_discrepancies / items / properties / record_type / descriptionPrevious value: -"The DNS record type with differing values."New value: +"The DNS record type resolvers disagreed on." - changed
Output schema / properties / results / items / properties / propagation_discrepancies / items / properties / resolvers_agree / descriptionPrevious value: -"False when resolvers returned different values."New value: +"Always false — an entry only exists when resolvers disagreed." - added
Output schema / properties / results / items / properties / propagation_discrepancies / items / properties / status_by_resolverAdded 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" +} - changed
Output schema / properties / results / items / properties / propagation_discrepancies / items / properties / values_by_resolver / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / propagation_discrepancies / items / requiredPrevious value: -[ - "record_type", - "resolvers_agree", - "values_by_resolver" -]New value: +[ + "record_type", + "resolvers_agree", + "kind", + "values_by_resolver", + "status_by_resolver" +] - changed
Output schema / properties / results / items / properties / records / descriptionPrevious 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." - added
Output schema / properties / results / items / properties / records_sourceAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Resolver IP whose answers populated \"records\", or null when no resolver was queried." +} - changed
Output schema / properties / results / items / properties / resolver_results / items / properties / error / descriptionPrevious 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." - added
Output schema / properties / results / items / properties / resolver_results / items / properties / statusAdded 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" +} - added
Output schema / properties / results / items / properties / resolver_results / items / properties / status_by_typeAdded 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" +} - changed
Output schema / properties / results / items / properties / resolver_results / items / requiredPrevious value: -[ - "resolver", - "latency_ms", - "records", - "error" -]New value: +[ + "resolver", + "latency_ms", + "records", + "status", + "status_by_type", + "error" +] - changed
Output schema / properties / results / items / requiredPrevious value: -[ - "domain", - "records", - "resolver_results", - "propagation_discrepancies", - "flags", - "error" -]New value: +[ + "domain", + "records", + "records_source", + "resolver_results", + "propagation_discrepancies", + "flags", + "error" +]
- Changed
devops_get_incidents5 fields changed- changed
Input schema / properties / filter / descriptionPrevious 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." - changed
Input schema / properties / offset / descriptionPrevious 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." - added
Output schema / properties / nextOffsetAdded 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" +} - added
Output schema / properties / noticeAdded 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" +} - added
Output schema / properties / upstreamCeilingAdded 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" +}
- Changed
devops_status_check1 field changed- added
Output schema / properties / noticeAdded 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" +}
- Changed
devops_watch_stack1 field changed- added
Output schema / properties / noticeAdded 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" +}
2 tool updates
- Changed
devops_status_check13 fields changed- added
Input schema / properties / component_filterAdded 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" +} - added
Input schema / properties / component_limitAdded 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" +} - changed
Input schema / properties / mode / descriptionPrevious 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." - added
Output schema / properties / capAdded value: +{ + "description": "The per-vendor component_limit that was applied. Present only when truncated.", + "type": "number" +} - changed
Output schema / properties / results / items / properties / all_components / descriptionPrevious 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." - added
Output schema / properties / results / items / properties / all_components_totalAdded 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" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Components returned across all vendors. Present only when truncated.", + "type": "number" +} - changed
Output schema / properties / summary / descriptionPrevious 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." - changed
Output schema / properties / summary / properties / operational / descriptionPrevious value: -"Vendors with indicator = none."New value: +"Vendors with indicator = none and no error." - added
Output schema / properties / summary / properties / unavailableAdded 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" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "total", - "operational", - "degraded", - "down" -]New value: +[ + "total", + "operational", + "degraded", + "down", + "unavailable" +] - added
Output schema / properties / totalCountAdded value: +{ + "description": "Components matching component_filter across all vendors before the cap. Present only when truncated.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.", + "type": "boolean" +}
- Changed
devops_watch_stack15 fields changed- added
Input schema / properties / component_filterAdded 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" +} - added
Input schema / properties / component_limitAdded 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" +} - changed
Input schema / properties / mode / descriptionPrevious 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." - added
Output schema / properties / capAdded value: +{ + "description": "The per-vendor component_limit that was applied. Present only when truncated.", + "type": "number" +} - changed
Output schema / properties / health / descriptionPrevious 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." - added
Output schema / properties / omitted_vendorsAdded 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" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Components returned across the stack. Present only when truncated.", + "type": "number" +} - changed
Output schema / properties / stack_persisted / descriptionPrevious 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." - changed
Output schema / properties / summary / properties / operational / descriptionPrevious value: -"Vendors with indicator = none and no fetch error."New value: +"Vendors with indicator = none and no error." - changed
Output schema / properties / summary / properties / unavailable / descriptionPrevious 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." - added
Output schema / properties / totalCountAdded value: +{ + "description": "Components matching component_filter across the stack before the cap. Present only when truncated.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped.", + "type": "boolean" +} - changed
Output schema / properties / vendors / items / properties / all_components / descriptionPrevious 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." - added
Output schema / properties / vendors / items / properties / all_components_totalAdded 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" +} - changed
Output schema / requiredPrevious value: -[ - "stack_name", - "health", - "summary", - "vendors", - "stack_persisted", - "checked_at" -]New value: +[ + "stack_name", + "health", + "summary", + "vendors", + "stack_persisted", + "omitted_vendors", + "checked_at" +]
3 tool updates
- Changed
devops_check_dns2 fields changed- changed
Input schema / properties / resolvers / descriptionPrevious 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." - changed
Input schema / properties / resolvers / items / descriptionPrevious 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."
- Changed
devops_status_check3 fields changed- changed
Output schema / properties / results / items / properties / active_incidents / items / properties / impact / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / active_incidents / items / properties / impact / enumPrevious value: -[ - "none", - "minor", - "major", - "critical" -]New value: +[ + "none", + "minor", + "major", + "critical", + "maintenance" +] - changed
Output schema / properties / results / items / properties / error / descriptionPrevious 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."
- Changed
devops_watch_stack3 fields changed- changed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / impact / descriptionPrevious 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." - changed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / impact / enumPrevious value: -[ - "none", - "minor", - "major", - "critical" -]New value: +[ + "none", + "minor", + "major", + "critical", + "maintenance" +] - changed
Output schema / properties / vendors / items / properties / error / descriptionPrevious 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."
1 tool update
- Changed
devops_get_incidents3 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated.", + "type": "number" +}
1 tool update
- Changed
devops_check_certs2 fields changed- added
Input schema / properties / domains / items / minLengthAdded value: +1 - removed
Input schema / properties / domains / items / patternRemoved 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])?)*$"
1 tool update
- Changed
devops_suggest_action1 field changed- changed
Output schema / properties / diagnostics_summary / properties / incident_snippet / descriptionPrevious 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."
1 tool update
- Changed
devops_watch_stack6 fields changed- changed
Output schema / properties / health / descriptionPrevious 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." - changed
Output schema / properties / health / enumPrevious value: -[ - "all_operational", - "degraded", - "partial_outage", - "major_outage" -]New value: +[ + "all_operational", + "degraded", + "partial_outage", + "major_outage", + "unknown" +] - changed
Output schema / properties / summary / descriptionPrevious 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." - changed
Output schema / properties / summary / properties / operational / descriptionPrevious value: -"Vendors with indicator = none."New value: +"Vendors with indicator = none and no fetch error." - added
Output schema / properties / summary / properties / unavailableAdded value: +{ + "description": "Vendors whose status could not be fetched (carry an error). Counted as unknown — never operational.", + "type": "number" +} - changed
Output schema / properties / summary / requiredPrevious value: -[ - "total", - "operational", - "degraded", - "down" -]New value: +[ + "total", + "operational", + "degraded", + "down", + "unavailable" +]
6 tool updates
- Changed
devops_check_certs1 field changed- changed
Input schema / properties / timeout_ms / descriptionPrevious 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."
- Changed
devops_check_dns1 field changed- changed
Input schema / properties / timeout_ms / descriptionPrevious 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)."
- Changed
devops_get_incidents4 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / vendor / descriptionPrevious 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." - changed
Output schema / properties / incidents / items / properties / id / descriptionPrevious value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API." - changed
Output schema / properties / statuspage_url / descriptionPrevious value: -"Statuspage base URL used."New value: +"Status page base URL used."
- Changed
devops_list_vendors1 field changed- changed
Output schema / properties / vendors / items / properties / statuspage_url / descriptionPrevious 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)."
- Changed
devops_status_check4 fields changed- changed
Input schema / properties / vendors / descriptionPrevious 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." - changed
Input schema / properties / vendors / items / descriptionPrevious 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." - changed
Output schema / properties / results / items / properties / active_incidents / items / properties / id / descriptionPrevious value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API." - changed
Output schema / properties / results / items / properties / statuspage_url / descriptionPrevious value: -"Statuspage base URL used for this vendor."New value: +"Status page base URL used for this vendor."
- Changed
devops_watch_stack4 fields changed- changed
Input schema / properties / vendors / descriptionPrevious 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." - changed
Input schema / properties / vendors / items / descriptionPrevious 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." - changed
Output schema / properties / vendors / items / properties / active_incidents / items / properties / id / descriptionPrevious value: -"Unique incident identifier from Statuspage."New value: +"Unique incident identifier from the vendor's status API." - changed
Output schema / properties / vendors / items / properties / statuspage_url / descriptionPrevious value: -"Statuspage base URL used for this vendor."New value: +"Status page base URL used for this vendor."
2 tool updates
- Changed
devops_get_incidents5 fields changed- changed
Output schema / properties / cap / descriptionPrevious value: -"The limit that was applied."New value: +"The limit that was applied. Present only when truncated." - changed
Output schema / properties / incidents / items / properties / duration_minutes / descriptionPrevious 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." - changed
Output schema / properties / shown / descriptionPrevious value: -"Number of incidents returned after applying the limit."New value: +"Number of incidents returned after applying the limit. Present only when truncated." - changed
Output schema / properties / truncated / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "vendor", - "name", - "incidents", - "total_returned", - "statuspage_url", - "truncated", - "shown", - "cap" -]New value: +[ + "vendor", + "name", + "incidents", + "total_returned", + "statuspage_url" +]
- Changed
devops_suggest_action4 fields changed- added
Input schema / properties / vendor_indicatorAdded 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" +} - changed
Output schema / properties / diagnostics_summary / properties / vendor_indicator / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "none", + "minor", + "major", + "critical" + ], + "type": "string" + }, + { + "type": "null" + } +] - changed
Output schema / properties / diagnostics_summary / properties / vendor_indicator / descriptionPrevious 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." - changed
Output schema / properties / guidance / descriptionPrevious 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."
Related MCP Connectors
Live cloud/SaaS outages, provider reliability and exploited CVEs from official status pages and CISA
Monitors TLS/SSL certificate expiry, DNS resolution, and TCP port status for AI agents.
Dependency releases, TLS and domain expiry, and vendor status pages from one endpoint.
Outside-in DNS, email security, SEO, GEO and app-link checks plus developer utilities.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides 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
- AlicenseAqualityCmaintenanceProvides 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.843 npm22Apache 2.0

StackWitnessofficial
FlicenseNot gradedqualityDmaintenanceLet agents read and manage your org’s independent monitors, incidents, status pages, and alerts (honest measured state, no false greens).-- AlicenseAqualityCmaintenanceWebsite monitoring for AI assistants. Visual Sentinel catches pages that look broken even when the site is up. DNS, SSL, speed and website checks need no account; monitors, incidents and alerts need an API key (Business and Agency plans).167 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.