Skip to main content
Glama

SolidPing

Distributed, self-hostable uptime monitoring. 44 check types, multi-region workers, private agents, status pages, incidents and on-call escalation, in a single Go binary.

https://github.com/user-attachments/assets/fe207622-7957-4e85-8a3c-d33281799f4b

From docker run to the first result in 41 seconds, recorded from a real server with make showcase. The Tour page has the same cut if the player does not load.

Build Coverage Release Go Go Reference License

Live Status Docs Container

Run it

docker run -p 4000:4000 --hostname solidping -v solidping-data:/data ghcr.io/fclairamb/solidping

Open http://localhost:4000 and sign in with admin@solidping.io / solidpass. You must pick a new password on first login: the pair is public, so the account can do nothing else until then.

  • --hostname is required: the worker name comes from it and must match ^[a-z][a-z0-9-]{2,20}$ (or set SP_NODE_NAME).

  • Data (SQLite database and uploads) lives in /data, so keep the volume.

  • For production, use PostgreSQL: add -e SP_DB_TYPE=postgres -e SP_DB_URL='postgresql://user:pass@host:5432/solidping'. Migrations run on first boot.

Every other setting is an SP_ environment variable, all optional: see the configuration docs.

Other ways to run it:

Hosted

www.solidping.io, no card needed

Docker Compose

guide

Binary (Linux, macOS, Windows)

releases, Linux guide, Windows guide

Homebrew

brew install fclairamb/tap/solidping

Scoop

scoop bucket add fclairamb https://github.com/fclairamb/scoop-bucket then scoop install solidping

Kubernetes

Helm chart, guide

Railway, Coolify, CasaOS, YunoHost

installation guides

Related MCP server: uptimepage

Screenshots

Checks list

New-check form

Check detail

Check types

Check

Type

What it checks

HTTP/HTTPS

http

Status codes, body, JSON and header assertions, timing breakdown

TCP

tcp

Port connectivity, optional send/expect payload

UDP

udp

Port reachability, optional send/expect payload

ICMP

icmp

Ping

DNS

dns

Record resolution

WebSocket

websocket

Connection handshake

RDP

rdp

RDP negotiation, optional authenticated logon

VNC

vnc

RFB handshake and authentication

Website crawl

crawl

Broken links, mixed content, sitemap errors

Application health

health

Health endpoint, reported per component

Vendor status page

vendor-status

Outages reported by a vendor's status page

SSL/TLS

ssl

Certificate validity and expiration

Domain

domain

Domain expiration (WHOIS/RDAP)

DNSBL

dnsbl

DNS blocklist membership

PostgreSQL

postgresql

Connection and query

MySQL/MariaDB

mysql

Connection and query

MongoDB

mongodb

Ping command

Redis

redis

PING command

MSSQL

mssql

Connection and query

Oracle

oracle

Connection and query

ClickHouse

clickhouse

Connection and query

SMTP

smtp

Connectivity, STARTTLS, AUTH, optional real probe email

IMAP

imap

Server availability

POP3

pop3

Server availability

Email reception

email

A known message reaches an inbox (JMAP)

SSH

ssh

Server availability

FTP

ftp

Server availability

SFTP

sftp

Server availability

gRPC

grpc

Service health

Kafka

kafka

Broker connectivity

RabbitMQ

rabbitmq

Broker connectivity

MQTT

mqtt

Broker connectivity

SIP

sip

VoIP server OPTIONS ping

NTP

ntp

Reachability and clock drift

SNMP

snmp

Device monitoring

Docker

docker

Container health

Kubernetes

kubernetes

Workload replica health

A2S

a2s

Source / Steam game server query

Minecraft

minecraft

Java and Bedrock server query

Freebox line

freebox_line

xDSL/FTTH line quality

Prometheus

prometheus

Thresholds on a scraped metric

Heartbeat

heartbeat

Passive: alerts when pings stop (cron jobs, CI)

JavaScript

js

Sandboxed scripts: multi-step API flows, logins, aggregation

Browser

browser

Headless Chrome: full render, screenshots

Inspiration

Contributing

Bug reports and pull requests are welcome. CONTRIBUTING.md covers local setup (make dev) and PR conventions. Found a security issue? See SECURITY.md rather than opening a public issue.

License

AGPL-3.0 - See LICENSE.

Available Tools

23 tools
create_checkCreate checkAInspect

