このMCPでできること
Checks vendor service health, incidents, maintenance, DNS resolution, TLS certificates, and infrastructure dependency stacks, with incident-response guidance.
ツール
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['domains'], 'properties': {'port': {'type': 'integer', 'default': 443, 'maximum': 65535, 'minimum': 1, 'description': 'TLS port. Defaults to 443. Use 8443 or custom ports for non-standard HTTPS endpoints.'}, 'domains': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'Domain name without protocol (e.g., "api.github.com", "example.com").'}, 'maxItems': 10, 'minItems': 1, 'description': 'Domains to inspect. Do not include "https://" â\x80\x94 pass the bare hostname. Up to 10 per call.'}, 'timeout_ms': {'type': 'integer', 'default': 5000, 'maximum': 15000, 'minimum': 1000, 'description': 'Connection timeout per domain in milliseconds. Defaults to the DEVOPS_STATUS_CERT_TIMEOUT_MS env var (5000 when unset). Increase for slow or geographically distant endpoints.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_domain'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['domain', 'port', 'status', 'flags', 'cert', 'tls', 'checked_at', 'error'], 'properties': {'tls': {'anyOf': [{'type': 'object', 'required': ['protocol', 'cipher'], 'properties': {'cipher': {'type': 'string', 'description': 'Negotiated cipher suite name.'}, 'protocol': {'type': 'string', 'description': 'Negotiated TLS version, e.g., "TLSv1.3".'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'TLS session details, or null when no TLS handshake completed.'}, 'cert': {'anyOf': [{'type': 'object', 'required': ['subject', 'san', 'issuer', 'valid_from', 'valid_until', 'days_until_expiry', 'chain_depth', 'chain_depth_unavailable_reason', 'hostname_verification_error', 'authorization_error', 'serial'], 'properties': {'san': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Subject Alternative Names covered by this certificate.'}, 'issuer': {'type': 'string', 'description': 'Issuer common name.'}, 'serial': {'type': 'string', 'description': 'Certificate serial number.'}, 'subject': {'type': 'string', 'description': 'Certificate subject CN.'}, 'valid_from': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of certificate validity start.'}, 'chain_depth': {'anyOf': [{'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, {'type': 'null'}], 'description': 'Number of certificates the server sent, counting the leaf. Null when the runtime does not expose the issuer chain â\x80\x94 read "chain_depth_unavailable_reason" in that case. Not a self-signed indicator: use "authorization_error" for that.'}, 'valid_until': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of certificate expiry.'}, 'days_until_expiry': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Days remaining until certificate expiry. Negative = already expired.'}, 'authorization_error': {'type': ['string', '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 â\x80\x94 the issuer and subject fields alone cannot detect an untrusted root.'}, 'hostname_verification_error': {'type': ['string', '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: â\x80¦"), 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.'}, 'chain_depth_unavailable_reason': {'type': ['string', '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.'}}, 'additionalProperties': False}, {'type': 'null'}], 'description': 'Certificate details, or null when no certificate was retrieved (status "error").'}, 'port': {'type': 'number', 'description': 'The port used for the TLS connection.'}, 'error': {'type': ['string', 'null'], 'description': 'Why status is "error". Either no handshake completed â\x80\x94 the domain was rejected as a private, loopback, or cloud-metadata target, a connection failure such as "getaddrinfo ENOTFOUND â\x80¦", or "Timed out after 5000ms" â\x80\x94 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.'}, 'flags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Human-readable findings about the certificate and TLS session that were read: "Expires in 12 days (warning)", "Certificate expired 40 days ago", "Hostname mismatch â\x80\x94 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) â\x80\x94 the reason is in "error" only. A handshake that completed without a certificate keeps its TLS-session findings here alongside "error".'}, 'domain': {'type': 'string', 'description': 'The domain that was inspected.'}, 'status': {'enum': ['ok', 'warning', 'critical', 'error'], 'type': 'string', 'description': 'Overall status. "critical" â\x80\x94 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" â\x80\x94 expires in < 30 days. "ok" â\x80\x94 none of the above. "error" â\x80\x94 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".'}, 'checked_at': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of this check.'}}, 'description': 'Certificate inspection result for one domain.', 'additionalProperties': False}, 'description': 'Per-domain certificate inspection results.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['domains'], 'properties': {'domains': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'A domain name to query (e.g., "github.com", "api.example.com").'}, 'maxItems': 10, 'minItems': 1, 'description': 'Domain names to query. Up to 10 per call.'}, 'resolvers': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'A resolver IP literal â\x80\x94 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.'}, 'default': ['8.8.8.8', '1.1.1.1', '9.9.9.9'], 'description': 'Resolver IP addresses to query. Defaults to Google (8.8.8.8), Cloudflare (1.1.1.1), and Quad9 (9.9.9.9). An empty array uses the same defaults. Add custom resolvers to test resolver-specific behavior. Each must be an IP literal, not a hostname; resolvers in private, loopback, or cloud-metadata ranges are rejected unless DEVOPS_STATUS_ALLOW_PRIVATE_TARGETS=true.'}, 'timeout_ms': {'type': 'integer', 'default': 3000, 'maximum': 10000, 'minimum': 1000, 'description': 'Query timeout per domain+resolver combination in milliseconds. Defaults to the DEVOPS_STATUS_DNS_TIMEOUT_MS env var (3000 when unset).'}, 'record_types': {'type': 'array', 'items': {'enum': ['A', 'AAAA', 'CNAME', 'MX', 'TXT', 'NS'], 'type': 'string'}, 'default': ['A', 'AAAA', 'MX', 'TXT'], 'description': '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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['invalid_domain', 'target_blocked'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['domain', 'records', 'records_source', 'resolver_results', 'propagation_discrepancies', 'flags', 'error'], 'properties': {'error': {'type': ['string', 'null'], 'description': '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".'}, 'flags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Human-readable observations that need attention: "NXDOMAIN from 8.8.8.8, 1.1.1.1 on A, MX â\x80\x94 the domain does not exist â\x80¦", "Partial resolution on A records â\x80\x94 9.9.9.9 (nodata) returned nothing while 8.8.8.8 answered", "No MX records found", "CNAME detected â\x80\x94 further records resolve via the CNAME target". A value_variation disagreement is not flagged here â\x80\x94 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".'}, 'domain': {'type': 'string', 'description': 'The domain that was queried.'}, 'records': {'type': 'object', 'description': 'Resolved records from a single resolver, keyed by record type (A, AAAA, CNAME, MX, TXT, NS). Taken from the primary resolver (first in "resolvers"), or from the first resolver that returned records when the primary returned none. Read "records_source" for which resolver these came from, and "resolver_results" for the full per-resolver picture. This is also the reference set the per-resolver answers are reported against: a resolver that returned exactly these values for a type names it in "records_same_as_domain" rather than repeating them.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'array', 'items': {'type': 'string'}}}, 'records_source': {'type': ['string', 'null'], 'description': 'Resolver IP whose answers populated "records", or null when no resolver was queried.'}, 'resolver_results': {'type': 'array', 'items': {'type': 'object', 'required': ['resolver', 'latency_ms', 'records', 'records_same_as_domain', 'status', 'status_by_type', 'error'], 'properties': {'error': {'type': ['string', 'null'], 'description': 'Failure summary for this resolver in the form "SERVFAIL on A, MX", or null when every requested type either resolved or returned nodata. Nodata is never reported as an error â\x80\x94 it is a valid DNS answer.'}, 'status': {'enum': ['ok', 'nodata', 'nxdomain', 'servfail', 'refused', 'timeout', 'error'], 'type': 'string', '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 â\x80\x94 in that order). Read "status_by_type" for the per-record-type detail.'}, 'records': {'type': 'object', 'description': 'Records returned by this resolver, keyed by type â\x80\x94 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.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'array', 'items': {'type': 'string'}}}, 'resolver': {'type': 'string', 'description': 'Resolver IP address used.'}, 'latency_ms': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Round-trip resolution latency in milliseconds.'}, 'status_by_type': {'type': 'object', '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'}, 'additionalProperties': {'enum': ['ok', 'nodata', 'nxdomain', 'servfail', 'refused', 'timeout', 'error'], 'type': 'string'}}, 'records_same_as_domain': {'type': 'array', 'items': {'type': 'string', 'description': 'A record type answered exactly as the domain-level set.'}, 'description': 'Record types this resolver answered with exactly the domain-level "records" values, omitted from "records" above rather than duplicated. Read their values from the domain-level set. Resolvers agreeing is the common case, so this list is usually where most of the answer is.'}}, 'description': 'DNS resolution result from one resolver.', 'additionalProperties': False}, 'description': 'Per-resolver breakdown for propagation analysis.'}, 'propagation_discrepancies': {'type': 'array', 'items': {'type': 'object', 'required': ['record_type', 'resolvers_agree', 'kind', 'values_by_resolver', 'status_by_resolver'], 'properties': {'kind': {'enum': ['value_variation', 'partial_resolution'], 'type': 'string', '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) â\x80\x94 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.'}, 'record_type': {'type': 'string', 'description': 'The DNS record type resolvers disagreed on.'}, 'resolvers_agree': {'type': 'boolean', 'description': 'Always false â\x80\x94 an entry only exists when resolvers disagreed.'}, 'status_by_resolver': {'type': 'object', 'description': 'Outcome for this record type per resolver IP address â\x80\x94 explains an empty entry in "values_by_resolver" as nodata, nxdomain, servfail, timeout, refused, or error.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'enum': ['ok', 'nodata', 'nxdomain', 'servfail', 'refused', 'timeout', 'error'], 'type': 'string'}}, 'values_by_resolver': {'type': 'object', 'description': 'Values reported per resolver IP address. An empty array means that resolver returned no records of this type.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'array', 'items': {'type': 'string'}}}}, 'description': 'A record type where resolvers returned different answers.', 'additionalProperties': False}, 'description': 'Record types where resolvers returned different answers, each labelled by "kind". Empty when all resolvers agree.'}}, 'description': 'DNS resolution result for one domain.', 'additionalProperties': False}, 'description': 'Per-domain DNS resolution results.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['vendor'], 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Maximum incidents to return per call (1â\x80\x9350). Page through longer history with offset rather than raising this.'}, 'since': {'anyOf': [{'type': 'string', 'const': ''}, {'type': 'string', '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])))$', 'description': 'Earliest start date to include, as YYYY-MM-DD (UTC), e.g. "2025-10-01".'}], '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.'}, 'filter': {'enum': ['all', 'active', 'resolved', 'scheduled'], 'type': 'string', 'default': 'all', 'description': 'all: incidents plus scheduled maintenances. active: only incidents with status investigating/identified/monitoring. resolved: only fully resolved incidents. scheduled: only scheduled maintenance windows. Not every vendor backend serves every filter â\x80\x94 "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.'}, 'offset': {'type': 'integer', 'default': 0, 'maximum': 9007199254740991, 'minimum': 0, 'description': 'Number of matching incidents to skip before applying limit, for paging through history. 0 (default) returns the most recent page; a truncated result returns the value to use next in the nextOffset field. Raising offset past the number of matches returns an empty list and says so.'}, 'vendor': {'type': 'string', 'minLength': 1, 'description': 'Vendor slug (e.g., "github", "aws") or raw Atlassian Statuspage base URL. Use devops_list_vendors to find slugs.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['vendor', 'name', 'incidents', 'total_returned', 'statuspage_url']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The limit that was applied. Present only when truncated.'}, 'name': {'type': 'string', 'description': 'Display name of the vendor.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['vendor_not_found', 'target_blocked', 'invalid_since', 'statuspage_unavailable'], '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. `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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Number of incidents returned after applying the limit. Present only when truncated.'}, 'notice': {'type': 'string', 'description': 'Plain-language explanation of this result â\x80\x94 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.'}, 'vendor': {'type': 'string', 'description': 'Vendor slug or URL as provided.'}, 'incidents': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'impact', 'status', 'created_at', 'resolved_at', 'scheduled_for', 'scheduled_until', 'duration_minutes', 'affected_components', 'updates', 'source'], 'properties': {'id': {'type': 'string', 'description': "Unique incident identifier from the vendor's status API."}, 'name': {'type': 'string', 'description': 'Incident title.'}, 'impact': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', 'description': 'Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window.'}, 'source': {'enum': ['api', 'history'], 'type': 'string', '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 â\x80\x94 title, impact, start and end times, and the final update message, with no components and no started_at, scheduled window, or duration."}, 'status': {'type': 'string', 'description': '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.'}, 'updates': {'type': 'array', 'items': {'type': 'object', 'required': ['status', 'body', 'created_at'], 'properties': {'body': {'type': 'string', 'description': 'Update text from the vendor.'}, 'status': {'type': 'string', 'description': 'Incident status at the time of this update.'}, 'created_at': {'type': 'string', 'description': "ISO 8601 timestamp of this update, with the vendor's UTC offset."}}, 'description': 'A single status update from the vendor.', 'additionalProperties': False}, 'description': '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).'}, 'shortlink': {'type': ['string', 'null'], 'description': 'Direct URL to the incident page, or null/absent if not provided by the vendor.'}, 'created_at': {'type': 'string', 'description': '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.'}, 'started_at': {'type': ['string', 'null'], 'description': "ISO 8601 timestamp, with the vendor's UTC offset, when the incident started, or null/absent if not set by the vendor."}, 'resolved_at': {'type': ['string', 'null'], 'description': "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."}, 'scheduled_for': {'type': ['string', 'null'], 'description': "Present for scheduled maintenances â\x80\x94 ISO 8601 start time with the vendor's UTC offset."}, 'scheduled_until': {'type': ['string', 'null'], 'description': "Present for scheduled maintenances â\x80\x94 ISO 8601 end time with the vendor's UTC offset."}, 'duration_minutes': {'type': ['number', 'null'], 'description': 'Minutes from started_at to resolved_at. Null for active or scheduled incidents, or when the vendor-authored timestamps are missing, invalid, or inverted.'}, 'affected_components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component names affected by this incident.'}}, 'description': 'An incident or scheduled maintenance entry.', 'additionalProperties': False}, 'description': 'Matching incidents.'}, 'truncated': {'type': 'boolean', 'description': 'True when more incidents matched than the limit returned. Absent when the result was not capped.'}, 'nextOffset': {'type': 'number', '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 â\x80\x94 its absence means this page reached the end of what the filter matched.'}, 'totalCount': {'type': 'number', 'description': 'Total incidents matching the filter, across all pages, before offset/limit windowing. Present only when the result was truncated.'}, 'statuspage_url': {'type': 'string', 'description': 'Status page base URL used.'}, 'total_returned': {'type': 'number', 'description': 'Number of incidents in the response.'}, 'upstreamCeiling': {'type': 'number', '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. 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."}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'query': {'type': 'string', 'description': 'Free-text search against vendor name and slug. Case-insensitive. E.g., "cloud", "auth", "slack".'}, 'category': {'enum': ['cloud', 'cdn-edge', 'dev-platform', 'data', 'comms', 'auth', 'monitoring', 'ai'], 'type': 'string', 'description': 'Filter to one category: cloud, cdn-edge, dev-platform, data, comms, auth, monitoring, or ai.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['vendors', 'total', 'categories']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'total': {'type': 'number', 'description': 'Total number of vendors returned.'}, 'vendors': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'name', 'category', 'statuspage_url'], 'properties': {'name': {'type': 'string', 'description': 'Display name of the vendor.'}, 'slug': {'type': 'string', 'description': 'Use this as the vendor identifier in other tools.'}, 'category': {'type': 'string', 'description': 'Vendor category (e.g., "dev-platform", "ai").'}, 'statuspage_url': {'type': 'string', 'description': 'Status page base URL â\x80\x94 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).'}}, 'description': 'A vendor entry from the built-in registry.', 'additionalProperties': False}, 'description': 'Matching vendors from the built-in registry.'}, 'categories': {'type': 'array', 'items': {'type': 'string'}, 'description': 'All available category values for use in the category filter.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['vendors'], 'properties': {'mode': {'enum': ['summary', 'detailed'], 'type': 'string', 'default': 'summary', 'description': 'summary: indicator + degraded components + active incidents only. detailed: adds the component list and scheduled maintenance windows.'}, 'vendors': {'type': 'array', 'items': {'type': 'string', 'minLength': 1, 'description': 'A vendor slug (e.g., "github") or raw Atlassian Statuspage base URL.'}, 'maxItems': 20, 'minItems': 1, 'description': 'Vendor slugs from the built-in registry (e.g., "github", "aws") or raw Atlassian Statuspage base URLs (non-Statuspage backends are supported via registry slugs only). Mix freely. Use devops_list_vendors to discover available slugs.'}, 'component_limit': {'type': 'integer', 'default': 50, 'maximum': 500, 'minimum': 1, '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.'}, 'component_filter': {'type': 'string', '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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['results', 'summary', 'nextToolSuggestions']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per-vendor component_limit that was applied. Present only when truncated.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['vendor_not_found', 'target_blocked'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Components returned across all vendors. Present only when truncated.'}, 'notice': {'type': 'string', 'description': 'Plain-language explanation of the capped component lists â\x80\x94 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.'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['vendor', 'name', 'indicator', 'description', 'degraded_components', 'active_incidents', 'cached', 'checked_at', 'statuspage_url'], 'properties': {'name': {'type': 'string', 'description': 'Display name of the vendor.'}, 'error': {'type': 'string', 'description': 'Why this vendor could not be checked â\x80\x94 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.'}, 'cached': {'type': 'boolean', 'description': 'True when this result was served from the 60s in-memory cache.'}, 'vendor': {'type': 'string', 'description': 'Vendor slug or URL as provided.'}, 'indicator': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', 'description': 'Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage, maintenance = scheduled window in progress, planned rather than a fault.'}, 'checked_at': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of this check.'}, 'description': {'type': 'string', 'description': 'Human-readable status description (e.g., "All Systems Operational").'}, 'all_components': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'status', 'description'], 'properties': {'name': {'type': 'string', 'description': 'Component name.'}, 'status': {'type': 'string', 'description': 'Component operational status.'}, 'description': {'type': ['string', 'null'], 'description': 'Component description, or null if not provided.'}}, 'description': 'A component entry.', 'additionalProperties': False}, 'description': 'Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only.'}, 'statuspage_url': {'type': 'string', 'description': 'Status page base URL used for this vendor.'}, 'active_incidents': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'impact', 'status', 'latest_update'], 'properties': {'id': {'type': 'string', 'description': "Unique incident identifier from the vendor's status API."}, 'name': {'type': 'string', 'description': 'Incident title.'}, 'impact': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', 'description': 'Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history.'}, 'status': {'type': 'string', 'description': 'Current incident status (e.g., investigating, monitoring, resolved).'}, 'started_at': {'type': ['string', 'null'], 'description': "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."}, 'latest_update': {'type': 'string', 'description': 'Most recent incident_update body text.'}}, 'description': 'An active incident entry.', 'additionalProperties': False}, 'description': 'Active (non-resolved) incidents.'}, 'degraded_components': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'status'], 'properties': {'name': {'type': 'string', 'description': 'Component name.'}, 'status': {'enum': ['degraded_performance', 'partial_outage', 'major_outage', 'under_maintenance'], 'type': 'string', 'description': 'Degradation level: degraded_performance = slow/intermittent, partial_outage = some requests failing, major_outage = most requests failing, under_maintenance = scheduled maintenance in progress.'}}, 'description': 'A degraded component entry.', 'additionalProperties': False}, 'description': 'Every component not in an operational state, uncapped â\x80\x94 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.'}, 'all_components_total': {'type': 'number', '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.'}, 'scheduled_maintenances': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'scheduled_for', 'scheduled_until', 'status'], 'properties': {'name': {'type': 'string', 'description': 'Maintenance window name.'}, 'status': {'type': 'string', 'description': 'Maintenance status (scheduled, in_progress, completed).'}, 'scheduled_for': {'type': 'string', 'description': "ISO 8601 start time, with the vendor's UTC offset."}, 'scheduled_until': {'type': 'string', 'description': "ISO 8601 end time, with the vendor's UTC offset."}}, 'description': 'A scheduled maintenance entry.', 'additionalProperties': False}, 'description': 'Upcoming or in-progress maintenance windows. Present in detailed mode only.'}}, 'description': 'Status result for a single vendor.', 'additionalProperties': False}, 'description': 'Per-vendor status results in the same order as the input vendors list.'}, 'summary': {'type': 'object', 'required': ['total', 'operational', 'degraded', 'down', 'maintenance', 'unavailable'], 'properties': {'down': {'type': 'number', 'description': 'Vendors with indicator = critical.'}, 'total': {'type': 'number', 'description': 'Total number of vendors checked.'}, 'degraded': {'type': 'number', 'description': 'Vendors with indicator = minor or major.'}, 'maintenance': {'type': 'number', 'description': 'Vendors with indicator = maintenance â\x80\x94 in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.'}, 'operational': {'type': 'number', 'description': 'Vendors with indicator = none and no error.'}, 'unavailable': {'type': 'number', 'description': 'Vendors that could not be checked (carry an error) â\x80\x94 unresolvable slug, blocked target, or failed status fetch. Counted as unknown, never operational.'}}, 'description': 'Aggregate health counts across all checked vendors. Buckets partition the batch: operational + degraded + down + maintenance + unavailable = total.', 'additionalProperties': False}, 'truncated': {'type': 'boolean', 'description': "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped."}, 'totalCount': {'type': 'number', 'description': 'Components matching component_filter across all vendors before the cap. Present only when truncated.'}, 'nextToolSuggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['toolName', 'reason', 'args'], 'properties': {'args': {'type': 'object', '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'}, 'additionalProperties': {}}, 'reason': {'type': 'string', 'description': 'Why the vendor qualifies: its reported indicator, or the open incident behind it.'}, 'toolName': {'type': 'string', 'description': 'Tool to call next â\x80\x94 "devops_suggest_action".'}}, 'description': 'A recommended follow-up tool call with pre-filled arguments.', 'additionalProperties': False}, 'description': "One devops_suggest_action call per vendor with an active problem â\x80\x94 an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance â\x80\x94 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."}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['vendor'], 'properties': {'vendor': {'type': 'string', 'minLength': 1, 'description': 'Vendor slug or display name (e.g., "cloudflare", "github"). Used to tailor category-specific guidance (CDN outage vs. CI/CD outage vs. auth provider outage).'}, 'your_domain': {'type': 'string', 'description': 'Your own domain or service URL. When provided, nextToolSuggestions will be pre-filled with your domain for cert and DNS checks.'}, 'incident_summary': {'type': 'string', 'description': 'Latest incident description or update body from devops_get_incidents. Paste the most recent update to get more targeted advice.'}, 'vendor_indicator': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', '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.'}, 'affected_components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Component names affected (from devops_status_check degraded_components or devops_get_incidents affected_components). Used to tailor suggestions to the impacted subsystem.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['vendor', 'vendor_category', 'guidance', 'diagnostics_summary', 'nextToolSuggestions']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'description': 'Machine-readable failure mode.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'vendor': {'type': 'string', 'description': 'Vendor as provided.'}, 'guidance': {'type': 'string', 'description': 'Markdown playbook â\x80\x94 immediate steps, diagnostic checks, mitigation options, and what to monitor for resolution. Tailored to the vendor category, reported severity, and affected components.'}, 'vendor_category': {'type': ['string', 'null'], 'description': 'Detected category from registry (e.g., "cdn-edge", "auth"). Null for unrecognized vendors.'}, 'diagnostics_summary': {'type': 'object', 'required': ['vendor_indicator', 'affected_components', 'incident_snippet'], 'properties': {'incident_snippet': {'type': ['string', 'null'], 'description': 'The incident_summary input echoed in full for context, or null when not provided.'}, 'vendor_indicator': {'anyOf': [{'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string'}, {'type': 'null'}], 'description': 'Vendor status indicator echoed from the vendor_indicator input, or null when not provided.'}, 'affected_components': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Affected component names echoed from the affected_components input.'}}, 'description': 'Summary of input context used to generate the playbook.', 'additionalProperties': False}, 'nextToolSuggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['toolName', 'reason', 'args'], 'properties': {'args': {'type': 'object', 'description': 'Ready-to-use arguments for the suggested tool call.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {}}, 'reason': {'type': 'string', 'description': 'Why this step is recommended given the incident context.'}, 'toolName': {'type': 'string', 'description': 'Tool to call next (e.g., "devops_check_dns", "devops_check_certs").'}}, 'description': 'A recommended follow-up tool call with pre-filled arguments.', 'additionalProperties': False}, 'description': 'Recommended follow-up calls with arguments already populated. Execute these in sequence to gather diagnostic data.'}}, 'additionalProperties': False}
入力スキーマ
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'mode': {'enum': ['summary', 'detailed'], 'type': 'string', 'default': 'summary', 'description': 'summary: indicator + degraded components + active incidents. detailed: adds component lists and maintenance windows.'}, 'vendors': {'type': 'array', 'items': {'type': 'string', 'description': 'A vendor slug (e.g., "github") or raw Atlassian Statuspage base URL.'}, 'description': 'Vendor slugs (e.g., "github", "aws") or raw Atlassian Statuspage base URLs. When provided, saves this list as the stack. When omitted, uses the previously saved list for stack_name.'}, 'stack_name': {'type': 'string', 'default': 'default', 'pattern': '^[a-zA-Z0-9_-]+([./][a-zA-Z0-9_-]+)*$', 'maxLength': 64, 'minLength': 1, 'description': 'Name for this vendor stack. Defaults to "default". Use distinct names to manage multiple stacks (e.g., "production", "data-layer"). Letters, digits, hyphens, and underscores, optionally separated by single dots or slashes ("prod.eu", "team/prod"); 1-64 characters. No spaces or colons.'}, 'component_limit': {'type': 'integer', 'default': 50, 'maximum': 500, 'minimum': 1, '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.'}, 'component_filter': {'type': 'string', '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.'}}, 'additionalProperties': False}
出力スキーマ
{'type': 'object', 'anyOf': [{'not': {'required': ['error']}, 'required': ['stack_name', 'health', 'summary', 'vendors', 'stack_persisted', 'omitted_vendors', 'checked_at', 'nextToolSuggestions']}, {'required': ['error']}], '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'cap': {'type': 'number', 'description': 'The per-vendor component_limit that was applied. Present only when truncated.'}, 'error': {'type': 'object', 'required': ['code', 'message'], 'properties': {'code': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'JSON-RPC error code for this failure.'}, 'data': {'type': 'object', 'properties': {'reason': {'type': 'string', 'examples': ['no_stack', 'vendor_not_found', 'target_blocked'], '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.'}, 'recovery': {'type': 'object', 'required': ['hint'], 'properties': {'hint': {'type': 'string'}}, 'description': 'Actionable next step for the caller.', 'additionalProperties': {}}, 'retryable': {'type': 'boolean', 'description': 'Whether retrying may succeed.'}}, 'additionalProperties': {}}, 'message': {'type': 'string', 'description': 'Human-readable description of what went wrong.'}}, 'description': 'Present when the call failed. Absent on success.', 'additionalProperties': {}}, 'shown': {'type': 'number', 'description': 'Components returned across the stack. Present only when truncated.'}, 'health': {'enum': ['all_operational', 'maintenance', 'degraded', 'partial_outage', 'major_outage', 'unknown'], 'type': 'string', 'description': 'Aggregate health rollup: all_operational = everything clear, maintenance = at least one vendor in a scheduled window and nothing worse open, degraded = at least one minor issue, partial_outage = at least one major issue, major_outage = at least one critical outage, unknown = at least one vendor could not be checked (unresolvable entry, blocked target, or failed fetch) and no checked vendor reported a worse issue. Never all_operational when any vendor errored or is in a window.'}, 'notice': {'type': 'string', 'description': 'Plain-language explanation of the capped component lists â\x80\x94 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.'}, 'summary': {'type': 'object', 'required': ['total', 'operational', 'degraded', 'down', 'maintenance', 'unavailable'], 'properties': {'down': {'type': 'number', 'description': 'Vendors with indicator = critical.'}, 'total': {'type': 'number', 'description': 'Total vendors in the stack.'}, 'degraded': {'type': 'number', 'description': 'Vendors with indicator = minor or major.'}, 'maintenance': {'type': 'number', 'description': 'Vendors with indicator = maintenance â\x80\x94 in a scheduled window the vendor published. Counted apart from degraded and down, which are faults.'}, 'operational': {'type': 'number', 'description': 'Vendors with indicator = none and no error.'}, 'unavailable': {'type': 'number', 'description': 'Vendors that could not be checked (carry an error) â\x80\x94 unresolvable entry, blocked target, or failed status fetch. Counted as unknown, never operational.'}}, 'description': 'Aggregate health counts across all checked vendors. Buckets partition the stack: operational + degraded + down + maintenance + unavailable = total.', 'additionalProperties': False}, 'vendors': {'type': 'array', 'items': {'type': 'object', 'required': ['vendor', 'name', 'indicator', 'description', 'degraded_components', 'active_incidents', 'cached', 'checked_at', 'statuspage_url'], 'properties': {'name': {'type': 'string', 'description': 'Display name of the vendor.'}, 'error': {'type': 'string', 'description': 'Why this vendor could not be checked â\x80\x94 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.'}, 'cached': {'type': 'boolean', 'description': 'True when this result was served from the 60s in-memory cache.'}, 'vendor': {'type': 'string', 'description': 'Vendor slug or URL as provided.'}, 'indicator': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', 'description': 'Overall health indicator: none = all clear, minor = some degradation, major = significant outage, critical = complete outage, maintenance = scheduled window in progress, planned rather than a fault.'}, 'checked_at': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of this check.'}, 'description': {'type': 'string', 'description': 'Human-readable status description (e.g., "All Systems Operational").'}, 'all_components': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'status', 'description'], 'properties': {'name': {'type': 'string', 'description': 'Component name.'}, 'status': {'type': 'string', 'description': 'Component operational status.'}, 'description': {'type': ['string', 'null'], 'description': 'Component description, or null if not provided.'}}, 'description': 'A component entry.', 'additionalProperties': False}, 'description': 'Components including operational ones, capped at component_limit per vendor and narrowed by component_filter when given. Present in detailed mode only.'}, 'statuspage_url': {'type': 'string', 'description': 'Status page base URL used for this vendor.'}, 'active_incidents': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'name', 'impact', 'status', 'latest_update'], 'properties': {'id': {'type': 'string', 'description': "Unique incident identifier from the vendor's status API."}, 'name': {'type': 'string', 'description': 'Incident title.'}, 'impact': {'enum': ['none', 'minor', 'major', 'critical', 'maintenance'], 'type': 'string', 'description': 'Severity level: none = informational, minor = degraded performance, major = partial outage, critical = full outage, maintenance = scheduled window folded into incident history.'}, 'status': {'type': 'string', 'description': 'Current incident status (e.g., investigating, monitoring, resolved).'}, 'started_at': {'type': ['string', 'null'], 'description': "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."}, 'latest_update': {'type': 'string', 'description': 'Most recent incident_update body text.'}}, 'description': 'An active incident entry.', 'additionalProperties': False}, 'description': 'Active (non-resolved) incidents.'}, 'degraded_components': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'status'], 'properties': {'name': {'type': 'string', 'description': 'Component name.'}, 'status': {'enum': ['degraded_performance', 'partial_outage', 'major_outage', 'under_maintenance'], 'type': 'string', 'description': 'Degradation level: degraded_performance = slow/intermittent, partial_outage = some requests failing, major_outage = most requests failing, under_maintenance = scheduled maintenance in progress.'}}, 'description': 'A degraded component entry.', 'additionalProperties': False}, 'description': 'Every component not in an operational state, uncapped â\x80\x94 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.'}, 'all_components_total': {'type': 'number', '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.'}, 'scheduled_maintenances': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'scheduled_for', 'scheduled_until', 'status'], 'properties': {'name': {'type': 'string', 'description': 'Maintenance window name.'}, 'status': {'type': 'string', 'description': 'Maintenance status (scheduled, in_progress, completed).'}, 'scheduled_for': {'type': 'string', 'description': "ISO 8601 start time, with the vendor's UTC offset."}, 'scheduled_until': {'type': 'string', 'description': "ISO 8601 end time, with the vendor's UTC offset."}}, 'description': 'A scheduled maintenance entry.', 'additionalProperties': False}, 'description': 'Upcoming or in-progress maintenance windows. Present in detailed mode only.'}}, 'description': 'Status result for a single vendor.', 'additionalProperties': False}, 'description': 'Per-vendor status results.'}, 'truncated': {'type': 'boolean', 'description': "True when at least one vendor's component list was capped at component_limit. Absent when nothing was capped."}, 'checked_at': {'type': 'string', 'description': 'ISO 8601 UTC timestamp of this check.'}, 'stack_name': {'type': 'string', 'description': 'Name of the stack checked.'}, 'totalCount': {'type': 'number', 'description': 'Components matching component_filter across the stack before the cap. Present only when truncated.'}, 'omitted_vendors': {'type': 'array', 'items': {'type': 'string', 'description': 'A vendor entry that cannot be part of a usable stack.'}, 'description': 'Entries that could not be resolved or whose URL was blocked; they still appear in vendors[] with an error. A call that saved the stack left them out of the write; a call that reused a saved stack leaves them in it until you re-provide the vendors list. Empty when every entry resolved.'}, 'stack_persisted': {'type': 'boolean', 'description': 'True when the vendor list was saved to state on this call. Only the vendors that resolved are saved â\x80\x94 see omitted_vendors.'}, 'nextToolSuggestions': {'type': 'array', 'items': {'type': 'object', 'required': ['toolName', 'reason', 'args'], 'properties': {'args': {'type': 'object', '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'}, 'additionalProperties': {}}, 'reason': {'type': 'string', 'description': 'Why the vendor qualifies: its reported indicator, or the open incident behind it.'}, 'toolName': {'type': 'string', 'description': 'Tool to call next â\x80\x94 "devops_suggest_action".'}}, 'description': 'A recommended follow-up tool call with pre-filled arguments.', 'additionalProperties': False}, 'description': "One devops_suggest_action call per vendor with an active problem â\x80\x94 an indicator of minor, major, or critical, or an open incident of that impact even while the indicator reads none or maintenance â\x80\x94 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."}}, 'additionalProperties': False}
最近のツール変更
類似のMCPサーバー
shiply
Publishes and manages web applications with SQL databases, serverless functions, domains, email tests, client intake, contracts, …
Fine Structure
Builds and hosts full-stack applications from prompts and supports agent communication through WhatsApp and email.
mcp
Provisions and manages cloud instances, networks, storage, databases, backups, VPNs, application deployments, and autocoding-agen…
EchoRelay
Manages a hosted API relay runtime, including projects, endpoints, credentials, publishing, keys, delivery logs, and dead-letter …
Supero
Builds, validates, publishes, tests, and deploys multi-tenant applications with schemas, CRUD operations, external data connector…
Replicate
Provides access to Replicate models, versions, collections, hardware, predictions, and deployments for running and managing hoste…
Relin
Configures webhook sources and destinations, monitors delivery health, investigates failures, manages retries, and replays events.
Scalix Cloud
Provides managed databases, SQL tools, container builds, persistent Linux machines, domains, scheduled functions, storage, and pr…