Create a new monitoring check and return it (uid, slug, placement, resolved periods). If you don't know what config shape a given type expects, call list_check_types with type first to fetch a working starting config, then use validate_check to dry-run before creating. An enabled check starts running on its next tick and opens an incident after its confirmation period; pass enabled:false to create it paused. A duplicate slug is rejected with a conflict, never merged — use update_check to change an existing check. Counts against the organization's MaxChecks quota (an over-quota create is refused); reversible with delete_check. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
nameNoHuman-readable name, e.g. "API production". Auto-generated from URL if omitted.
slugNoURL-friendly slug (3-20 lowercase letters/digits/hyphens), e.g. "api-prod". Auto-generated if omitted.
typeNoCheck type. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health, vendor-status. Inferred from config if omitted.
configYesCheck-specific config. Shape depends on type. Example for http: {"url": "https://example.com", "method": "GET"}. Use list_check_types with type to discover the shape for other types.
labelsNoKey-value labels for organization and filtering, e.g. {"env":"production","team":"api"}.
periodNoCheck interval as HH:MM:SS, e.g. "00:00:30" for 30 seconds, "00:01:00" for 1 minute (default).
enabledNoWhether the check should run. Default true.
regionsNoRegion slugs to pin the check to, e.g. ["eu-west-1","us-east-1"]. An explicit list means placement "pinned": the check runs from exactly these regions and is never moved. When omitted, the check is placed automatically (placement "auto"): the scheduler picks regionCount healthy regions from the org's default_regions, then the system default, then every other declared region, and moves the check off a region that goes dark. (An org whose own default_regions names a private location keeps pinned checks on those defaults.)
placementNo"pinned" or "auto". Omit to infer it: regions given means pinned, otherwise auto. "auto" cannot be combined with regions. Private (@) regions are pinned-only.
failQuorumNoMulti-region quorum: how many of the check's regions must be failing, for the confirmation period, before it is down and an incident opens. "all", "majority" or a whole number such as "2" (clamped to the region count). The default is all regions for 1-2 regions and a majority for 3+. Fewer failing regions than the quorum is a "regional issue": the check shows warning and no incident opens. "all" keeps the per-result rule: any passing region resets the confirmation. Omit for the default.
regionPoolNoAutomatic placement only: the cloud region slugs the scheduler may choose from, e.g. ["paris","gravelines"]. Omit for any cloud region. Implies placement auto.
descriptionNoFree-text description shown in the UI.
regionCountNoAutomatic placement only: how many regions run the check (default 2, capped by the eligible regions and the org's checks-per-minute limit; the response carries a PLACEMENT_REGION_COUNT_REDUCED warning when reduced). Implies placement auto.
checkGroupUidNoAssign the check to a check group (UID or slug), e.g. "core-services".
recoveryPeriodSecondsNoWall-clock seconds the check must stay UP before auto-resolving an incident. Any failure inside the window resets the recovery clock. 0 = resolve immediately. Range 0–86400. Default 120.
confirmationPeriodSecondsNoWall-clock seconds to wait after the first failure before opening an incident. 0 = open immediately on the first failure. Range 0–86400 (one day). Default 120.

Output Schema

NameRequiredDescription
uidYesCheck UID.
nameNoHuman-readable name.
slugNoURL-friendly slug.
typeNoCheck type, e.g. "http".
configNoCheck-specific configuration for the type.
labelsNoKey-value labels.
periodNoCheck interval as HH:MM:SS.
statusNoSynthesized status: up, down, validating, created or degraded.
enabledNoWhether the check runs.
regionsNoRegions the check runs from.
createdAtNoRFC3339 creation timestamp.
placementNo"pinned" or "auto".
descriptionNoFree-text description.
lastResultAtNoRFC3339 timestamp of the newest real result.
checkGroupUidNoCheck group UID, when the check belongs to a group.
statusChangedAtNoRFC3339 timestamp of the last status change.

TDQS

A4.9/5.0
Behavior5/5

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

Goes well beyond the annotations: explains that an enabled check starts on its next tick and opens an incident after the confirmation period, that enabled:false creates it paused, that duplicate slugs are rejected with a conflict rather than merged, and that the call counts against a quota and needs a specific scope/role. Annotations only declare the generic non-read-only, non-idempotent profile.

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

Conciseness5/5

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

Leads with the core action and return shape, then layers prerequisites, alternatives, and side effects. Given 16 parameters and several side effects, the density is justified and no sentence is filler.

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

Completeness5/5

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

With an output schema present the description needn't explain return values, and it still names the salient ones. For a complex multi-param mutation it covers prerequisites, alternatives, quota, and reversibility, leaving nothing an agent needs before calling it.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds real meaning beyond the schema: enabled:false semantics (create paused), config-shape discovery via list_check_types, and the create-vs-update conflict behavior. It does not restate the many placement/period parameters, leaving those to the schema.

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

Purpose5/5

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

States a specific verb and resource ("Create a new monitoring check") and even names the key return fields (uid, slug, placement, resolved periods). It clearly distinguishes itself from update_check, delete_check, validate_check and list_check_types by naming them with their roles.

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

Usage Guidelines5/5

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

Gives explicit routing: call list_check_types to discover config shapes, validate_check to dry-run before creating, update_check for existing checks rather than re-creating, delete_check to reverse. Exclusions and prerequisites (mcp scope, user role, MaxChecks quota) are spelled out.

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

create_status_pageCreate status pageAInspect

Create a new status page for the organization and return the created page. A duplicate slug is rejected with a conflict, never merged. Only one page can be the default: the first page always becomes it, and isDefault:true demotes the previous default. Every new page is seeded with a default "Services" section and starts enabled and public — use manage_status_page_section to add more sections and update_status_page to edit the page later. Not quota-limited; reversible with delete_status_page. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
nameYesStatus page display name (required), e.g. "Public status".
slugYesURL-friendly slug (required, unique per org), e.g. "public".
languageNoLanguage code, e.g. "en" or "fr".
customCssNoCustom CSS injected into the public page as a <style> element. Overrides the theme's CSS custom properties (--brand, --background, --foreground, --card, --border, the status colors, and the .dark variant). Max 64 KB; @import is rejected.
isDefaultNoWhether this is the org's default status page (only one allowed).
visibilityNoVisibility setting. Allowed: "public", "private". Default "public".
autoPublishNoAutomatically publish incidents affecting this page's resources as public incidents. New pages default to true; pages that existed before this feature shipped default to false.
autoResolveNoWhat an auto-created publication does when its incident resolves. Allowed: "always", "if_untouched" (default — a publication a human has edited is left for them to close), "never".
descriptionNoOptional free-text description shown in the UI.
historyDaysNoDays of history to show on the page (default 90).
showAvailabilityNoDisplay availability percentage on the public page.
showResponseTimeNoDisplay response-time charts on the public page.
autoPublishDelaySecondsNoDebounce in seconds before an incident becomes public (default 60). 0 publishes immediately. An incident that resolves inside the delay is never published at all.

Output Schema

NameRequiredDescription
uidYesStatus page UID.
nameNoDisplay name.
slugNoURL-friendly slug.
enabledNoWhether the public page is served.
createdAtNoRFC3339 creation timestamp.
isDefaultNoWhether this is the organization's default page.
visibilityNo"public", "private" or "password".
historyPeriodNoHistory window: "24h", "7d", "30d" or "90d".

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare it is a non-destructive, non-idempotent write. The description adds substantial behavior beyond that: duplicate slugs are rejected with a conflict and never merged, the first page becomes default and isDefault:true demotes the prior default, new pages are seeded with a 'Services' section and start enabled/public, and it is not quota-limited. This is strong, though it does not describe the returned page shape (an output schema exists, so that is acceptable).

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

Conciseness4/5

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

Front-loaded with the core action and then pairs each behavior with the sibling tool that handles the alternative. It is a bit dense across several sentences but every sentence conveys actionable information rather than repeating the name.

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

Completeness5/5

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

With 100% schema coverage, an output schema, and annotations present, the description fills the remaining gaps: uniqueness enforcement, default-page demotion, seeding behavior, reversibility, quota, and auth requirements. Nothing material for correct invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description still adds real meaning: it clarifies slug uniqueness semantics (conflict, never merged) and isDefault demotion behavior, which the schema only partially conveys. It does not elaborate on the many optional fields, but the schema handles them.

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

Purpose5/5

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

States a specific verb and resource ('Create a new status page for the organization') and explicitly differentiates from siblings by naming manage_status_page_section and update_status_page as the tools for later section/page changes. An agent can distinguish this from update_status_page and delete_status_page immediately.

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

Usage Guidelines5/5

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

Gives explicit routing: use manage_status_page_section to add sections, update_status_page to edit later, and delete_status_page to reverse. It also states prerequisites (mcp scope, at least user role), so when-not conditions are covered.

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

delete_checkDelete checkA
DestructiveIdempotent
Inspect

Soft-delete a monitoring check by UID or slug. The check stops running immediately, its active incidents are resolved and its scheduling jobs removed; historical results are kept. A check that other checks tunnel through is refused. The deletion is permanent: there is no undelete, though it frees a slot in the MaxChecks quota. To stop a check without losing it, use update_check with enabled:false instead. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
identifierYesCheck UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3".

Output Schema

NameRequiredDescription
deletedYesAlways true on success.
identifierYesThe UID or slug that was deleted.

TDQS

A4.7/5.0
Behavior5/5

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

Adds substantial context beyond the destructiveHint/idempotentHint annotations: immediate halt, active incidents resolved, scheduling jobs removed, historical results retained, permanence with no undelete, and freed MaxChecks quota. It also discloses auth requirements (mcp scope, mcp:read refused, user role required), which no annotation covers.

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

Conciseness5/5

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

The effect of the call is front-loaded, followed by side effects, the refusal case, permanence, and the alternative. Every sentence carries operational information; nothing is padding.

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

Completeness5/5

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

With annotations covering the safety profile and an output schema covering the response, the description fills the remaining gaps: side effects, irreversibility, quota impact, permissions, and failure modes. Nothing an agent needs to decide or call correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter already documents UID-or-slug format with examples. The description's "by UID or slug" merely restates the schema, adding no new syntax or validation detail.

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

Purpose5/5

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

States a specific verb and resource ("Soft-delete a monitoring check") plus the accepted identifier forms (UID or slug). It is clearly distinguishable from siblings such as get_check, update_check, and list_checks.

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

Usage Guidelines5/5

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

Explicitly names the alternative and the condition that selects it: "To stop a check without losing it, use update_check with enabled:false instead." It also documents a refusal case (checks that other checks tunnel through), so an agent knows when this call will fail.

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

delete_status_pageDelete status pageA
DestructiveIdempotent
Inspect

Soft-delete a status page by UID or slug: the page disappears from the API and the public site, taking its sections and resources with it, and its uploaded brand assets are deleted. There is no undelete (permanent, not reversible) — use update_status_page with enabled:false to take a page down without destroying it. Use delete_status_page_section or delete_status_page_resource to remove part of a page instead. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
identifierYesStatus page UID or URL-friendly slug, e.g. "public".

Output Schema

NameRequiredDescription
deletedYesAlways true on success.
identifierYesThe identifier that was deleted.

TDQS

A4.7/5.0
Behavior5/5

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

Goes well beyond annotations by disclosing that destruction is permanent with no undelete, that sections/resources are removed, and that uploaded brand assets are deleted. It also states the required mcp scope and minimum user role, which are critical operational constraints.

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

Conciseness5/5

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

The destructive consequence and identifier are front-loaded, followed immediately by the safer alternative and partial-deletion alternatives. Despite its length, every sentence carries decision-relevant information for a destructive operation.

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

Completeness5/5

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

Given destructive annotations, a fully described single parameter, an output schema, and the tool's cascading deletion behavior, the description covers the important operational and safety context. Auth requirements and irreversibility are included, leaving no material gap for correct invocation.

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

Parameters3/5

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

The schema already documents the single identifier parameter at 100% coverage, including UID-or-slug semantics and an example. The description restates that identifier may be a UID or slug but adds no further syntax, validation, or edge-case guidance beyond the schema.

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

Purpose5/5

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

States the specific action (soft-delete a status page) and identifier types (UID or slug), plus the cascade scope. It clearly differentiates this destructive full-page deletion from sibling tools that delete only sections or resources.

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

Usage Guidelines5/5

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

Explicitly says to use update_status_page with enabled:false instead when the goal is merely taking a page down without destroying it. It also directs partial removal to delete_status_page_section or delete_status_page_resource, so the agent has clear alternatives.

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

diagnose_checkDiagnose checkA
Read-onlyIdempotent
Inspect

Return everything an operator would want to look at to diagnose a single check's current state in one call: current status, recent raw results across regions, any active incident, and the most recent resolved incident. Use this instead of chaining list_results + list_incidents when a human asks "what's wrong with check X?". freshness and regionalIssue are omitted when there is nothing to report, the incidents are null when there are none. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
identifierYesCheck UID or slug (e.g. "api-prod" or a UUID).
recentResultsLimitNoRecent raw results per region (1-20, default 5).

Output Schema

NameRequiredDescription
checkYes
freshnessNoOne sentence per silent region naming it and since when it has gone quiet; empty when every region is reporting.
recentResultsYesNewest-first raw results, trimmed to recentResultsLimit per region; includes region, output and durationMs.
regionalIssueNoOne sentence describing the regional issue (some, but fewer than the quorum, of the check's regions failing); empty when there is none.
activeIncidentYesCurrently-open incident for the check, or null when none is open.
lastResolvedIncidentYesMost recently resolved incident for the check, or null when there is none.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered; the description still adds auth scope ('works with mcp:read tokens') and, more valuably, discloses output-absence semantics (freshness/regionalIssue omitted when empty, incidents null when none). It does not mention cost, latency, or result-volume limits for the multi-region aggregation, which is the one remaining behavioral gap.

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

Conciseness5/5

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

Three sentences, each doing distinct work: what is returned, the sibling alternative, and null/omission semantics plus auth. The payload contents are front-loaded before the usage rule.

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

Completeness5/5

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

An output schema exists, so return values need not be re-explained; the description still pre-empts the confusing part of the response (omitted vs null fields) and states the auth tier. For a 2-parameter read aggregation tool, 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.

Parameters3/5

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

Schema description coverage is 100%, with identifier's UID-or-slug format and recentResultsLimit's range/default fully documented in the schema, so baseline 3 applies. The description adds nothing about either parameter beyond the implicit notion of targeting one check.

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

Purpose5/5

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

States a specific verb ('diagnose') and resource ('a single check's current state') and enumerates exactly what is aggregated: status, raw results across regions, active incident, most recent resolved incident. It is also distinguishable from siblings list_results and list_incidents, which it explicitly folds together.

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

Usage Guidelines5/5

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

Gives an explicit routing rule: 'Use this instead of chaining list_results + list_incidents when a human asks "what's wrong with check X?"'. Both the alternative and the selecting condition are named, leaving nothing to inference.

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

get_checkGet checkA
Read-onlyIdempotent
Inspect

Get a single check's metadata by UID or slug (identifier takes either); ask for extras with with=lastResult,lastStatusChange. For a full triage briefing (current status + recent results + active incidents), prefer diagnose_check; to search by name or label, use list_checks. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
withNoComma-separated extra fields: lastResult — most recent result lastStatusChange — when status last changed Example: "lastResult,lastStatusChange".
identifierYesCheck UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3".

Output Schema

NameRequiredDescription
uidYesCheck UID.
nameNoHuman-readable name.
slugNoURL-friendly slug.
typeNoCheck type, e.g. "http".
configNoCheck-specific configuration for the type.
labelsNoKey-value labels.
periodNoCheck interval as HH:MM:SS.
statusNoSynthesized status: up, down, validating, created or degraded.
enabledNoWhether the check runs.
regionsNoRegions the check runs from.
createdAtNoRFC3339 creation timestamp.
placementNo"pinned" or "auto".
descriptionNoFree-text description.
lastResultAtNoRFC3339 timestamp of the newest real result.
checkGroupUidNoCheck group UID, when the check belongs to a group.
statusChangedAtNoRFC3339 timestamp of the last status change.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive, and the description reinforces this with auth-level detail the annotations cannot express: it works with mcp:read tokens. It also discloses the opt-in 'extras' expansion behavior, though it does not describe payload shape or size limits.

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

Conciseness5/5

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

One dense, front-loaded sentence chain with zero filler: core purpose first, then extras, then alternative routing, then the auth note. Every clause carries information an agent needs.

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

Completeness5/5

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

An output schema exists so return values need no explanation, annotations cover the safety profile, and both parameters are fully documented. Combined with explicit sibling routing, nothing an agent needs to invoke it correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and both parameters carry detailed descriptions, including the enum-like list of allowed 'with' values. The description's 'identifier takes either' and its 'with=lastResult,lastStatusChange' example largely restate the schema, so it adds little semantic value beyond it.

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

Purpose5/5

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

Specific verb and resource ('Get a single check's metadata') plus an explicit identifier scope ('by UID or slug'). It names the two siblings it is not (diagnose_check, list_checks), so an agent can select it without opening another schema.

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

Usage Guidelines5/5

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

Explicit routing: use diagnose_check for a full triage briefing and list_checks to search by name or label. Both alternatives come with the condition that selects them, leaving nothing to inference.

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

get_incidentGet incidentA
Read-onlyIdempotent
Inspect

Get a single incident by UID (not by slug); an unknown UID fails with an "incident not found" error. Returns the incident object — number, state, timestamps, failure counts — plus the check with with=check and up to 50 timeline events with with=events. include=["notifications"] adds the incident's notification attempts (one row per dispatch target with its delivery status, channel and recipient, newest first), filtered by status and capped by limit. Use list_incidents to search and filter across incidents, and diagnose_check for a check's full triage briefing. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
uidYesIncident UID returned by list_incidents or diagnose_check.
withNoComma-separated extra fields. "check" includes the underlying check; "events" includes up to 50 most-recent timeline events (status transitions, notifications, manual notes). Example: "check,events".
limitNoWith include=notifications: max attempts (1-500, default 20).
statusNoWith include=notifications: only attempts in this delivery status. Allowed: pending, sent, failed, cancelled, skipped.
includeNoExtra lists to return with the incident. An unknown value is an error.

Output Schema

NameRequiredDescription
uidYesIncident UID.
kindNoWhat the incident is about: check, slo_burn or degraded.
checkNoUnderlying check, when requested with with=check.
stateNoactive or resolved.
titleNoCustom title, when one was set.
eventsNoTimeline events (status transitions, notifications, manual notes), newest first; present when with=events was passed.
numberNoShort per-org reference, e.g. 42.
checkUidNoUID of the check the incident is about.
checkNameNoName of that check.
checkSlugNoSlug of that check.
startedAtNoRFC3339 timestamp when the incident opened.
resolvedAtNoRFC3339 timestamp when it resolved; absent while active.
descriptionNoCustom description, when one was set.
failureCountNoNumber of failures recorded for the incident.
relapseCountNoNumber of times the incident reopened.
notificationsNoNotification attempts, newest first; present when include=notifications was passed.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: the unknown-UID error, the 50-event cap, notification rows being newest-first and capped by limit, and the mcp:read token requirement. That is substantive disclosure an agent cannot infer from 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.

Conciseness4/5

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

The identifying constraint (UID not slug) and the error behavior are front-loaded, and every sentence carries routing or option information. The middle sentence is long and stacks several modifiers (include, status, limit, newest-first, per-target rows), which slightly slows parsing but is not padding.

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

Completeness5/5

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

For a read-only fetch with an output schema, annotations, and full parameter documentation, nothing an agent needs to call it correctly is missing: key format, optional expansions, notification filtering, caps, and failure mode are all covered.

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

Parameters4/5

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

Schema coverage is 100%, so a baseline of 3 applies; the description earns the extra point by explaining what the parameters mean semantically — include=["notifications"] yields one row per dispatch target with delivery status, channel and recipient — which enriches the schema's terser wording rather than repeating it.

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

Purpose5/5

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

States a specific verb and resource (get a single incident), and immediately disambiguates the key lookup key: 'by UID (not by slug)'. It also distinguishes itself from list_incidents and diagnose_check by name, so an agent can route 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.

Usage Guidelines5/5

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

Explicitly names the alternatives and the condition selecting them: list_incidents for searching/filtering across incidents, diagnose_check for a check's full triage briefing. The error path (unknown UID fails with 'incident not found') tells the agent what a wrong selection looks like.

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

get_status_pageGet status pageA
Read-onlyIdempotent
Inspect

Get one status page by UID or slug (identifier takes either) and return it. with=sections embeds its sections and their resources. include adds lists next to the page fields: "sections" (section metadata, display order), "resources" (the resources of the section named by sectionIdentifier) and "incidents" (the customer-facing incident publications on the page, filtered by state and active). Use list_status_pages to browse every page, and manage_status_page_section / _resource / _incident to change them. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
withNo"sections" to include nested sections and their resources
stateNoWith include=incidents: only publications in this public state. Allowed: "investigating", "identified", "monitoring", "resolved".
activeNoWith include=incidents: when true, only publications that are not resolved.
includeNoExtra lists to return with the page. An unknown value is an error. Do not combine "sections" with with=sections.
identifierYesStatus page UID or URL-friendly slug, e.g. "public".
sectionIdentifierNoSection UID or slug whose resources include=resources returns (required with it).

Output Schema

NameRequiredDescription
uidYesStatus page UID.
nameNoDisplay name.
slugNoURL-friendly slug.
enabledNoWhether the public page is served.
sectionsNoSections; absent unless with=sections (nested resources included) or include=sections (section metadata only) was passed.
createdAtNoRFC3339 creation timestamp.
incidentsNoIncident publications on the page; present with include=incidents.
isDefaultNoWhether this is the organization's default page.
resourcesNoResources of the section named by sectionIdentifier; present with include=resources.
visibilityNo"public", "private" or "password".
historyPeriodNoHistory window: "24h", "7d", "30d" or "90d".

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the bar is lower; the description still adds real context: mcp:read token scope, that with=sections embeds nested sections and their resources, that include returns filtered incident publications, and that an unknown include value is an error. It doesn't discuss pagination or failure modes beyond the include error, keeping it short of a 5.

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

Conciseness4/5

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

Front-loaded with purpose and efficient overall, but the middle sentence enumerating include values in prose is verbose and duplicates the schema enumeration. Slight redundancy, no wasted framing.

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

Completeness5/5

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

With an output schema present, return shape needn't be described; annotations cover safety and the description covers auth scope, embedding behavior, and sibling routing. Nothing needed 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.

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description's prose about with/include/state/active largely restates what the schema already documents (including the sectionIdentifier requirement for include=resources), adding little semantic depth beyond 'identifier takes either'.

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

Purpose5/5

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

States a specific verb and resource ('Get one status page') plus identifier flexibility (UID or slug), and explicitly distinguishes itself from list_status_pages for browsing. An agent can tell instantly this is the single-record read.

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

Usage Guidelines5/5

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

Names the alternatives and the conditions selecting them: list_status_pages for browsing, manage_status_page_section/_resource/_incident for changes. It also gives intra-tool guidance (when to use with=sections vs include, and the rule not to combine them), leaving nothing to inference.

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

list_check_groupsList check groupsA
Read-onlyIdempotent
Inspect

List all check groups for the organization. Check groups bundle related checks together for shared incident handling and dashboard organization, and each entry carries its slug, rolled-up status and check count. Takes no parameters and returns every group in one unpaginated response. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
dataNoCheck groups on this page.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive behavior, but the description adds useful context beyond them: it returns every group in one unpaginated response and works with mcp:read tokens. It also notes the fields each entry carries, though it does not cover rate limits or failure modes.

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

Conciseness5/5

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

The description is front-loaded with the primary action and scope, then adds only useful details about group semantics, return shape, pagination, and auth. Every sentence contributes without repetition.

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

Completeness5/5

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

With zero parameters, rich annotations, and an output schema, the description supplies everything an agent needs to call this tool correctly: scope, return behavior, auth requirements, and the fact that no input is required. No important context is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline is 4. The description correctly states that it takes no parameters, which matches the empty input schema.

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

Purpose4/5

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

The description gives a specific verb and resource ('List all check groups for the organization') and clarifies what a check group is, including that it bundles related checks. This distinguishes it implicitly from check-level siblings like list_checks, but it does not explicitly name when another list tool would be preferred.

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

Usage Guidelines3/5

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

Usage is implied by the concept: an agent can infer this is the tool for enumerating check groups. However, there is no explicit comparison to alternatives such as list_checks or list_check_types, and no guidance on when not to use it.

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

list_checksList checksA
Read-onlyIdempotent
Inspect

List monitoring checks for the organization, optionally filtered by name/slug substring, labels, or check group; the filters combine with AND. Returns {data, pagination}; pass pagination.cursor back as cursor for the next page. Use this for browsing or filtering a fleet of checks. To investigate a single check's current health, use diagnose_check instead; if you already know its UID or slug, get_check is more direct. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
qNoCase-insensitive substring match on check name or slug, e.g. "api".
withNoComma-separated extra fields: lastResult — most recent result for each check lastStatusChange — when each check last changed status Example: "lastResult,lastStatusChange".
limitNoMax results (1-100, default 20).
cursorNoOpaque pagination cursor returned by a previous response. Omit on the first page.
labelsNoLabel filter as a JSON object. Returns checks that have ALL of the given labels with matching values (AND semantics). Example: {"env": "production", "team": "api"}.
checkGroupUidNoFilter to checks in this group (UID or slug), e.g. "core-services".

Output Schema

NameRequiredDescription
dataNoChecks on this page.
paginationNoCursor pagination state for the filter.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, but the description adds useful context beyond them: filters combine with AND, the response shape is {data, pagination}, and pagination.cursor should be passed back as cursor. It also discloses the auth requirement ('works with mcp:read tokens'), which is exactly the kind of operational detail annotations do not cover.

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

Conciseness5/5

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

The description is compact and front-loaded: purpose and filter behavior first, then return/pagination mechanics, then sibling routing, then auth context. Every sentence adds useful information for selecting or invoking the tool.

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

Completeness5/5

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

Given six optional parameters, full schema coverage, an output schema, and rich annotations, the description covers everything an agent needs: filtering semantics, pagination, when to choose this tool versus alternatives, and the auth scope. No material gap remains.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter semantics: filters for name/slug substring, labels, and check group combine with AND. It also explains the pagination cursor flow, though it does not describe the 'with' parameter or limit defaults beyond what the schema already says.

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

Purpose5/5

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

States a specific verb and resource ('List monitoring checks') and scopes it to the organization, with optional filters clearly named. It distinguishes itself from sibling tools like get_check and diagnose_check by explaining the browsing/filtering use case.

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

Usage Guidelines5/5

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

Explicitly says to use this for browsing or filtering a fleet of checks, and names alternatives: diagnose_check for investigating one check's health, and get_check when the UID or slug is already known. This gives clear when-to-use and when-not-to-use guidance.

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

list_check_typesList check typesA
Read-onlyIdempotent
Inspect

List all monitoring check types supported by this server (e.g. http, tcp, dns, icmp, ssl), or with type, the ready-made sample configs of that type. Call it without arguments first when you don't know what type to use: it returns {data: [...]}, one entry per type with its description, enabled state, period bounds and secretFields. Then call it with type=: it returns {data: [...]} with one entry per matching type carrying its samples, each a complete, valid config to clone and modify (much more reliable than guessing field names). Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
typeNoOptional check type whose sample configs to return (e.g. "http", "dns", "tcp", "icmp", "ssl").

Output Schema

NameRequiredDescription
dataNoWithout type: check types this server supports, with their activation status. With type: one entry per matching check type, carrying its sample configs.

TDQS

A4.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral context beyond that: the returned envelope {data: [...]} in both modes, the fields per entry (description, enabled state, period bounds, secretFields), and the fact that samples are complete valid configs. However, it restates the read-only guarantee in the closing sentence ('works with mcp:read tokens'), which is partly redundant with the annotations, and adds no pagination or ordering limits.

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

Conciseness4/5

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

Front-loaded with the tool's purpose, then the two modes in call order, so an agent can stop reading after the first clause. It is dense but nearly every sentence adds routing or return-shape information; the closing auth sentence is the one part that earns little given readOnlyHint is already set.

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

Completeness5/5

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

An output schema exists, yet the description still usefully pre-summarizes both return shapes and the secretFields/key fields per entry, and it covers the auth requirement. For a single optional-parameter read tool with full annotations, nothing an agent needs in order to call it or interpret results is missing.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents the optional `type` string with examples, so the baseline is 3. The description earns above that by explaining what the parameter semantically switches on — it returns the sample configs of that type rather than the type metadata, and it names the fields returned in the unfiltered case, which the schema does not.

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

Purpose5/5

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

States a specific verb+resource ('List all monitoring check types supported by this server') and explicitly covers both call modes: bare enumeration vs. type-filtered sample configs. The named examples (http, tcp, dns, icmp, ssl) and the mention of 'ready-made sample configs' let an agent distinguish it from siblings like list_checks or validate_check 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.

Usage Guidelines5/5

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

Gives an explicit two-step workflow with the condition that selects each step: 'Call it without arguments first when you don't know what type to use' then 'call it with type=<chosen type>'. It also justifies the choice ('much more reliable than guessing field names'), which steers the agent away from an inferior alternative.

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

list_incidentsList incidentsA
Read-onlyIdempotent
Inspect

List internal incidents (active or resolved) for the organization, filtered by check, state, or time range; the filters combine with AND. Returns {data, pagination} — total, size, and a cursor naming the last row (opaque, pass it back as cursor for the next page). order=asc lists oldest first and always returns a cursor, even on the last page, so you can store it and later resume with only the incidents started after it (rows younger than 5 s are held back). It lists new incidents only; changes to existing incidents are events (GET /events?type=incident&order=asc). Use diagnose_check for one check's incidents plus current health in one call, and get_status_page include=incidents for the customer-facing entries on a status page. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
sizeNoMax results (1-100, default 20).
withNoComma-separated extra fields: check — include the underlying check (slug, type, config) Example: "check".
orderNoSort order on start time: "desc" (default, newest first) or "asc" (oldest first; the cursor then means strictly after, and is always returned).
sinceNoLower bound on incident start time (RFC3339), e.g. "2026-05-03T00:00:00Z".
stateNoComma-separated incident states. Allowed: active, resolved. Example: "active" or "active,resolved".
untilNoUpper bound on incident start time (RFC3339), e.g. "2026-05-04T00:00:00Z".
cursorNoOpaque pagination cursor returned by a previous response. Omit on the first page.
checkUidNoComma-separated check UIDs or slugs to filter by, e.g. "api-prod,db-prod".

Output Schema

NameRequiredDescription
dataNoIncidents on this page.
paginationNoPage state for the filter.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavior: pagination cursor semantics, that order=asc always returns a cursor, that rows younger than 5s are held back, and the mcp:read token requirement. It stops short of describing rate limits or error behavior, but carries substantial beyond-annotation context.

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

Conciseness4/5

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

Front-loaded with purpose, then pagination, then alternatives. It is a dense single paragraph but every sentence contributes; slightly heavier than ideal but no filler.

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

Completeness5/5

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

An output schema exists and the description nonetheless previews the return shape ({data, pagination}, cursor meaning), covers pagination and ordering semantics, and names alternatives. Nothing a caller needs to invoke correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description adds value by stating filters combine with AND, explaining cursor round-tripping, and clarifying that order=asc upgrades cursor meaning to 'strictly after.' These go beyond the schema text and help correct invocation.

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

Purpose5/5

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

States a specific verb and resource ('List internal incidents'), scopes it to active or resolved, and enumerates filter dimensions. It explicitly distinguishes itself from events ('It lists new incidents only; changes to existing incidents are events'), so an agent can tell it apart from siblings like get_incident and diagnose_check.

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

Usage Guidelines5/5

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

Explicitly routes to alternatives: 'Use diagnose_check for one check's incidents plus current health in one call, and get_status_page include=incidents for the customer-facing entries.' It also names the exclusion (events endpoint for changes), giving clear when/when-not guidance.

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

list_regionsList regionsA
Read-onlyIdempotent
Inspect

List monitoring regions available to the organization (e.g. eu-west-1, us-east-1). Returns {data: [...]} — each region's slug, label and per-region metadata — plus defaultRegions, the org's default placement set. Use these slugs in the regions array of create_check or update_check. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
dataNoRegions available to this organization.
defaultRegionsNoThe org's default region slugs, used when a check has no explicit regions.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety bar is pre-met; the description adds the auth detail that it "works with mcp:read tokens," which is real operational context not in the annotations. It also discloses the result envelope (data plus defaultRegions), though that partly duplicates the output schema.

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

Conciseness5/5

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

Three sentences, front-loaded with what the tool is, then return shape, then how to use the output, then auth scope. No filler, and the downstream-use instruction comes before the least-important token note.

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

Completeness4/5

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

Since an output schema exists, the return-value sentence is technically redundant, but everything an agent needs — purpose, token requirement, and how to apply the slugs — is present. Nothing material is missing for a zero-parameter read tool.

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

Parameters3/5

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

The tool takes zero parameters, so there is nothing to disambiguate and the baseline is 4. However, the description spends a sentence describing the return payload rather than parameter behavior, so it adds no semantic value on this axis.

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

Purpose5/5

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

Specific verb+resource ("List monitoring regions available to the organization") with concrete slug examples (eu-west-1, us-east-1). It also distinguishes scope: org-visible regions plus the org's defaultRegions set, which no sibling tool returns.

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

Usage Guidelines4/5

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

Explicitly routes downstream use: "Use these slugs in the regions array of create_check or update_check," which tells the agent exactly why it would call this before those mutation tools. It doesn't name an alternative listing tool, but none exists among the siblings, so the guidance is effectively complete.

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

list_resultsList resultsA
Read-onlyIdempotent
Inspect

Query monitoring results (raw or aggregated) with filtering by check, type, status, region, period type, and time range. Use this for trend analysis or to inspect a specific window. For investigating a single check's current state, use diagnose_check instead. Defaults: if periodType is omitted it falls back to "hour"; if periodStartAfter is omitted it falls back to a window matched to the finest periodType requested (raw=1h, hour=24h, day=30d, month=365d). Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
sizeNoMax results (1-100, default 20).
withNoComma-separated extra fields: durationMs — response time in ms durationMinMs — min response time in the bucket (aggregated rows only) durationMaxMs — max response time in the bucket (aggregated rows only) region — region the check ran in metrics — per-execution metrics output — full check output incl. error messages availabilityPct — uptime % (aggregated rows only) checkSlug — slug of the check checkName — human name of the check Example: "durationMs,output".
cursorNoOpaque pagination cursor returned by a previous response. Omit on the first page.
regionNoComma-separated region slugs, e.g. "eu-west-1,us-east-1".
statusNoComma-separated result statuses. Allowed: up, down, created, running, abandoned. "down" covers every genuine failure (down, timeout, error); "abandoned" is separate on purpose — it marks an attempt nothing was ever reported for, which is excluded from availability and is NOT downtime. Example: "down" or "down,abandoned".
checkUidNoComma-separated check UIDs or slugs to filter by, e.g. "api-prod,db-prod".
checkTypeNoComma-separated check types. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health, vendor-status. Example: "http,dns".
periodTypeNoComma-separated period types. Allowed: raw (single executions), hour, day, month (rollups). Defaults to "hour" when omitted. Example: "raw".
periodEndBeforeNoRFC3339 timestamp (exclusive upper bound), e.g. "2026-05-03T11:00:00Z".
periodStartAfterNoRFC3339 timestamp (inclusive lower bound), e.g. "2026-05-03T10:14:22Z". Defaults to a window matched to periodType when omitted (raw=1h, hour=24h, day=30d, month=365d).

Output Schema

NameRequiredDescription
dataNoResult rows on this page: raw executions or aggregated rollups.
windowNoTime window the server actually queried.
paginationNoCursor pagination for this filter.
effectiveFilterNoPeriod filter that actually ran, after the tool's defaulting.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered; the description still adds value by disclosing the required token scope (mcp:read) and the default-resolution behavior when periodType/periodStartAfter are omitted. It does not go further on result volume or pagination behavior beyond what the schema's cursor/size fields imply.

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

Conciseness4/5

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

Front-loaded with purpose and filtering capability, followed by the alternative and defaults, then the token requirement. Efficient, though the default-fallback sentence largely repeats the schema text for periodType and periodStartAfter, costing a little redundancy.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and the description covers purpose, alternative, defaults, and auth scope for a 10-parameter optional-filter tool. Minor gap: it doesn't characterize aggregation semantics (e.g. what raw vs hour rollups mean for interpretation) beyond naming them.

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

Parameters3/5

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

Schema description coverage is 100% and it already documents every parameter including enums, ranges, and the default fallback rules. The description's restatement of the periodType and periodStartAfter defaults is duplication rather than added meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb (query/list) and resource (monitoring results), plus the dimensions it can be sliced by (check, type, status, region, period type, time range) and the raw-vs-aggregated distinction. It explicitly names the sibling it is not (diagnose_check), so an agent can route between them without opening either schema.

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

Usage Guidelines5/5

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

Gives positive use cases (trend analysis, inspecting a specific window) and an explicit alternative with the condition that selects it: 'For investigating a single check's current state, use diagnose_check instead.' That is a concrete when/when-not routing rule, not implied guidance.

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

list_status_pagesList status pagesA
Read-onlyIdempotent
Inspect

List every status page in the organization, newest first. Use get_status_page for a single page by UID or slug (with=sections or include=sections for its contents). Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
dataNoStatus pages in the organization.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is largely covered. The description still adds real context beyond them: the newest-first ordering and the fact that an mcp:read token suffices, which tells the agent about auth requirements. Minor redundancy in restating read-only keeps it from a 5.

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

Conciseness5/5

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

Two sentences, both front-loaded: the core behavior first, then the routing/alternative and auth note. No filler, no restating the title.

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

Completeness4/5

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

With no parameters, a present output schema, and rich annotations, the description supplies everything needed to invoke the tool, including where to go if a filtered fetch is required. It stops short of mentioning result size or pagination behavior for large organizations, a small remaining gap.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to explain; the baseline for a 0-param tool is 4. The description correctly doesn't invent parameters and instead points to the sibling that accepts filtering/closing arguments.

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

Purpose5/5

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

States a specific verb and resource ("List every status page in the organization") plus ordering ("newest first"), immediately separating it from get_status_page. An agent can tell from the first clause what it returns and how it differs from the sibling that fetches a single page.

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

Usage Guidelines5/5

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

Explicitly names the alternative (get_status_page), the selector for it ("by UID or slug"), and even the argument form needed to pull contents (with=sections or include=sections). This is when-to-use and when-not-to-use guidance in a single sentence.

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

manage_status_page_incidentManage status page incidentA
Destructive
Inspect

Manage the customer-facing incidents a status page shows (publications), distinct from the internal incidents list_incidents returns. Titles and bodies are shown to CUSTOMERS: never paste probe output, error strings, internal hostnames or IPs. action=create publishes a hand-written incident (pageIdentifier, title). action=update edits a publication's title, severity or state (pageIdentifier, publicationUid; PATCH semantics). action=add_update appends a narrative entry (pageIdentifier, publicationUid, kind, bodyMarkdown); entries are append-only. action=publish relays an EXISTING internal incident (incidentUid, pageIdentifier) with a title templated from the page. action=unpublish removes a relayed incident from the page (incidentUid, publicationUid), keeping the row for audit. create, add_update and publish notify status-page subscribers (hourly cap) and every action reaches webhook connections. Read publications with get_status_page include=incidents. Annotated destructive and non-idempotent because delete is one of its actions. Every action requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
kindNoUpdate kind (required). Allowed: "investigating", "identified", "monitoring", "resolved", "maintenance", "info". The first four also advance the publication's state.
stateNoInitial public state (default "investigating"). Allowed: "investigating", "identified", "monitoring", "resolved".
titleNoCustomer-facing title (required), e.g. "Payments API is degraded".
actionYesWhat to do with the customer-facing incident.
severityNoPublic badge severity. Allowed: "minor", "major", "critical".
incidentUidNoOptional UID of the internal incident this publication tracks.
bodyMarkdownNoOptional first narrative entry, in Markdown.
pageIdentifierNoStatus page UID or URL-friendly slug, e.g. "public".
publicationUidNoUID of the incident publication to act on.

Output Schema

NameRequiredDescription
uidNoPublication UID.
kindNoUpdate kind, e.g. "investigating" or "resolved".
staleNoTrue when the linked incident has resolved while the entry is still open.
stateNoPublic state: investigating, identified, monitoring or resolved.
titleNoCustomer-facing title.
severityNoPublic severity: minor, major or critical; absent when unset.
createdAtNoRFC3339 creation timestamp.
updatedAtNoRFC3339 last-update timestamp.
resolvedAtNoRFC3339 timestamp when it was resolved; absent while open.
autoCreatedNoTrue when the publication was created by the auto-publish pipeline.
incidentUidNoLinked internal incident UID, when the publication tracks one.
publishedAtNoRFC3339 timestamp when the entry appeared on the page.
unpublishedNoAlways true on success.
bodyMarkdownNoUpdate body in Markdown.
humanTouchedNoTrue once an operator edited it, which stops auto-resolve.
statusPageUidNoUID of the status page the publication lives on.
publicationUidNoUID of the publication removed from the page.

TDQS

A5/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses subscriber notifications with an hourly cap and webhook fanout for create/add_update/publish, append-only narrative entries, audit retention after unpublish, PATCH semantics on update, and the required mcp scope plus org role. The only imprecision is the claim that 'delete is one of its actions' when the enum exposes unpublish rather than delete, but the destructive/non-idempotent annotations themselves are not contradicted.

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

Conciseness5/5

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

Front-loads the resource identity and the safety warning before enumerating actions, then closes with side effects and auth. Dense but every sentence carries operational information an agent would otherwise have to guess.

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

Completeness5/5

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

Return values are covered by the output schema, so the description correctly spends its budget on side effects, permission requirements, append-only semantics and per-action argument requirements. Nothing needed to invoke a destructive multi-action tool correctly is missing.

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

Parameters5/5

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

Schema coverage is 100% so the baseline would be 3, but the description adds a per-action parameter map (pageIdentifier+title for create, publicationUid for update, kind+bodyMarkdown for add_update, incidentUid+publicationUid for unpublish) that the schema—whose only required field is action—does not encode. It also clarifies that publish templates the title from the page.

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

Purpose5/5

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

Names the specific resource (customer-facing status page incidents/publications) and the exact verb per action (create, update, add_update, publish, unpublish), including the parameters each requires. It explicitly distinguishes itself from list_incidents, which returns internal incidents, so the agent can tell the two apart without opening either schema.

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

Usage Guidelines5/5

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

Every action carries its use case and required arguments, and the description names the alternative path for reading publications (get_status_page with include=incidents). It also states when-not conditions via the warning that titles/bodies are customer-visible and must never contain probe output, error strings, hostnames or IPs.

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

manage_status_page_resourceManage status page resourceA
Destructive
Inspect

Pin, edit or unpin a resource (a check or a check group) in a status page section. action=create pins exactly one of checkUid or checkGroupUid and returns the resource. action=update edits one (resourceUid required; omitted fields are kept). action=delete unpins it, returning {deleted, identifier}; the check or group itself is untouched. Read a section's resources with get_status_page include=resources. Annotated destructive and non-idempotent because delete is one of its actions. Every action requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
actionYesWhat to do with the resource.
checkUidNoCheck UID or slug to pin (for example api-health). Mutually exclusive with checkGroupUid; exactly one is required.
positionNoDisplay position within the section
publicNameNoDisplay name for the public page (defaults to the check or group name)
explanationNoShort explanation rendered under the resource
resourceUidNoStatus page resource UID (get_status_page include=resources lists them).
checkGroupUidNoCheck group UID or slug to pin as one aggregated component. Mutually exclusive with checkUid; exactly one is required.
pageIdentifierYesStatus page UID or URL-friendly slug, e.g. "public".
sectionIdentifierYesStatus page section UID or URL-friendly slug, e.g. "api".

Output Schema

NameRequiredDescription
uidNoResource UID.
deletedNoAlways true on success.
checkUidNoPinned check UID, when the resource targets a check.
positionNoDisplay position within the section (smaller renders earlier).
identifierNoThe identifier that was deleted.
publicNameNoDisplay name shown on the public page.
explanationNoShort explanation rendered under the resource.
checkGroupUidNoPinned check group UID, when the resource targets a group.

TDQS

A4.6/5.0
Behavior4/5

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

Adds real context beyond annotations: it explains why destructive/non-idempotent applies (delete is one of its actions), guarantees the underlying check/group is untouched, states the return shape for delete, and documents the mcp scope plus user-role requirement. The remaining gap is minor since annotations already carry the safety profile.

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

Conciseness4/5

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

Front-loads the verb set and the three action branches in tight sentences; the trailing auth/scope sentence is useful but slightly dense, and the return-shape detail partially duplicates the output schema.

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

Completeness5/5

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

For a nine-parameter, three-mode mutation tool this covers the decisions an agent must make: which branch to invoke, which identifiers each branch needs, side effects, permissions, and where to read the current state.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description goes further by stating action-conditional requirements (resourceUid only for update, checkUid/checkGroupUid mutual exclusivity for create) and partial-update semantics that the schema itself does not encode.

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

Purpose5/5

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

Names a concrete resource (a check or check group pinned in a status page section) and enumerates the three operations with their distinct semantics, so it is clearly separable from sibling tools like manage_status_page_section and get_status_page.

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

Usage Guidelines5/5

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

Gives explicit per-action conditions (create pins exactly one of checkUid/checkGroupUid; update requires resourceUid and keeps omitted fields; delete unpins) and routes the agent to get_status_page include=resources for reading instead.

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

manage_status_page_sectionManage status page sectionA
Destructive
Inspect

Create, update or delete a section of a status page. action=create adds a section (name and slug required) and returns it. action=update edits one (sectionIdentifier required; omitted fields are kept) and returns it. action=delete permanently removes a section and every resource pinned in it, returning {deleted, identifier}. Read a page's sections with get_status_page include=sections. Annotated destructive and non-idempotent because delete is one of its actions. Every action requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
nameNoSection display name (required), e.g. "API services".
slugNoURL-friendly slug (required, unique within the page), e.g. "api".
actionYesWhat to do with the section.
positionNoDisplay position within the page (smaller renders earlier).
pageIdentifierYesStatus page UID or URL-friendly slug, e.g. "public".
sectionIdentifierNoStatus page section UID or URL-friendly slug, e.g. "api".

Output Schema

NameRequiredDescription
uidNoSection UID.
nameNoSection display name.
slugNoURL-friendly slug, unique within the page.
deletedNoAlways true on success.
positionNoDisplay position (smaller renders earlier).
selectorNoDynamic membership rule; absent on hand-curated sections.
identifierNoThe identifier that was deleted.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that delete cascades to 'every resource pinned in it', that update preserves omitted fields, the return shapes per action, and the exact auth requirements (mcp scope; mcp:read tokens refused; minimum user role). This is exactly the kind of consequence and permission detail an agent cannot infer from destructiveHint alone.

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

Conciseness4/5

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

Front-loaded with the action enumeration, then requirements, then return values, then auth. A few phrases are redundant ('and returns it' twice) and the sentence explaining why it is annotated destructive/non-idempotent partly restates structured data, but nothing is filler.

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

Completeness5/5

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

For a mutating multi-action tool with six parameters, the description covers mode selection, conditional requirements, destructive cascade, return shape, an alternative for reads, and auth/role gating. Nothing an agent needs in order to call it safely is missing; an output schema exists so return values need no elaboration.

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

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3, but the description adds conditional requirements the schema cannot express: name and slug are required only for create, sectionIdentifier only for update, and omitted fields are retained on update. That materially improves correct invocation.

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

Purpose5/5

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

States a specific verb set and resource ('Create, update or delete a section of a status page') and then disambiguates the three modes by action value. It also names the sibling read path (get_status_page include=sections), so the tool is distinguishable without opening the schema.

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

Usage Guidelines4/5

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

Gives an explicit alternative for the read case ('Read a page's sections with get_status_page include=sections') and per-action prerequisites. It does not route the related-but-different 'pinned resources' concern to manage_status_page_resource, which a sibling tool covers, so the guidance 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.

probeProbe a targetA
Read-onlyIdempotent
Inspect

Explore a target and test a js check before create_check, without saving anything. kind=script runs a js check script exactly as a SolidPing worker would and returns status, output (with console) and metrics; env carries plaintext parameters and secrets only NAMES the secret parameters, which run empty. kind=fetch GETs a URL from the server. kind=browser snapshots a page to pick selectors for browser steps. kind selects the mode; the other params apply only to their kind (script: script/env/secrets/timeout; fetch and browser: url). Reaches the URL or script target you name. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
envNoPlaintext parameters exposed as env.NAME, e.g. {"BASE_URL": "https://acme.com"}.
urlNoAbsolute http(s) URL.
kindYesWhat to run. "script": run a js check script once (needs script). "fetch": HTTP GET url and return status, headers and the first 16 KB of the body. "browser": open url in the headless browser and return its accessibility-style tree with a CSS selector per element.
scriptNoThe js check script (a function body that returns {status, ...}).
secretsNoNames of the secret parameters the script reads; they run empty.
timeoutNoRun timeout as a duration string (default and max 30s).

Output Schema

NameRequiredDescription
outputNoThe script's output object, with console output under `console`.
statusYesup, down, timeout or error, as a SolidPing worker would report it.
metricsNoThe script's metrics.
durationMsNoRun duration in milliseconds.

TDQS

A4.4/5.0
Behavior4/5

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

Adds real behavioral detail beyond the annotations: nothing is persisted, secrets resolve to empty values (a non-obvious and important caveat), env is plaintext, and the timeout default/max is 30s. It also names the auth scope (mcp:read tokens). The return-value recount partially duplicates the existing output schema.

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

Conciseness4/5

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

Front-loaded with purpose and the create_check relationship, then organized mode-by-mode. Sentences are dense but each clause carries information; only the 'Reaches the URL or script target you name' line is close to filler.

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

Completeness5/5

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

For a six-parameter, three-mode tool with an output schema, this covers everything an agent needs: mode semantics, per-mode parameter applicability, secret handling, timeout bounds, and auth scope. Errors and non-http URL handling are the only untraced corners.

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

Parameters4/5

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

Schema coverage is 100%, so the bar is the baseline of 3, and the description exceeds it by explaining the cross-parameter rule: the other params apply only to their kind (script/env/secrets/timeout for script; url for fetch and browser). That conditional mapping is not expressible in the flat schema.

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

Purpose5/5

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

States a specific verb (probe/explore) and resource (target), then enumerates the three distinct modes (script/fetch/browser) with what each returns. It explicitly positions itself against create_check, so an agent can distinguish it from the sibling 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.

Usage Guidelines4/5

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

Gives a clear when-to-use: testing a js check before create_check, with an explicit 'without saving anything' exclusion. It does not, however, contrast with the closely related run_check or validate_check siblings, which an agent must resolve on its own.

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

run_checkRun check nowAInspect

Run a check once, now, in every region, instead of waiting for its next period (use it right after a fix, or on a freshly created check). The run goes through the normal result path: it can open or resolve an incident like any scheduled run. Rate limited per check and per organization. A region status of queued means due now, or right after the run in progress; read the outcome with diagnose_check or list_results (a result with periodStart >= requestedAt). Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
identifierYesCheck UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3".

Output Schema

NameRequiredDescription
regionsYesOne entry per region.
requestedAtYesRFC3339 time the request was recorded.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false, but the description adds context the annotations cannot: rate limits per check and per organization, that the run goes through the normal result path and can open or resolve an incident, the queued region-status semantics, and the exact auth requirements (mcp scope; mcp:read tokens refused; user role required). This is rich behavioral disclosure consistent with the annotations.

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

Conciseness4/5

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

It is front-loaded with the core action and flows logically into side effects, rate limits, outcome reading, and auth. It is dense with several parentheticals, but each sentence carries distinct, non-redundant information; slightly more compression would earn a 5.

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

Completeness5/5

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

For a mutation-like trigger tool with an output schema, the description supplies everything an agent needs beyond the structured fields: when to call it, side effects on incidents, rate-limit behavior, region status semantics, where to read the result, and permission prerequisites.

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

Parameters3/5

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

Schema description coverage is 100% and the single identifier parameter is fully documented in the schema (UID or slug, examples, length bounds). The description adds no parameter-level syntax or constraints beyond what is already structured, so the baseline 3 applies.

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

Purpose5/5

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

A specific verb and resource with exact scope: run a check once, now, in every region, contrasted with waiting for its next period. An agent can distinguish this from sibling tools like get_check or list_results without opening any schema.

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

Usage Guidelines5/5

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

It states when to use it (right after a fix, or on a freshly created check) and names the alternatives for reading the outcome (diagnose_check or list_results, with the periodStart >= requestedAt discriminator). Nothing is left to inference about choosing this tool over a scheduled run or a read tool.

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

update_checkUpdate checkA
Idempotent
Inspect

Update an existing check by UID or slug and return the updated check. PATCH semantics — only the fields you pass are modified, others stay as-is. Use create_check to make a new check and delete_check to remove one; to pause without deleting, set enabled:false instead. Modifies the check in place without consuming quota; reversible by updating again with the previous values. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
nameNoNew human-readable name, e.g. "API production".
slugNoNew URL-friendly slug, e.g. "api-prod".
configNoReplace check-specific config (full object — not merged).
labelsNoReplace labels object (empty object clears all). Example: {"env":"staging"}.
periodNoNew check interval as HH:MM:SS, e.g. "00:00:30" for 30 seconds.
enabledNoToggle whether the check runs. Set to false to pause the check, true to resume it.
regionsNoPin the check to exactly these regions, e.g. ["eu-west-1","us-east-1"] (placement becomes "pinned"). An empty array puts the check back on the default placement: automatic across regionCount healthy regions (unless the org's own default_regions names a private location, which pins it to those defaults). The check keeps running either way; use enabled: false to stop it.
placementNoSwitch the placement: "auto" lets the scheduler place the check (keeping its current region count and every current region still healthy) and move it off a region that goes dark; "pinned" freezes the current regions unless regions is also given.
failQuorumNoMulti-region quorum: how many of the check's regions must be failing, for the confirmation period, before it is down and an incident opens. "all", "majority" or a whole number such as "2" (clamped to the region count). The default is all regions for 1-2 regions and a majority for 3+. Fewer failing regions than the quorum is a "regional issue": the check shows warning and no incident opens. "all" keeps the per-result rule: any passing region resets the confirmation. Pass "default" to put the check back on the default.
identifierYesCheck UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3".
regionPoolNoAutomatic placement only: candidate cloud region slugs; an empty array means any. Implies placement auto.
descriptionNoUpdated free-text description shown in the UI.
regionCountNoAutomatic placement only: how many regions run the check. Implies placement auto.
checkGroupUidNoMove to a different group (UID or slug). Pass an empty string to ungroup.
resolveOpenIncidentsNoWith enabled:false, also close the check's open incidents (resolution type check_disabled).
recoveryPeriodSecondsNoWall-clock seconds the check must stay UP before auto-resolving. Any failure inside the window resets the recovery clock. 0 = resolve immediately. Range 0–86400.
confirmationPeriodSecondsNoWall-clock seconds to wait after the first failure before opening an incident. 0 = open immediately. Range 0–86400 (one day).

Output Schema

NameRequiredDescription
uidYesCheck UID.
nameNoHuman-readable name.
slugNoURL-friendly slug.
typeNoCheck type, e.g. "http".
configNoCheck-specific configuration for the type.
labelsNoKey-value labels.
periodNoCheck interval as HH:MM:SS.
statusNoSynthesized status: up, down, validating, created or degraded.
enabledNoWhether the check runs.
regionsNoRegions the check runs from.
createdAtNoRFC3339 creation timestamp.
placementNo"pinned" or "auto".
descriptionNoFree-text description.
lastResultAtNoRFC3339 timestamp of the newest real result.
checkGroupUidNoCheck group UID, when the check belongs to a group.
statusChangedAtNoRFC3339 timestamp of the last status change.

TDQS

A4.9/5.0
Behavior5/5

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

The description adds substantial behavior beyond the annotations: PATCH semantics, in-place modification, no quota consumption, reversibility, and required mcp scope plus user role. These details are directly useful for safe invocation and are consistent with the readOnly=false and destructive=false annotations.

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

Conciseness5/5

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

The description is front-loaded with the core action and scope, then covers alternatives, side effects, and auth requirements in a compact form. Every sentence contributes useful operational context for a 17-parameter mutation tool.

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

Completeness5/5

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

Given the rich input schema, output schema, and annotations, the description supplies the remaining high-value context: PATCH behavior, safety, quota impact, reversibility, and authorization. Nothing essential for correct tool selection or invocation is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the individual parameter descriptions already carry most semantics. The description still adds meaningful cross-parameter behavior by stating PATCH semantics: only passed fields are modified and all others remain unchanged.

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

Purpose5/5

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

The description states a specific verb and resource: update an existing check by UID or slug and return the updated check. It also explicitly distinguishes this tool from create_check and delete_check, so an agent can identify its role among siblings without inspecting schemas.

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

Usage Guidelines5/5

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

It gives explicit alternatives: create_check for new checks, delete_check for removal, and enabled:false for pausing without deleting. That covers the main decision points an agent needs before choosing this tool.

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

update_status_pageUpdate status pageA
Idempotent
Inspect

Update an existing status page by UID or slug and return the updated page. PATCH semantics — only fields you pass change, omitted fields keep their current values; the page must already exist and a slug that collides with another page is rejected. Use create_status_page to make a new page and delete_status_page to remove one instead. Modifies the page in place, so it is reversible by updating again with the previous values. Requires the mcp scope (mcp:read tokens are refused) and at least the user role in the organization.

NameRequiredDescriptionDefault
nameNoNew display name, e.g. "Public status page".
slugNoNew URL-friendly slug, e.g. "public".
enabledNoEnable or disable the public-facing page.
languageNoLanguage code, e.g. "en" or "fr".
customCssNoCustom CSS injected into the public page as a <style> element (see create_status_page). Max 64 KB; @import is rejected. Pass an empty string to clear it.
isDefaultNoMark as the org's default page (only one allowed).
identifierYesStatus page UID or URL-friendly slug, e.g. "public".
visibilityNoVisibility setting. Allowed: "public", "private".
autoPublishNoAutomatically publish incidents affecting this page's resources as public incidents. New pages default to true; pages that existed before this feature shipped default to false.
autoResolveNoWhat an auto-created publication does when its incident resolves. Allowed: "always", "if_untouched" (default — a publication a human has edited is left for them to close), "never".
descriptionNoNew free-text description shown in the UI.
historyDaysNoDays of history to show on the page (default 90).
showAvailabilityNoToggle availability percentage on the public page.
showResponseTimeNoToggle response-time charts on the public page.
autoPublishDelaySecondsNoDebounce in seconds before an incident becomes public (default 60). 0 publishes immediately. An incident that resolves inside the delay is never published at all.

Output Schema

NameRequiredDescription
uidYesStatus page UID.
nameNoDisplay name.
slugNoURL-friendly slug.
enabledNoWhether the public page is served.
createdAtNoRFC3339 creation timestamp.
isDefaultNoWhether this is the organization's default page.
visibilityNo"public", "private" or "password".
historyPeriodNoHistory window: "24h", "7d", "30d" or "90d".

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so safety is partly pre-covered; the description still adds substantial context: PATCH semantics for omitted fields, reversibility by re-updating with previous values, the required mcp scope (mcp:read refused) and minimum user role. The only gap is that it doesn't note side effects of toggling isDefault/visibility on other pages.

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

Conciseness4/5

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

Front-loaded with the mutation and its identifier, then partial-update semantics, error cases, alternatives and auth in a tight progression with no filler. It is dense with clauses, but each sentence carries distinct operational information.

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

Completeness5/5

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

With 15 parameters, an existing output schema, and rich annotations, the description covers everything an agent needs before calling: identity resolution, partial-update contract, failure modes, sibling routing, reversibility and authorization. Return-value details are correctly left to the output schema.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns an extra point by explaining that only supplied fields change and omitted ones retain current values — a semantic not derivable from the schema of 15 optional properties plus one required identifier. It doesn't add per-field details beyond the schema, which already documents enums, defaults and limits.

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

Purpose5/5

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

Specific verb+resource ("Update an existing status page by UID or slug and return the updated page") with the identifier form stated up front. It explicitly names the sibling tools it is not (create_status_page, delete_status_page), so an agent can route without opening another schema.

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

Usage Guidelines5/5

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

States both when to use (page must already exist, PATCH-style partial update) and when not to (use create_status_page for new pages, delete_status_page to remove). It also names a concrete failure condition — a colliding slug is rejected — which an agent needs to avoid a wasted call.

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

validate_checkValidate checkA
Read-onlyIdempotent
Inspect

Dry-run validate a check config without creating or changing anything — a pure read, no side effects. valid is false exactly when fields lists the blocking findings (every one of them, not just the first), while warnings are advisory notes that never block. Use this before create_check when you've assembled a config from scratch or modified a sample, to catch problems early. Read-only: works with mcp:read tokens.

NameRequiredDescriptionDefault
typeYesCheck type (e.g. "http", "dns", "tcp", "icmp", "ssl").
configYesCheck-specific config to validate (e.g., {"url": "https://example.com"}).

Output Schema

NameRequiredDescription
validYesTrue when the config would be accepted; false when at least one blocking finding exists.
fieldsNoBlocking findings; absent when there are none (valid stays true).
warningsNoAdvisory findings that never block; absent when there are none.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/non-destructive, yet the description still adds value: it discloses the auth scope ('works with mcp:read tokens') and explains that valid=false corresponds exactly to a non-empty, complete fields list while warnings never block. That is behavioral context an agent would otherwise have to infer.

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

Conciseness4/5

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

The read-only guarantee is front-loaded and every sentence carries information about behavior or routing. There is mild redundancy between 'pure read, no side effects' and the closing 'Read-only: works with mcp:read tokens', but the second sentence adds the token scope.

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

Completeness4/5

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

Covers the operation's semantics, safety profile, auth requirement, and the create_check workflow. With an output schema present it didn't need to explain returns, and what it does say about valid/fields/warnings is a useful supplement rather than a gap-filler.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents 'type' with examples and describes 'config' as check-specific. The description adds no meaning about either parameter, so the baseline 3 applies; the nested config object remains generic in both places.

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

Purpose5/5

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

States a specific verb and resource ('Dry-run validate a check config') and immediately scopes it as a non-mutating operation. The contrast with create_check makes it clearly distinguishable from the mutating sibling.

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

Usage Guidelines4/5

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

Gives an explicit condition ('Use this before create_check when you've assembled a config from scratch or modified a sample'), naming both the alternative and the trigger. It does not address why one would choose this over run_check or diagnose_check, but the dry-run framing implies that division.

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

Tool Schema Changelog

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

  1. 20 tool updatesv0.42.0
    • Changedcreate_check8 fields changed
      • addedInput schema / properties / checkGroupUid / maxLength
        Added value: +2048
      • addedInput schema / properties / description / maxLength
        Added value: +2048
      • addedInput schema / properties / failQuorum / maxLength
        Added value: +2048
      • addedInput schema / properties / name / maxLength
        Added value: +2048
      • addedInput schema / properties / period / maxLength
        Added value: +2048
      • addedInput schema / properties / placement / maxLength
        Added value: +2048
      • addedInput schema / properties / slug / maxLength
        Added value: +2048
      • addedInput schema / properties / type / maxLength
        Added value: +2048
    • Changedcreate_status_page9 fields changed
      • addedInput schema / properties / autoResolve / maxLength
        Added value: +2048
      • addedInput schema / properties / customCss / maxLength
        Added value: +65536
      • addedInput schema / properties / description / maxLength
        Added value: +2048
      • addedInput schema / properties / language / maxLength
        Added value: +2048
      • addedInput schema / properties / name / maxLength
        Added value: +2048
      • addedInput schema / properties / name / minLength
        Added value: +1
      • addedInput schema / properties / slug / maxLength
        Added value: +2048
      • addedInput schema / properties / slug / minLength
        Added value: +1
      • addedInput schema / properties / visibility / maxLength
        Added value: +2048
    • Changeddelete_check2 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
    • Changeddelete_status_page2 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
    • Changeddiagnose_check2 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
    • Changedget_check3 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
      • addedInput schema / properties / with / maxLength
        Added value: +2048
    • Changedget_incident4 fields changed
      • addedInput schema / properties / status / maxLength
        Added value: +2048
      • addedInput schema / properties / uid / maxLength
        Added value: +2048
      • addedInput schema / properties / uid / minLength
        Added value: +1
      • addedInput schema / properties / with / maxLength
        Added value: +2048
    • Changedget_status_page5 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
      • addedInput schema / properties / sectionIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / state / maxLength
        Added value: +2048
      • addedInput schema / properties / with / maxLength
        Added value: +2048
    • Changedlist_check_types1 field changed
      • addedInput schema / properties / type / maxLength
        Added value: +2048
    • Changedlist_checks5 fields changed
      • addedInput schema / properties / checkGroupUid / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / minLength
        Added value: +1
      • addedInput schema / properties / q / maxLength
        Added value: +2048
      • addedInput schema / properties / with / maxLength
        Added value: +2048
    • Changedlist_incidents9 fields changed
      • addedInput schema / properties / checkUid / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / minLength
        Added value: +1
      • addedInput schema / properties / order
        Added value: +{
        +  "description": "Sort order on start time: \"desc\" (default, newest first) or \"asc\" (oldest first; the cursor then means strictly after, and is always returned).",
        +  "maxLength": 2048,
        +  "type": "string"
        +}
      • addedInput schema / properties / since / maxLength
        Added value: +2048
      • addedInput schema / properties / state / maxLength
        Added value: +2048
      • addedInput schema / properties / until / maxLength
        Added value: +2048
      • addedInput schema / properties / with / maxLength
        Added value: +2048
      • changedOutput schema / properties / pagination / properties / cursor / description
        Previous value: -"UID of the last incident on a full page; not applied when passed back."New value: +"Opaque cursor naming the last incident; pass it back as cursor."
    • Changedlist_results10 fields changed
      • addedInput schema / properties / checkType / maxLength
        Added value: +2048
      • addedInput schema / properties / checkUid / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / maxLength
        Added value: +2048
      • addedInput schema / properties / cursor / minLength
        Added value: +1
      • addedInput schema / properties / periodEndBefore / maxLength
        Added value: +2048
      • addedInput schema / properties / periodStartAfter / maxLength
        Added value: +2048
      • addedInput schema / properties / periodType / maxLength
        Added value: +2048
      • addedInput schema / properties / region / maxLength
        Added value: +2048
      • addedInput schema / properties / status / maxLength
        Added value: +2048
      • addedInput schema / properties / with / maxLength
        Added value: +2048
    • Changedmanage_status_page_incident10 fields changed
      • addedInput schema / properties / action / maxLength
        Added value: +2048
      • addedInput schema / properties / action / minLength
        Added value: +1
      • addedInput schema / properties / bodyMarkdown / maxLength
        Added value: +2048
      • addedInput schema / properties / incidentUid / maxLength
        Added value: +2048
      • addedInput schema / properties / kind / maxLength
        Added value: +2048
      • addedInput schema / properties / pageIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / publicationUid / maxLength
        Added value: +2048
      • addedInput schema / properties / severity / maxLength
        Added value: +2048
      • addedInput schema / properties / state / maxLength
        Added value: +2048
      • addedInput schema / properties / title / maxLength
        Added value: +2048
    • Changedmanage_status_page_resource11 fields changed
      • addedInput schema / properties / action / maxLength
        Added value: +2048
      • addedInput schema / properties / action / minLength
        Added value: +1
      • addedInput schema / properties / checkGroupUid / maxLength
        Added value: +2048
      • addedInput schema / properties / checkUid / maxLength
        Added value: +2048
      • addedInput schema / properties / explanation / maxLength
        Added value: +2048
      • addedInput schema / properties / pageIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / pageIdentifier / minLength
        Added value: +1
      • addedInput schema / properties / publicName / maxLength
        Added value: +2048
      • addedInput schema / properties / resourceUid / maxLength
        Added value: +2048
      • addedInput schema / properties / sectionIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / sectionIdentifier / minLength
        Added value: +1
    • Changedmanage_status_page_section7 fields changed
      • addedInput schema / properties / action / maxLength
        Added value: +2048
      • addedInput schema / properties / action / minLength
        Added value: +1
      • addedInput schema / properties / name / maxLength
        Added value: +2048
      • addedInput schema / properties / pageIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / pageIdentifier / minLength
        Added value: +1
      • addedInput schema / properties / sectionIdentifier / maxLength
        Added value: +2048
      • addedInput schema / properties / slug / maxLength
        Added value: +2048
    • Changedprobe5 fields changed
      • addedInput schema / properties / kind / maxLength
        Added value: +2048
      • addedInput schema / properties / kind / minLength
        Added value: +1
      • addedInput schema / properties / script / maxLength
        Added value: +65536
      • addedInput schema / properties / timeout / maxLength
        Added value: +2048
      • addedInput schema / properties / url / maxLength
        Added value: +2048
    • Changedrun_check2 fields changed
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
    • Changedupdate_check10 fields changed
      • addedInput schema / properties / checkGroupUid / maxLength
        Added value: +2048
      • addedInput schema / properties / description / maxLength
        Added value: +2048
      • addedInput schema / properties / failQuorum / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
      • addedInput schema / properties / name / maxLength
        Added value: +2048
      • addedInput schema / properties / period / maxLength
        Added value: +2048
      • addedInput schema / properties / placement / maxLength
        Added value: +2048
      • addedInput schema / properties / resolveOpenIncidents
        Added value: +{
        +  "description": "With enabled:false, also close the check's open incidents (resolution type check_disabled).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / slug / maxLength
        Added value: +2048
    • Changedupdate_status_page9 fields changed
      • addedInput schema / properties / autoResolve / maxLength
        Added value: +2048
      • addedInput schema / properties / customCss / maxLength
        Added value: +65536
      • addedInput schema / properties / description / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / maxLength
        Added value: +2048
      • addedInput schema / properties / identifier / minLength
        Added value: +1
      • addedInput schema / properties / language / maxLength
        Added value: +2048
      • addedInput schema / properties / name / maxLength
        Added value: +2048
      • addedInput schema / properties / slug / maxLength
        Added value: +2048
      • addedInput schema / properties / visibility / maxLength
        Added value: +2048
    • Changedvalidate_check2 fields changed
      • addedInput schema / properties / type / maxLength
        Added value: +2048
      • addedInput schema / properties / type / minLength
        Added value: +1
  2. 23 tool updatesv0.41.0
    • Changedcreate_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedcreate_status_page2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changeddelete_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changeddelete_status_page2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changeddiagnose_check3 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
      • addedOutput schema / properties / check / additionalProperties
        Added value: +false
    • Changedget_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedget_incident2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedget_status_page2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_check_groups2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_check_types2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_checks2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_incidents2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_regions2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_results2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedlist_status_pages2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedmanage_status_page_incident2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedmanage_status_page_resource2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedmanage_status_page_section2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedprobe2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedrun_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedupdate_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedupdate_status_page2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
    • Changedvalidate_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / additionalProperties
        Added value: +false
  3. 2 tool updatesv0.40.1
    • Changedcreate_check1 field changed
      • changedInput schema / properties / type / description
        Previous value: -"Check type. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health. Inferred from config if omitted."New value: +"Check type. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health, vendor-status. Inferred from config if omitted."
    • Changedlist_results1 field changed
      • changedInput schema / properties / checkType / description
        Previous value: -"Comma-separated check types. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health. Example: \"http,dns\"."New value: +"Comma-separated check types. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health, vendor-status. Example: \"http,dns\"."
  4. 47 tool updatesv0.38.5
    • Changedcreate_check8 fields changed
      • changedInput schema / properties / config / description
        Previous value: -"Check-specific config. Shape depends on type. Example for http: {\"url\": \"https://example.com\", \"method\": \"GET\"}. Use get_check_type_samples to discover the shape for other types."New value: +"Check-specific config. Shape depends on type. Example for http: {\"url\": \"https://example.com\", \"method\": \"GET\"}. Use list_check_types with type to discover the shape for other types."
      • addedInput schema / properties / failQuorum
        Added value: +{
        +  "description": "Multi-region quorum: how many of the check's regions must be failing, for the confirmation period, before it is down and an incident opens. \"all\", \"majority\" or a whole number such as \"2\" (clamped to the region count). The default is all regions for 1-2 regions and a majority for 3+. Fewer failing regions than the quorum is a \"regional issue\": the check shows warning and no incident opens. \"all\" keeps the per-result rule: any passing region resets the confirmation. Omit for the default.",
        +  "type": "string"
        +}
      • addedInput schema / properties / placement
        Added value: +{
        +  "description": "\"pinned\" or \"auto\". Omit to infer it: regions given means pinned, otherwise auto. \"auto\" cannot be combined with regions. Private (@) regions are pinned-only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / regionCount
        Added value: +{
        +  "description": "Automatic placement only: how many regions run the check (default 2, capped by the eligible regions and the org's checks-per-minute limit; the response carries a PLACEMENT_REGION_COUNT_REDUCED warning when reduced). Implies placement auto.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / regionPool
        Added value: +{
        +  "description": "Automatic placement only: the cloud region slugs the scheduler may choose from, e.g. [\"paris\",\"gravelines\"]. Omit for any cloud region. Implies placement auto.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / regions / description
        Previous value: -"Region slugs to run the check from, e.g. [\"eu-west-1\",\"us-east-1\"]. Defaults to all org regions when omitted."New value: +"Region slugs to pin the check to, e.g. [\"eu-west-1\",\"us-east-1\"]. An explicit list means placement \"pinned\": the check runs from exactly these regions and is never moved. When omitted, the check is placed automatically (placement \"auto\"): the scheduler picks regionCount healthy regions from the org's default_regions, then the system default, then every other declared region, and moves the check off a region that goes dark. (An org whose own default_regions names a private location keeps pinned checks on those defaults.)"
      • changedInput schema / properties / type / description
        Previous value: -"Check type. Allowed: http, tcp, icmp, dns, ssl, heartbeat, domain. Inferred from config if omitted."New value: +"Check type. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health. Inferred from config if omitted."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "checkGroupUid": {
        +      "description": "Check group UID, when the check belongs to a group.",
        +      "type": "string"
        +    },
        +    "config": {
        +      "description": "Check-specific configuration for the type.",
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "description": {
        +      "description": "Free-text description.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the check runs.",
        +      "type": "boolean"
        +    },
        +    "labels": {
        +      "description": "Key-value labels.",
        +      "type": "object"
        +    },
        +    "lastResultAt": {
        +      "description": "RFC3339 timestamp of the newest real result.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Human-readable name.",
        +      "type": "string"
        +    },
        +    "period": {
        +      "description": "Check interval as HH:MM:SS.",
        +      "type": "string"
        +    },
        +    "placement": {
        +      "description": "\"pinned\" or \"auto\".",
        +      "type": "string"
        +    },
        +    "regions": {
        +      "description": "Regions the check runs from.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Synthesized status: up, down, validating, created or degraded.",
        +      "type": "string"
        +    },
        +    "statusChangedAt": {
        +      "description": "RFC3339 timestamp of the last status change.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Check type, e.g. \"http\".",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Check UID.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedcreate_incident_publication
    • Removedcreate_integration
    • Removedcreate_maintenance_window
    • Changedcreate_status_page2 fields changed
      • changedInput schema / properties / visibility / description
        Previous value: -"Visibility setting. Allowed: \"public\", \"private\". Default depends on system config."New value: +"Visibility setting. Allowed: \"public\", \"private\". Default \"public\"."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the public page is served.",
        +      "type": "boolean"
        +    },
        +    "historyPeriod": {
        +      "description": "History window: \"24h\", \"7d\", \"30d\" or \"90d\".",
        +      "type": "string"
        +    },
        +    "isDefault": {
        +      "description": "Whether this is the organization's default page.",
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "description": "Display name.",
        +      "type": "string"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Status page UID.",
        +      "type": "string"
        +    },
        +    "visibility": {
        +      "description": "\"public\", \"private\" or \"password\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedcreate_status_page_incident
    • Removedcreate_status_page_incident_update
    • Removedcreate_status_page_resource
    • Removedcreate_status_page_section
    • Changeddelete_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "Always true on success.",
        +      "type": "boolean"
        +    },
        +    "identifier": {
        +      "description": "The UID or slug that was deleted.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "deleted",
        +    "identifier"
        +  ],
        +  "type": "object"
        +}
    • Removeddelete_incident_publication
    • Removeddelete_maintenance_window
    • Changeddelete_status_page1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "deleted": {
        +      "description": "Always true on success.",
        +      "type": "boolean"
        +    },
        +    "identifier": {
        +      "description": "The identifier that was deleted.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "deleted",
        +    "identifier"
        +  ],
        +  "type": "object"
        +}
    • Removeddelete_status_page_resource
    • Removeddelete_status_page_section
    • Changeddiagnose_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "activeIncident": {
        +      "description": "Currently-open incident for the check, or null when none is open.",
        +      "properties": {
        +        "checkUid": {
        +          "description": "UID of the check the incident belongs to.",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "description": "What the incident is about: check, slo_burn or degraded.",
        +          "type": "string"
        +        },
        +        "number": {
        +          "description": "Short per-org reference, rendered as #42.",
        +          "type": "integer"
        +        },
        +        "resolvedAt": {
        +          "description": "RFC3339 resolution timestamp; absent while the incident is open.",
        +          "type": "string"
        +        },
        +        "startedAt": {
        +          "description": "RFC3339 timestamp of the incident's onset.",
        +          "type": "string"
        +        },
        +        "state": {
        +          "description": "Incident state, e.g. active or resolved.",
        +          "type": "string"
        +        },
        +        "uid": {
        +          "description": "Incident UID.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "check": {
        +      "properties": {
        +        "checkGroupUid": {
        +          "description": "Check group UID, when the check belongs to a group.",
        +          "type": "string"
        +        },
        +        "config": {
        +          "description": "Check-specific configuration for the type.",
        +          "type": "object"
        +        },
        +        "createdAt": {
        +          "description": "RFC3339 creation timestamp.",
        +          "type": "string"
        +        },
        +        "description": {
        +          "description": "Free-text description.",
        +          "type": "string"
        +        },
        +        "enabled": {
        +          "description": "Whether the check runs.",
        +          "type": "boolean"
        +        },
        +        "labels": {
        +          "description": "Key-value labels.",
        +          "type": "object"
        +        },
        +        "lastResultAt": {
        +          "description": "RFC3339 timestamp of the newest real result.",
        +          "type": "string"
        +        },
        +        "name": {
        +          "description": "Human-readable name.",
        +          "type": "string"
        +        },
        +        "period": {
        +          "description": "Check interval as HH:MM:SS.",
        +          "type": "string"
        +        },
        +        "placement": {
        +          "description": "\"pinned\" or \"auto\".",
        +          "type": "string"
        +        },
        +        "regions": {
        +          "description": "Regions the check runs from.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "slug": {
        +          "description": "URL-friendly slug.",
        +          "type": "string"
        +        },
        +        "status": {
        +          "description": "Synthesized status: up, down, validating, created or degraded.",
        +          "type": "string"
        +        },
        +        "statusChangedAt": {
        +          "description": "RFC3339 timestamp of the last status change.",
        +          "type": "string"
        +        },
        +        "type": {
        +          "description": "Check type, e.g. \"http\".",
        +          "type": "string"
        +        },
        +        "uid": {
        +          "description": "Check UID.",
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "uid"
        +      ],
        +      "type": "object"
        +    },
        +    "freshness": {
        +      "description": "One sentence per silent region naming it and since when it has gone quiet; empty when every region is reporting.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "lastResolvedIncident": {
        +      "description": "Most recently resolved incident for the check, or null when there is none.",
        +      "properties": {
        +        "checkUid": {
        +          "description": "UID of the check the incident belongs to.",
        +          "type": "string"
        +        },
        +        "kind": {
        +          "description": "What the incident is about: check, slo_burn or degraded.",
        +          "type": "string"
        +        },
        +        "number": {
        +          "description": "Short per-org reference, rendered as #42.",
        +          "type": "integer"
        +        },
        +        "resolvedAt": {
        +          "description": "RFC3339 resolution timestamp; absent while the incident is open.",
        +          "type": "string"
        +        },
        +        "startedAt": {
        +          "description": "RFC3339 timestamp of the incident's onset.",
        +          "type": "string"
        +        },
        +        "state": {
        +          "description": "Incident state, e.g. active or resolved.",
        +          "type": "string"
        +        },
        +        "uid": {
        +          "description": "Incident UID.",
        +          "type": "string"
        +        }
        +      },
        +      "type": [
        +        "object",
        +        "null"
        +      ]
        +    },
        +    "recentResults": {
        +      "description": "Newest-first raw results, trimmed to recentResultsLimit per region; includes region, output and durationMs.",
        +      "items": {
        +        "properties": {
        +          "availabilityPct": {
        +            "description": "Uptime % for the bucket (with=availabilityPct, aggregated rows only).",
        +            "type": "number"
        +          },
        +          "checkName": {
        +            "description": "Check name (with=checkName).",
        +            "type": "string"
        +          },
        +          "checkSlug": {
        +            "description": "Check slug (with=checkSlug).",
        +            "type": "string"
        +          },
        +          "checkUid": {
        +            "description": "UID of the check this result belongs to.",
        +            "type": "string"
        +          },
        +          "durationMs": {
        +            "description": "Response time in ms (with=durationMs).",
        +            "type": "number"
        +          },
        +          "periodStart": {
        +            "description": "RFC3339 start of the period (raw: execution time).",
        +            "type": "string"
        +          },
        +          "periodType": {
        +            "description": "Aggregation level: raw, hour, day or month.",
        +            "type": "string"
        +          },
        +          "region": {
        +            "description": "Region the check ran in (with=region).",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Result status: up, down, created, running, abandoned…",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Result UID (time-ordered).",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "regionalIssue": {
        +      "description": "One sentence describing the regional issue (some, but fewer than the quorum, of the check's regions failing); empty when there is none.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "check",
        +    "recentResults",
        +    "activeIncident",
        +    "lastResolvedIncident"
        +  ],
        +  "type": "object"
        +}
    • Changedget_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "checkGroupUid": {
        +      "description": "Check group UID, when the check belongs to a group.",
        +      "type": "string"
        +    },
        +    "config": {
        +      "description": "Check-specific configuration for the type.",
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "description": {
        +      "description": "Free-text description.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the check runs.",
        +      "type": "boolean"
        +    },
        +    "labels": {
        +      "description": "Key-value labels.",
        +      "type": "object"
        +    },
        +    "lastResultAt": {
        +      "description": "RFC3339 timestamp of the newest real result.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Human-readable name.",
        +      "type": "string"
        +    },
        +    "period": {
        +      "description": "Check interval as HH:MM:SS.",
        +      "type": "string"
        +    },
        +    "placement": {
        +      "description": "\"pinned\" or \"auto\".",
        +      "type": "string"
        +    },
        +    "regions": {
        +      "description": "Regions the check runs from.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Synthesized status: up, down, validating, created or degraded.",
        +      "type": "string"
        +    },
        +    "statusChangedAt": {
        +      "description": "RFC3339 timestamp of the last status change.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Check type, e.g. \"http\".",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Check UID.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedget_check_type_samples
    • Changedget_incident4 fields changed
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Extra lists to return with the incident. An unknown value is an error.",
        +  "items": {
        +    "enum": [
        +      "notifications"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "With include=notifications: max attempts (1-500, default 20).",
        +  "type": "integer"
        +}
      • addedInput schema / properties / status
        Added value: +{
        +  "description": "With include=notifications: only attempts in this delivery status. Allowed: pending, sent, failed, cancelled, skipped.",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "check": {
        +      "description": "Underlying check, when requested with with=check.",
        +      "type": "object"
        +    },
        +    "checkName": {
        +      "description": "Name of that check.",
        +      "type": "string"
        +    },
        +    "checkSlug": {
        +      "description": "Slug of that check.",
        +      "type": "string"
        +    },
        +    "checkUid": {
        +      "description": "UID of the check the incident is about.",
        +      "type": "string"
        +    },
        +    "description": {
        +      "description": "Custom description, when one was set.",
        +      "type": "string"
        +    },
        +    "events": {
        +      "description": "Timeline events (status transitions, notifications, manual notes), newest first; present when with=events was passed.",
        +      "items": {
        +        "properties": {
        +          "actorName": {
        +            "description": "Display name of the acting user, when known.",
        +            "type": "string"
        +          },
        +          "actorType": {
        +            "description": "Who acted: system or user.",
        +            "type": "string"
        +          },
        +          "createdAt": {
        +            "description": "RFC3339 timestamp of the event.",
        +            "type": "string"
        +          },
        +          "eventType": {
        +            "description": "Event type, e.g. \"incident.created\".",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Event UID.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "failureCount": {
        +      "description": "Number of failures recorded for the incident.",
        +      "type": "integer"
        +    },
        +    "kind": {
        +      "description": "What the incident is about: check, slo_burn or degraded.",
        +      "type": "string"
        +    },
        +    "notifications": {
        +      "description": "Notification attempts, newest first; present when include=notifications was passed.",
        +      "items": {
        +        "properties": {
        +          "channelType": {
        +            "description": "Delivery channel, e.g. email or slack.",
        +            "type": "string"
        +          },
        +          "connection": {
        +            "description": "Targeted integration {uid, name, type}, or null when the target was a user.",
        +            "properties": {
        +              "name": {
        +                "description": "Integration name.",
        +                "type": "string"
        +              },
        +              "type": {
        +                "description": "Integration type, e.g. email or webhook.",
        +                "type": "string"
        +              },
        +              "uid": {
        +                "description": "Integration UID.",
        +                "type": "string"
        +              }
        +            },
        +            "type": [
        +              "object",
        +              "null"
        +            ]
        +          },
        +          "createdAt": {
        +            "description": "RFC3339 timestamp when the attempt was recorded.",
        +            "type": "string"
        +          },
        +          "error": {
        +            "description": "Delivery error; absent when there was none.",
        +            "type": "string"
        +          },
        +          "eventType": {
        +            "description": "Incident event that triggered the attempt.",
        +            "type": "string"
        +          },
        +          "incident": {
        +            "description": "Incident context {uid, title, state, startedAt}; absent unless the query filled it.",
        +            "properties": {
        +              "startedAt": {
        +                "description": "RFC3339 incident start.",
        +                "type": "string"
        +              },
        +              "state": {
        +                "description": "Incident state: active or resolved.",
        +                "type": "string"
        +              },
        +              "title": {
        +                "description": "Incident title.",
        +                "type": "string"
        +              },
        +              "uid": {
        +                "description": "Incident UID.",
        +                "type": "string"
        +              }
        +            },
        +            "type": "object"
        +          },
        +          "incidentUid": {
        +            "description": "Incident the attempt belongs to.",
        +            "type": "string"
        +          },
        +          "messageId": {
        +            "description": "Provider message ID; absent when the channel did not return one.",
        +            "type": "string"
        +          },
        +          "repeatIndex": {
        +            "description": "Escalation repeat round; absent for direct sends.",
        +            "type": "integer"
        +          },
        +          "sentAt": {
        +            "description": "RFC3339 timestamp when it was delivered; absent until sent.",
        +            "type": "string"
        +          },
        +          "skipReason": {
        +            "description": "Why the attempt was skipped; absent when it was not skipped.",
        +            "type": "string"
        +          },
        +          "source": {
        +            "description": "What triggered it, e.g. check_connection, escalation_user or escalation_schedule.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Delivery status: pending, sent, failed, cancelled or skipped.",
        +            "type": "string"
        +          },
        +          "stepUid": {
        +            "description": "Escalation step that produced the attempt; absent for direct sends.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Notification row UID.",
        +            "type": "string"
        +          },
        +          "user": {
        +            "description": "Targeted user {uid, name}, or null when the target was a connection.",
        +            "properties": {
        +              "name": {
        +                "description": "User display name.",
        +                "type": "string"
        +              },
        +              "uid": {
        +                "description": "User UID.",
        +                "type": "string"
        +              }
        +            },
        +            "type": [
        +              "object",
        +              "null"
        +            ]
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "number": {
        +      "description": "Short per-org reference, e.g. 42.",
        +      "type": "integer"
        +    },
        +    "relapseCount": {
        +      "description": "Number of times the incident reopened.",
        +      "type": "integer"
        +    },
        +    "resolvedAt": {
        +      "description": "RFC3339 timestamp when it resolved; absent while active.",
        +      "type": "string"
        +    },
        +    "startedAt": {
        +      "description": "RFC3339 timestamp when the incident opened.",
        +      "type": "string"
        +    },
        +    "state": {
        +      "description": "active or resolved.",
        +      "type": "string"
        +    },
        +    "title": {
        +      "description": "Custom title, when one was set.",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Incident UID.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedget_maintenance_window
    • Changedget_status_page5 fields changed
      • addedInput schema / properties / active
        Added value: +{
        +  "description": "With include=incidents: when true, only publications that are not resolved.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Extra lists to return with the page. An unknown value is an error. Do not combine \"sections\" with with=sections.",
        +  "items": {
        +    "enum": [
        +      "sections",
        +      "resources",
        +      "incidents"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / sectionIdentifier
        Added value: +{
        +  "description": "Section UID or slug whose resources include=resources returns (required with it).",
        +  "type": "string"
        +}
      • addedInput schema / properties / state
        Added value: +{
        +  "description": "With include=incidents: only publications in this public state. Allowed: \"investigating\", \"identified\", \"monitoring\", \"resolved\".",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the public page is served.",
        +      "type": "boolean"
        +    },
        +    "historyPeriod": {
        +      "description": "History window: \"24h\", \"7d\", \"30d\" or \"90d\".",
        +      "type": "string"
        +    },
        +    "incidents": {
        +      "description": "Incident publications on the page; present with include=incidents.",
        +      "items": {
        +        "properties": {
        +          "autoCreated": {
        +            "description": "True when the publication was created by the auto-publish pipeline.",
        +            "type": "boolean"
        +          },
        +          "createdAt": {
        +            "description": "RFC3339 creation timestamp.",
        +            "type": "string"
        +          },
        +          "humanTouched": {
        +            "description": "True once an operator edited it, which stops auto-resolve.",
        +            "type": "boolean"
        +          },
        +          "incidentUid": {
        +            "description": "Linked internal incident UID, when the publication tracks one.",
        +            "type": "string"
        +          },
        +          "publishedAt": {
        +            "description": "RFC3339 timestamp when the entry appeared on the page.",
        +            "type": "string"
        +          },
        +          "resolvedAt": {
        +            "description": "RFC3339 timestamp when it was resolved; absent while open.",
        +            "type": "string"
        +          },
        +          "severity": {
        +            "description": "Public severity: minor, major or critical; absent when unset.",
        +            "type": "string"
        +          },
        +          "stale": {
        +            "description": "True when the linked incident has resolved while the entry is still open.",
        +            "type": "boolean"
        +          },
        +          "state": {
        +            "description": "Public state: investigating, identified, monitoring or resolved.",
        +            "type": "string"
        +          },
        +          "statusPageUid": {
        +            "description": "UID of the status page the publication lives on.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Customer-facing title.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Publication UID.",
        +            "type": "string"
        +          },
        +          "updatedAt": {
        +            "description": "RFC3339 last-update timestamp.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "isDefault": {
        +      "description": "Whether this is the organization's default page.",
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "description": "Display name.",
        +      "type": "string"
        +    },
        +    "resources": {
        +      "description": "Resources of the section named by sectionIdentifier; present with include=resources.",
        +      "items": {
        +        "properties": {
        +          "checkGroupUid": {
        +            "description": "Pinned check group UID, when the resource targets a group.",
        +            "type": "string"
        +          },
        +          "checkUid": {
        +            "description": "Pinned check UID, when the resource targets a check.",
        +            "type": "string"
        +          },
        +          "explanation": {
        +            "description": "Short explanation rendered under the resource.",
        +            "type": "string"
        +          },
        +          "position": {
        +            "description": "Display position within the section (smaller renders earlier).",
        +            "type": "integer"
        +          },
        +          "publicName": {
        +            "description": "Display name shown on the public page.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Resource UID.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "sections": {
        +      "description": "Sections; absent unless with=sections (nested resources included) or include=sections (section metadata only) was passed.",
        +      "items": {
        +        "properties": {
        +          "name": {
        +            "description": "Section display name.",
        +            "type": "string"
        +          },
        +          "position": {
        +            "description": "Display position (smaller renders earlier).",
        +            "type": "integer"
        +          },
        +          "resources": {
        +            "description": "Pinned checks and groups of the section.",
        +            "items": {
        +              "properties": {
        +                "checkGroupUid": {
        +                  "description": "Pinned check group UID, when the resource targets a group.",
        +                  "type": "string"
        +                },
        +                "checkUid": {
        +                  "description": "Pinned check UID, when the resource targets a check.",
        +                  "type": "string"
        +                },
        +                "explanation": {
        +                  "description": "Short explanation rendered under the resource.",
        +                  "type": "string"
        +                },
        +                "position": {
        +                  "description": "Display position within the section (smaller renders earlier).",
        +                  "type": "integer"
        +                },
        +                "publicName": {
        +                  "description": "Display name shown on the public page.",
        +                  "type": "string"
        +                },
        +                "uid": {
        +                  "description": "Resource UID.",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "selector": {
        +            "description": "Dynamic membership rule; absent on hand-curated sections.",
        +            "type": "object"
        +          },
        +          "slug": {
        +            "description": "URL-friendly slug, unique within the page.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Section UID.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Status page UID.",
        +      "type": "string"
        +    },
        +    "visibility": {
        +      "description": "\"public\", \"private\" or \"password\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedincident_notifications_list
    • Changedlist_check_groups1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Check groups on this page.",
        +      "items": {
        +        "properties": {
        +          "checkCount": {
        +            "description": "Number of member checks.",
        +            "type": "integer"
        +          },
        +          "createdAt": {
        +            "description": "RFC3339 creation timestamp.",
        +            "type": "string"
        +          },
        +          "description": {
        +            "description": "Free-text description, when set.",
        +            "type": "string"
        +          },
        +          "escalationPolicyUid": {
        +            "description": "Group-level escalation policy member checks inherit, when set.",
        +            "type": "string"
        +          },
        +          "memberStatusCounts": {
        +            "description": "Per-status count of enabled member checks, e.g. {\"up\": 3, \"down\": 1}.",
        +            "type": "object"
        +          },
        +          "name": {
        +            "description": "Human-readable name.",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "URL-friendly slug.",
        +            "type": "string"
        +          },
        +          "sortOrder": {
        +            "description": "Display order among the org's groups.",
        +            "type": "integer"
        +          },
        +          "status": {
        +            "description": "Rollup of enabled member checks' statuses, recomputed on every read.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Check group UID.",
        +            "type": "string"
        +          },
        +          "updatedAt": {
        +            "description": "RFC3339 last-update timestamp.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_check_types2 fields changed
      • addedInput schema / properties / type
        Added value: +{
        +  "description": "Optional check type whose sample configs to return (e.g. \"http\", \"dns\", \"tcp\", \"icmp\", \"ssl\").",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Without type: check types this server supports, with their activation status. With type: one entry per matching check type, carrying its sample configs.",
        +      "items": {
        +        "properties": {
        +          "advisory": {
        +            "description": "Extra availability caveat for an enabled type; absent when there is none.",
        +            "type": "string"
        +          },
        +          "checkType": {
        +            "description": "Check type the samples belong to, e.g. \"http\".",
        +            "type": "string"
        +          },
        +          "defaultPeriodSeconds": {
        +            "description": "Default check interval in seconds; absent when there is no default.",
        +            "type": "integer"
        +          },
        +          "description": {
        +            "description": "Human-readable description of what the type monitors.",
        +            "type": "string"
        +          },
        +          "disabledReason": {
        +            "description": "Why the type is disabled; absent when there is nothing to say.",
        +            "type": "string"
        +          },
        +          "enabled": {
        +            "description": "Whether the type is available on this server.",
        +            "type": "boolean"
        +          },
        +          "labels": {
        +            "description": "Category labels for the type.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "maxPeriodSeconds": {
        +            "description": "Maximum check interval in seconds; absent when unbounded.",
        +            "type": "integer"
        +          },
        +          "minPeriodSeconds": {
        +            "description": "Minimum check interval in seconds; absent when unbounded.",
        +            "type": "integer"
        +          },
        +          "samples": {
        +            "description": "Ready-made configs to clone and modify.",
        +            "items": {
        +              "properties": {
        +                "config": {
        +                  "description": "Complete, valid config for the check type.",
        +                  "type": "object"
        +                },
        +                "name": {
        +                  "description": "Human-readable sample name.",
        +                  "type": "string"
        +                },
        +                "periodSeconds": {
        +                  "description": "Suggested check interval in seconds.",
        +                  "type": "integer"
        +                },
        +                "slug": {
        +                  "description": "URL-friendly sample slug.",
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "secretFields": {
        +            "description": "Top-level config keys the type stores encrypted.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "supportsIpVersion": {
        +            "description": "The type honors the shared ipVersion config key.",
        +            "type": "boolean"
        +          },
        +          "supportsTunnel": {
        +            "description": "The type can run through an SSH check's tunnel.",
        +            "type": "boolean"
        +          },
        +          "type": {
        +            "description": "Check type identifier, e.g. \"http\".",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_checks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Checks on this page.",
        +      "items": {
        +        "properties": {
        +          "checkGroupUid": {
        +            "description": "Check group UID, when the check belongs to a group.",
        +            "type": "string"
        +          },
        +          "config": {
        +            "description": "Check-specific configuration for the type.",
        +            "type": "object"
        +          },
        +          "createdAt": {
        +            "description": "RFC3339 creation timestamp.",
        +            "type": "string"
        +          },
        +          "description": {
        +            "description": "Free-text description.",
        +            "type": "string"
        +          },
        +          "enabled": {
        +            "description": "Whether the check runs.",
        +            "type": "boolean"
        +          },
        +          "labels": {
        +            "description": "Key-value labels.",
        +            "type": "object"
        +          },
        +          "lastResultAt": {
        +            "description": "RFC3339 timestamp of the newest real result.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Human-readable name.",
        +            "type": "string"
        +          },
        +          "period": {
        +            "description": "Check interval as HH:MM:SS.",
        +            "type": "string"
        +          },
        +          "placement": {
        +            "description": "\"pinned\" or \"auto\".",
        +            "type": "string"
        +          },
        +          "regions": {
        +            "description": "Regions the check runs from.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "slug": {
        +            "description": "URL-friendly slug.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Synthesized status: up, down, validating, created or degraded.",
        +            "type": "string"
        +          },
        +          "statusChangedAt": {
        +            "description": "RFC3339 timestamp of the last status change.",
        +            "type": "string"
        +          },
        +          "type": {
        +            "description": "Check type, e.g. \"http\".",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Check UID.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "pagination": {
        +      "description": "Cursor pagination state for the filter.",
        +      "properties": {
        +        "cursor": {
        +          "description": "Opaque cursor for the next page; absent on the last page.",
        +          "type": "string"
        +        },
        +        "limit": {
        +          "description": "Page size used for this response.",
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Total checks matching the filter.",
        +          "type": "integer"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_incidents1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Incidents on this page.",
        +      "items": {
        +        "properties": {
        +          "check": {
        +            "description": "Underlying check, when requested with with=check.",
        +            "type": "object"
        +          },
        +          "checkName": {
        +            "description": "Name of that check.",
        +            "type": "string"
        +          },
        +          "checkSlug": {
        +            "description": "Slug of that check.",
        +            "type": "string"
        +          },
        +          "checkUid": {
        +            "description": "UID of the check the incident is about.",
        +            "type": "string"
        +          },
        +          "description": {
        +            "description": "Custom description, when one was set.",
        +            "type": "string"
        +          },
        +          "failureCount": {
        +            "description": "Number of failures recorded for the incident.",
        +            "type": "integer"
        +          },
        +          "kind": {
        +            "description": "What the incident is about: check, slo_burn or degraded.",
        +            "type": "string"
        +          },
        +          "number": {
        +            "description": "Short per-org reference, e.g. 42.",
        +            "type": "integer"
        +          },
        +          "relapseCount": {
        +            "description": "Number of times the incident reopened.",
        +            "type": "integer"
        +          },
        +          "resolvedAt": {
        +            "description": "RFC3339 timestamp when it resolved; absent while active.",
        +            "type": "string"
        +          },
        +          "startedAt": {
        +            "description": "RFC3339 timestamp when the incident opened.",
        +            "type": "string"
        +          },
        +          "state": {
        +            "description": "active or resolved.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "Custom title, when one was set.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Incident UID.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "pagination": {
        +      "description": "Page state for the filter.",
        +      "properties": {
        +        "cursor": {
        +          "description": "UID of the last incident on a full page; not applied when passed back.",
        +          "type": "string"
        +        },
        +        "size": {
        +          "description": "Page size used for this response.",
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Total incidents matching the filter.",
        +          "type": "integer"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Removedlist_integrations
    • Removedlist_maintenance_windows
    • Changedlist_regions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Regions available to this organization.",
        +      "items": {
        +        "properties": {
        +          "capabilities": {
        +            "description": "Live worker capabilities, e.g. {\"ipv6\": \"yes\"} (\"yes\", \"no\" or \"unknown\").",
        +            "type": "object"
        +          },
        +          "emoji": {
        +            "description": "Region emoji shown in the UI.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Human-readable region label.",
        +            "type": "string"
        +          },
        +          "offlineSince": {
        +            "description": "RFC3339 timestamp of when the region went dark — the last time its workers were seen.",
        +            "type": "string"
        +          },
        +          "private": {
        +            "description": "Whether the region is an org-private location served by deported agents.",
        +            "type": "boolean"
        +          },
        +          "slug": {
        +            "description": "Region slug to pass in create_check/update_check; private regions are \"@\"-prefixed.",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "\"online\" or \"offline\" for cloud regions; omitted for private ones.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "defaultRegions": {
        +      "description": "The org's default region slugs, used when a check has no explicit regions.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_results2 fields changed
      • changedInput schema / properties / checkType / description
        Previous value: -"Comma-separated check types. Allowed: http, tcp, icmp, dns, ssl, heartbeat, domain. Example: \"http,dns\"."New value: +"Comma-separated check types. Allowed: http, tcp, icmp, dns, heartbeat, email, domain, ssl, smtp, udp, ssh, pop3, imap, websocket, postgresql, ftp, sftp, js, mysql, redis, mongodb, mssql, oracle, clickhouse, grpc, kafka, mqtt, a2s, minecraft, rabbitmq, snmp, docker, browser, freebox_line, dnsbl, sip, kubernetes, ntp, rdp, vnc, prometheus, private-location, crawl, health. Example: \"http,dns\"."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Result rows on this page: raw executions or aggregated rollups.",
        +      "items": {
        +        "properties": {
        +          "availabilityPct": {
        +            "description": "Uptime % for the bucket (with=availabilityPct, aggregated rows only).",
        +            "type": "number"
        +          },
        +          "checkName": {
        +            "description": "Check name (with=checkName).",
        +            "type": "string"
        +          },
        +          "checkSlug": {
        +            "description": "Check slug (with=checkSlug).",
        +            "type": "string"
        +          },
        +          "checkUid": {
        +            "description": "UID of the check this result belongs to.",
        +            "type": "string"
        +          },
        +          "durationMs": {
        +            "description": "Response time in ms (with=durationMs).",
        +            "type": "number"
        +          },
        +          "periodStart": {
        +            "description": "RFC3339 start of the period (raw: execution time).",
        +            "type": "string"
        +          },
        +          "periodType": {
        +            "description": "Aggregation level: raw, hour, day or month.",
        +            "type": "string"
        +          },
        +          "region": {
        +            "description": "Region the check ran in (with=region).",
        +            "type": "string"
        +          },
        +          "status": {
        +            "description": "Result status: up, down, created, running, abandoned…",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Result UID (time-ordered).",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "effectiveFilter": {
        +      "description": "Period filter that actually ran, after the tool's defaulting.",
        +      "properties": {
        +        "periodEndBefore": {
        +          "description": "Applied upper bound (RFC3339); absent when not requested.",
        +          "type": "string"
        +        },
        +        "periodStartAfter": {
        +          "description": "Applied lower bound (RFC3339); set by the default when not requested.",
        +          "type": "string"
        +        },
        +        "periodType": {
        +          "description": "Period types queried, e.g. [\"hour\"].",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "pagination": {
        +      "description": "Cursor pagination for this filter.",
        +      "properties": {
        +        "cursor": {
        +          "description": "Opaque cursor for the next page; absent on the last page.",
        +          "type": "string"
        +        },
        +        "size": {
        +          "description": "Page size used for this response.",
        +          "type": "integer"
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "window": {
        +      "description": "Time window the server actually queried.",
        +      "properties": {
        +        "clamped": {
        +          "description": "True when the server moved periodStartAfter forward (raw requests are clamped to the raw-retention band).",
        +          "type": "boolean"
        +        },
        +        "periodEndBefore": {
        +          "description": "Effective exclusive upper bound (RFC3339); absent when the query has none.",
        +          "type": "string"
        +        },
        +        "periodStartAfter": {
        +          "description": "Effective inclusive lower bound (RFC3339); absent when the query has none.",
        +          "type": "string"
        +        }
        +      },
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Removedlist_status_page_incidents
    • Removedlist_status_page_resources
    • Removedlist_status_page_sections
    • Changedlist_status_pages1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "Status pages in the organization.",
        +      "items": {
        +        "properties": {
        +          "createdAt": {
        +            "description": "RFC3339 creation timestamp.",
        +            "type": "string"
        +          },
        +          "enabled": {
        +            "description": "Whether the public page is served.",
        +            "type": "boolean"
        +          },
        +          "historyPeriod": {
        +            "description": "History window: \"24h\", \"7d\", \"30d\" or \"90d\".",
        +            "type": "string"
        +          },
        +          "isDefault": {
        +            "description": "Whether this is the organization's default page.",
        +            "type": "boolean"
        +          },
        +          "name": {
        +            "description": "Display name.",
        +            "type": "string"
        +          },
        +          "slug": {
        +            "description": "URL-friendly slug.",
        +            "type": "string"
        +          },
        +          "uid": {
        +            "description": "Status page UID.",
        +            "type": "string"
        +          },
        +          "visibility": {
        +            "description": "\"public\", \"private\" or \"password\".",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedmanage_status_page_incident
    • Addedmanage_status_page_resource
    • Addedmanage_status_page_section
    • Addedprobe
    • Addedrun_check
    • Removedset_maintenance_window_checks
    • Changedupdate_check7 fields changed
      • changedInput schema / properties / enabled / description
        Previous value: -"Toggle whether the check runs."New value: +"Toggle whether the check runs. Set to false to pause the check, true to resume it."
      • addedInput schema / properties / failQuorum
        Added value: +{
        +  "description": "Multi-region quorum: how many of the check's regions must be failing, for the confirmation period, before it is down and an incident opens. \"all\", \"majority\" or a whole number such as \"2\" (clamped to the region count). The default is all regions for 1-2 regions and a majority for 3+. Fewer failing regions than the quorum is a \"regional issue\": the check shows warning and no incident opens. \"all\" keeps the per-result rule: any passing region resets the confirmation. Pass \"default\" to put the check back on the default.",
        +  "type": "string"
        +}
      • addedInput schema / properties / placement
        Added value: +{
        +  "description": "Switch the placement: \"auto\" lets the scheduler place the check (keeping its current region count and every current region still healthy) and move it off a region that goes dark; \"pinned\" freezes the current regions unless regions is also given.",
        +  "type": "string"
        +}
      • addedInput schema / properties / regionCount
        Added value: +{
        +  "description": "Automatic placement only: how many regions run the check. Implies placement auto.",
        +  "type": "integer"
        +}
      • addedInput schema / properties / regionPool
        Added value: +{
        +  "description": "Automatic placement only: candidate cloud region slugs; an empty array means any. Implies placement auto.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / regions / description
        Previous value: -"Replace region list, e.g. [\"eu-west-1\",\"us-east-1\"]. Pass an empty array to run from no regions (effectively pauses execution)."New value: +"Pin the check to exactly these regions, e.g. [\"eu-west-1\",\"us-east-1\"] (placement becomes \"pinned\"). An empty array puts the check back on the default placement: automatic across regionCount healthy regions (unless the org's own default_regions names a private location, which pins it to those defaults). The check keeps running either way; use enabled: false to stop it."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "checkGroupUid": {
        +      "description": "Check group UID, when the check belongs to a group.",
        +      "type": "string"
        +    },
        +    "config": {
        +      "description": "Check-specific configuration for the type.",
        +      "type": "object"
        +    },
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "description": {
        +      "description": "Free-text description.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the check runs.",
        +      "type": "boolean"
        +    },
        +    "labels": {
        +      "description": "Key-value labels.",
        +      "type": "object"
        +    },
        +    "lastResultAt": {
        +      "description": "RFC3339 timestamp of the newest real result.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "Human-readable name.",
        +      "type": "string"
        +    },
        +    "period": {
        +      "description": "Check interval as HH:MM:SS.",
        +      "type": "string"
        +    },
        +    "placement": {
        +      "description": "\"pinned\" or \"auto\".",
        +      "type": "string"
        +    },
        +    "regions": {
        +      "description": "Regions the check runs from.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "Synthesized status: up, down, validating, created or degraded.",
        +      "type": "string"
        +    },
        +    "statusChangedAt": {
        +      "description": "RFC3339 timestamp of the last status change.",
        +      "type": "string"
        +    },
        +    "type": {
        +      "description": "Check type, e.g. \"http\".",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Check UID.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedupdate_maintenance_window
    • Changedupdate_status_page1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "createdAt": {
        +      "description": "RFC3339 creation timestamp.",
        +      "type": "string"
        +    },
        +    "enabled": {
        +      "description": "Whether the public page is served.",
        +      "type": "boolean"
        +    },
        +    "historyPeriod": {
        +      "description": "History window: \"24h\", \"7d\", \"30d\" or \"90d\".",
        +      "type": "string"
        +    },
        +    "isDefault": {
        +      "description": "Whether this is the organization's default page.",
        +      "type": "boolean"
        +    },
        +    "name": {
        +      "description": "Display name.",
        +      "type": "string"
        +    },
        +    "slug": {
        +      "description": "URL-friendly slug.",
        +      "type": "string"
        +    },
        +    "uid": {
        +      "description": "Status page UID.",
        +      "type": "string"
        +    },
        +    "visibility": {
        +      "description": "\"public\", \"private\" or \"password\".",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "uid"
        +  ],
        +  "type": "object"
        +}
    • Removedupdate_status_page_incident
    • Removedupdate_status_page_resource
    • Removedupdate_status_page_section
    • Changedvalidate_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "fields": {
        +      "description": "Blocking findings; absent when there are none (valid stays true).",
        +      "items": {
        +        "properties": {
        +          "code": {
        +            "description": "Stable machine-readable rule code, e.g. \"SLUG_TAKEN\"; absent when there is none.",
        +            "type": "string"
        +          },
        +          "message": {
        +            "description": "Human-readable description of the finding.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Field the finding is about, e.g. \"config\" or \"slug\".",
        +            "type": "string"
        +          },
        +          "severity": {
        +            "description": "error, warning or info; absent means error.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "valid": {
        +      "description": "True when the config would be accepted; false when at least one blocking finding exists.",
        +      "type": "boolean"
        +    },
        +    "warnings": {
        +      "description": "Advisory findings that never block; absent when there are none.",
        +      "items": {
        +        "properties": {
        +          "code": {
        +            "description": "Stable machine-readable rule code, e.g. \"SLUG_TAKEN\"; absent when there is none.",
        +            "type": "string"
        +          },
        +          "message": {
        +            "description": "Human-readable description of the finding.",
        +            "type": "string"
        +          },
        +          "name": {
        +            "description": "Field the finding is about, e.g. \"config\" or \"slug\".",
        +            "type": "string"
        +          },
        +          "severity": {
        +            "description": "error, warning or info; absent means error.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "valid"
        +  ],
        +  "type": "object"
        +}
  5. 42 tool updatesv0.32.1
    • First observedcreate_check
    • First observedcreate_incident_publication
    • First observedcreate_integration
    • First observedcreate_maintenance_window
    • First observedcreate_status_page
    • First observedcreate_status_page_incident
    • First observedcreate_status_page_incident_update
    • First observedcreate_status_page_resource
    • First observedcreate_status_page_section
    • First observeddelete_check
    • First observeddelete_incident_publication
    • First observeddelete_maintenance_window
    • First observeddelete_status_page
    • First observeddelete_status_page_resource
    • First observeddelete_status_page_section
    • First observeddiagnose_check
    • First observedget_check
    • First observedget_check_type_samples
    • First observedget_incident
    • First observedget_maintenance_window
    • First observedget_status_page
    • First observedincident_notifications_list
    • First observedlist_check_groups
    • First observedlist_check_types
    • First observedlist_checks
    • First observedlist_incidents
    • First observedlist_integrations
    • First observedlist_maintenance_windows
    • First observedlist_regions
    • First observedlist_results
    • First observedlist_status_page_incidents
    • First observedlist_status_page_resources
    • First observedlist_status_page_sections
    • First observedlist_status_pages
    • First observedset_maintenance_window_checks
    • First observedupdate_check
    • First observedupdate_maintenance_window
    • First observedupdate_status_page
    • First observedupdate_status_page_incident
    • First observedupdate_status_page_resource
    • First observedupdate_status_page_section
    • First observedvalidate_check

TDQS

A4.3/5.0

Scored across 23 tools

Disambiguation5/5

Descriptions aggressively cross-reference each other, explicitly steering the agent between near-neighbors: diagnose_check vs get_check vs list_checks vs list_results, validate_check vs probe vs run_check, and internal incidents (list_incidents/get_incident) vs customer-facing publications (manage_status_page_incident). The four status-page tools (page CRUD, section, resource, incident) each target a distinct resource. No two tools share a purpose.

Naming Consistency4/5

The dominant pattern is a clean verb_noun convention (list_checks, get_check, create_check, update_check, delete_check, create_status_page, list_regions, etc.). Deviations are limited: three multi-action tools use a manage_status_page_* prefix instead of create/update/delete triples, and `probe` stands alone as a bare verb. Readable and predictable overall, with one structural inconsistency.

Tool Count4/5

23 tools is at the upper end of reasonable, but the server covers six distinct sub-domains (checks, results, incidents, status pages with sections/resources/publications, check groups, regions, plus a probe sandbox). Consolidating the three non-page status-page editors into multi-action tools already trims the surface. Slightly heavy but each tool earns its place.

Completeness3/5

The check lifecycle is fully covered (list types, validate, create, get, update, delete, run, diagnose) and status pages have full CRUD plus section/resource/incident management. However, check groups are read-only — only list_check_groups exists, with no create/update/delete or membership handling — and there is no write path for incidents (no resolve/acknowledge) and no events tool despite incidents/events being referenced in descriptions.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for Uptrack uptime monitoring. Manage monitors and incidents from AI agents like Claude, ChatGPT, and Cursor.
    4 npm
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for Uptimepage uptime monitoring. An LLM client can read your monitors and incidents, run a check on demand, and post incident updates. Writes need an OAuth login and a scoped token, and each one is logged.
    50
    AGPL 3.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    Official Hyperping MCP server for uptime, API, cron and server monitoring. 26 tools covering monitors, outages and timelines, uptime, response time, MTTR and MTTA, on-call schedules and escalation policies, over a remote Streamable HTTP endpoint with Bearer token auth and no install.
    1
    MIT