SolidPing
OfficialSolidPing's MCP server lets you monitor, diagnose, and manage uptime checks plus public status pages through structured tools.
Browse/filter checks, inspect single checks, and get triage briefings with recent results and incidents.
Create, update, delete, validate, and run checks; discover supported check types and sample configs.
Query raw or aggregated monitoring results and list/get incidents with timelines and notification attempts.
Explore regions, check groups, and probe targets/scripts/browser pages before saving a check.
Manage status pages, sections, pinned resources, and customer-facing incident publications.
Allows monitoring ClickHouse database connectivity and query execution as a check type.
Provides Discord notifications and SSO integration.
Allows monitoring Docker container health as a check type.
Provides GitHub SSO integration for authentication.
Provides GitLab SSO integration for authentication.
Provides Google SSO integration for authentication.
Sends notifications to Google Chat.
Allows monitoring Kubernetes cluster and API server health as a check type.
Allows monitoring MariaDB connectivity and query execution as a check type.
Sends notifications to Mattermost.
Allows monitoring MongoDB with ping command as a check type.
Allows monitoring MQTT broker connectivity as a check type.
Allows monitoring MySQL connectivity and query execution as a check type.
Sends notifications to ntfy.
Provides OpenTelemetry observability integration.
Sends notifications and escalates incidents to PagerDuty.
Allows monitoring PostgreSQL connectivity and query execution as a check type.
Allows monitoring Prometheus endpoints and metrics as a check type, and exposes /metrics.
Allows monitoring RabbitMQ broker connectivity as a check type.
Allows monitoring Redis with PING command as a check type.
Provides Sentry error tracking integration.
Provides Slack notifications and SSO integration.
Allows monitoring Source/Steam game servers via A2S query.
Allows monitoring Valve Source game servers via A2S protocol.
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.
Run it
docker run -p 4000:4000 --hostname solidping -v solidping-data:/data ghcr.io/fclairamb/solidpingOpen 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.
--hostnameis required: the worker name comes from it and must match^[a-z][a-z0-9-]{2,20}$(or setSP_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 | |
Binary (Linux, macOS, Windows) | |
Homebrew |
|
Scoop |
|
Kubernetes | |
Railway, Coolify, CasaOS, YunoHost |
Related MCP server: uptimepage
Screenshots
Checks list | New-check form | Check detail |
Check types
Check | Type | What it checks |
| Status codes, body, JSON and header assertions, timing breakdown | |
| Port connectivity, optional send/expect payload | |
| Port reachability, optional send/expect payload | |
| Ping | |
| Record resolution | |
| Connection handshake | |
| RDP negotiation, optional authenticated logon | |
| RFB handshake and authentication | |
| Broken links, mixed content, sitemap errors | |
| Health endpoint, reported per component | |
| Outages reported by a vendor's status page | |
| Certificate validity and expiration | |
| Domain expiration (WHOIS/RDAP) | |
| DNS blocklist membership | |
| Connection and query | |
| Connection and query | |
| Ping command | |
| PING command | |
| Connection and query | |
| Connection and query | |
| Connection and query | |
| Connectivity, STARTTLS, AUTH, optional real probe email | |
| Server availability | |
| Server availability | |
| A known message reaches an inbox (JMAP) | |
| Server availability | |
| Server availability | |
| Server availability | |
| Service health | |
| Broker connectivity | |
| Broker connectivity | |
| Broker connectivity | |
| VoIP server OPTIONS ping | |
| Reachability and clock drift | |
| Device monitoring | |
| Container health | |
| Workload replica health | |
| Source / Steam game server query | |
| Java and Bedrock server query | |
| xDSL/FTTH line quality | |
| Thresholds on a scraped metric | |
| Passive: alerts when pings stop (cron jobs, CI) | |
| Sandboxed scripts: multi-step API flows, logins, aggregation | |
| Headless Chrome: full render, screenshots |
Inspiration
Uptime Kuma: a self-hosted monitor that is easy to run (migration guide).
Better Stack: incidents, on-call escalation and status pages in one product (migration guide).
Gatus: checks defined as configuration (migration guide).
UptimeRobot: fast onboarding, one URL and you are monitoring (migration guide).
Healthchecks.io: heartbeat monitoring for cron jobs.
Checkly: scripted API and browser checks.
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 toolscreate_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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Human-readable name, e.g. "API production". Auto-generated from URL if omitted. | |
| slug | No | URL-friendly slug (3-20 lowercase letters/digits/hyphens), e.g. "api-prod". Auto-generated if omitted. | |
| type | No | 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. | |
| config | Yes | 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. | |
| labels | No | Key-value labels for organization and filtering, e.g. {"env":"production","team":"api"}. | |
| period | No | Check interval as HH:MM:SS, e.g. "00:00:30" for 30 seconds, "00:01:00" for 1 minute (default). | |
| enabled | No | Whether the check should run. Default true. | |
| regions | No | 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.) | |
| placement | No | "pinned" or "auto". Omit to infer it: regions given means pinned, otherwise auto. "auto" cannot be combined with regions. Private (@) regions are pinned-only. | |
| failQuorum | No | 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. | |
| regionPool | No | Automatic placement only: the cloud region slugs the scheduler may choose from, e.g. ["paris","gravelines"]. Omit for any cloud region. Implies placement auto. | |
| description | No | Free-text description shown in the UI. | |
| regionCount | No | 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. | |
| checkGroupUid | No | Assign the check to a check group (UID or slug), e.g. "core-services". | |
| recoveryPeriodSeconds | No | Wall-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. | |
| confirmationPeriodSeconds | No | Wall-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
| Name | Required | Description |
|---|---|---|
| uid | Yes | Check UID. |
| name | No | Human-readable name. |
| slug | No | URL-friendly slug. |
| type | No | Check type, e.g. "http". |
| config | No | Check-specific configuration for the type. |
| labels | No | Key-value labels. |
| period | No | Check interval as HH:MM:SS. |
| status | No | Synthesized status: up, down, validating, created or degraded. |
| enabled | No | Whether the check runs. |
| regions | No | Regions the check runs from. |
| createdAt | No | RFC3339 creation timestamp. |
| placement | No | "pinned" or "auto". |
| description | No | Free-text description. |
| lastResultAt | No | RFC3339 timestamp of the newest real result. |
| checkGroupUid | No | Check group UID, when the check belongs to a group. |
| statusChangedAt | No | RFC3339 timestamp of the last status change. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Status page display name (required), e.g. "Public status". | |
| slug | Yes | URL-friendly slug (required, unique per org), e.g. "public". | |
| language | No | Language code, e.g. "en" or "fr". | |
| customCss | No | Custom 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. | |
| isDefault | No | Whether this is the org's default status page (only one allowed). | |
| visibility | No | Visibility setting. Allowed: "public", "private". Default "public". | |
| autoPublish | No | Automatically 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. | |
| autoResolve | No | What 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". | |
| description | No | Optional free-text description shown in the UI. | |
| historyDays | No | Days of history to show on the page (default 90). | |
| showAvailability | No | Display availability percentage on the public page. | |
| showResponseTime | No | Display response-time charts on the public page. | |
| autoPublishDelaySeconds | No | Debounce 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
| Name | Required | Description |
|---|---|---|
| uid | Yes | Status page UID. |
| name | No | Display name. |
| slug | No | URL-friendly slug. |
| enabled | No | Whether the public page is served. |
| createdAt | No | RFC3339 creation timestamp. |
| isDefault | No | Whether this is the organization's default page. |
| visibility | No | "public", "private" or "password". |
| historyPeriod | No | History window: "24h", "7d", "30d" or "90d". |
TDQS
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.
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.
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.
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.
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.
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 checkADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Check UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3". |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | Always true on success. |
| identifier | Yes | The UID or slug that was deleted. |
TDQS
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.
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.
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.
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.
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.
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 pageADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Status page UID or URL-friendly slug, e.g. "public". |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | Always true on success. |
| identifier | Yes | The identifier that was deleted. |
TDQS
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.
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.
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.
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.
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.
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 checkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Check UID or slug (e.g. "api-prod" or a UUID). | |
| recentResultsLimit | No | Recent raw results per region (1-20, default 5). |
Output Schema
| Name | Required | Description |
|---|---|---|
| check | Yes | |
| freshness | No | One sentence per silent region naming it and since when it has gone quiet; empty when every region is reporting. |
| recentResults | Yes | Newest-first raw results, trimmed to recentResultsLimit per region; includes region, output and durationMs. |
| regionalIssue | No | One sentence describing the regional issue (some, but fewer than the quorum, of the check's regions failing); empty when there is none. |
| activeIncident | Yes | Currently-open incident for the check, or null when none is open. |
| lastResolvedIncident | Yes | Most recently resolved incident for the check, or null when there is none. |
TDQS
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.
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.
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.
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.
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.
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 checkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| with | No | Comma-separated extra fields: lastResult — most recent result lastStatusChange — when status last changed Example: "lastResult,lastStatusChange". | |
| identifier | Yes | Check UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3". |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | Yes | Check UID. |
| name | No | Human-readable name. |
| slug | No | URL-friendly slug. |
| type | No | Check type, e.g. "http". |
| config | No | Check-specific configuration for the type. |
| labels | No | Key-value labels. |
| period | No | Check interval as HH:MM:SS. |
| status | No | Synthesized status: up, down, validating, created or degraded. |
| enabled | No | Whether the check runs. |
| regions | No | Regions the check runs from. |
| createdAt | No | RFC3339 creation timestamp. |
| placement | No | "pinned" or "auto". |
| description | No | Free-text description. |
| lastResultAt | No | RFC3339 timestamp of the newest real result. |
| checkGroupUid | No | Check group UID, when the check belongs to a group. |
| statusChangedAt | No | RFC3339 timestamp of the last status change. |
TDQS
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.
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.
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.
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.
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.
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 incidentARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| uid | Yes | Incident UID returned by list_incidents or diagnose_check. | |
| with | No | Comma-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". | |
| limit | No | With include=notifications: max attempts (1-500, default 20). | |
| status | No | With include=notifications: only attempts in this delivery status. Allowed: pending, sent, failed, cancelled, skipped. | |
| include | No | Extra lists to return with the incident. An unknown value is an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | Yes | Incident UID. |
| kind | No | What the incident is about: check, slo_burn or degraded. |
| check | No | Underlying check, when requested with with=check. |
| state | No | active or resolved. |
| title | No | Custom title, when one was set. |
| events | No | Timeline events (status transitions, notifications, manual notes), newest first; present when with=events was passed. |
| number | No | Short per-org reference, e.g. 42. |
| checkUid | No | UID of the check the incident is about. |
| checkName | No | Name of that check. |
| checkSlug | No | Slug of that check. |
| startedAt | No | RFC3339 timestamp when the incident opened. |
| resolvedAt | No | RFC3339 timestamp when it resolved; absent while active. |
| description | No | Custom description, when one was set. |
| failureCount | No | Number of failures recorded for the incident. |
| relapseCount | No | Number of times the incident reopened. |
| notifications | No | Notification attempts, newest first; present when include=notifications was passed. |
TDQS
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.
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.
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.
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.
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.
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 pageARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| with | No | "sections" to include nested sections and their resources | |
| state | No | With include=incidents: only publications in this public state. Allowed: "investigating", "identified", "monitoring", "resolved". | |
| active | No | With include=incidents: when true, only publications that are not resolved. | |
| include | No | Extra lists to return with the page. An unknown value is an error. Do not combine "sections" with with=sections. | |
| identifier | Yes | Status page UID or URL-friendly slug, e.g. "public". | |
| sectionIdentifier | No | Section UID or slug whose resources include=resources returns (required with it). |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | Yes | Status page UID. |
| name | No | Display name. |
| slug | No | URL-friendly slug. |
| enabled | No | Whether the public page is served. |
| sections | No | Sections; absent unless with=sections (nested resources included) or include=sections (section metadata only) was passed. |
| createdAt | No | RFC3339 creation timestamp. |
| incidents | No | Incident publications on the page; present with include=incidents. |
| isDefault | No | Whether this is the organization's default page. |
| resources | No | Resources of the section named by sectionIdentifier; present with include=resources. |
| visibility | No | "public", "private" or "password". |
| historyPeriod | No | History window: "24h", "7d", "30d" or "90d". |
TDQS
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.
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.
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.
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.
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.
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 groupsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Check groups on this page. |
TDQS
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.
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.
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.
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.
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.
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 checksARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Case-insensitive substring match on check name or slug, e.g. "api". | |
| with | No | Comma-separated extra fields: lastResult — most recent result for each check lastStatusChange — when each check last changed status Example: "lastResult,lastStatusChange". | |
| limit | No | Max results (1-100, default 20). | |
| cursor | No | Opaque pagination cursor returned by a previous response. Omit on the first page. | |
| labels | No | Label filter as a JSON object. Returns checks that have ALL of the given labels with matching values (AND semantics). Example: {"env": "production", "team": "api"}. | |
| checkGroupUid | No | Filter to checks in this group (UID or slug), e.g. "core-services". |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Checks on this page. |
| pagination | No | Cursor pagination state for the filter. |
TDQS
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.
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.
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.
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.
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.
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 typesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional check type whose sample configs to return (e.g. "http", "dns", "tcp", "icmp", "ssl"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Without type: check types this server supports, with their activation status. With type: one entry per matching check type, carrying its sample configs. |
TDQS
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.
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.
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.
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.
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.
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 incidentsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max results (1-100, default 20). | |
| with | No | Comma-separated extra fields: check — include the underlying check (slug, type, config) Example: "check". | |
| order | No | Sort order on start time: "desc" (default, newest first) or "asc" (oldest first; the cursor then means strictly after, and is always returned). | |
| since | No | Lower bound on incident start time (RFC3339), e.g. "2026-05-03T00:00:00Z". | |
| state | No | Comma-separated incident states. Allowed: active, resolved. Example: "active" or "active,resolved". | |
| until | No | Upper bound on incident start time (RFC3339), e.g. "2026-05-04T00:00:00Z". | |
| cursor | No | Opaque pagination cursor returned by a previous response. Omit on the first page. | |
| checkUid | No | Comma-separated check UIDs or slugs to filter by, e.g. "api-prod,db-prod". |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Incidents on this page. |
| pagination | No | Page state for the filter. |
TDQS
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.
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.
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.
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.
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.
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 regionsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Regions available to this organization. |
| defaultRegions | No | The org's default region slugs, used when a check has no explicit regions. |
TDQS
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.
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.
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.
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.
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.
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 resultsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | Max results (1-100, default 20). | |
| with | No | Comma-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". | |
| cursor | No | Opaque pagination cursor returned by a previous response. Omit on the first page. | |
| region | No | Comma-separated region slugs, e.g. "eu-west-1,us-east-1". | |
| status | No | Comma-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". | |
| checkUid | No | Comma-separated check UIDs or slugs to filter by, e.g. "api-prod,db-prod". | |
| checkType | No | 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". | |
| periodType | No | Comma-separated period types. Allowed: raw (single executions), hour, day, month (rollups). Defaults to "hour" when omitted. Example: "raw". | |
| periodEndBefore | No | RFC3339 timestamp (exclusive upper bound), e.g. "2026-05-03T11:00:00Z". | |
| periodStartAfter | No | RFC3339 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
| Name | Required | Description |
|---|---|---|
| data | No | Result rows on this page: raw executions or aggregated rollups. |
| window | No | Time window the server actually queried. |
| pagination | No | Cursor pagination for this filter. |
| effectiveFilter | No | Period filter that actually ran, after the tool's defaulting. |
TDQS
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.
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.
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.
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.
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.
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 pagesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | Status pages in the organization. |
TDQS
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.
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.
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.
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.
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.
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 incidentADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Update kind (required). Allowed: "investigating", "identified", "monitoring", "resolved", "maintenance", "info". The first four also advance the publication's state. | |
| state | No | Initial public state (default "investigating"). Allowed: "investigating", "identified", "monitoring", "resolved". | |
| title | No | Customer-facing title (required), e.g. "Payments API is degraded". | |
| action | Yes | What to do with the customer-facing incident. | |
| severity | No | Public badge severity. Allowed: "minor", "major", "critical". | |
| incidentUid | No | Optional UID of the internal incident this publication tracks. | |
| bodyMarkdown | No | Optional first narrative entry, in Markdown. | |
| pageIdentifier | No | Status page UID or URL-friendly slug, e.g. "public". | |
| publicationUid | No | UID of the incident publication to act on. |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | No | Publication UID. |
| kind | No | Update kind, e.g. "investigating" or "resolved". |
| stale | No | True when the linked incident has resolved while the entry is still open. |
| state | No | Public state: investigating, identified, monitoring or resolved. |
| title | No | Customer-facing title. |
| severity | No | Public severity: minor, major or critical; absent when unset. |
| createdAt | No | RFC3339 creation timestamp. |
| updatedAt | No | RFC3339 last-update timestamp. |
| resolvedAt | No | RFC3339 timestamp when it was resolved; absent while open. |
| autoCreated | No | True when the publication was created by the auto-publish pipeline. |
| incidentUid | No | Linked internal incident UID, when the publication tracks one. |
| publishedAt | No | RFC3339 timestamp when the entry appeared on the page. |
| unpublished | No | Always true on success. |
| bodyMarkdown | No | Update body in Markdown. |
| humanTouched | No | True once an operator edited it, which stops auto-resolve. |
| statusPageUid | No | UID of the status page the publication lives on. |
| publicationUid | No | UID of the publication removed from the page. |
TDQS
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.
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.
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.
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.
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.
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 resourceADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | What to do with the resource. | |
| checkUid | No | Check UID or slug to pin (for example api-health). Mutually exclusive with checkGroupUid; exactly one is required. | |
| position | No | Display position within the section | |
| publicName | No | Display name for the public page (defaults to the check or group name) | |
| explanation | No | Short explanation rendered under the resource | |
| resourceUid | No | Status page resource UID (get_status_page include=resources lists them). | |
| checkGroupUid | No | Check group UID or slug to pin as one aggregated component. Mutually exclusive with checkUid; exactly one is required. | |
| pageIdentifier | Yes | Status page UID or URL-friendly slug, e.g. "public". | |
| sectionIdentifier | Yes | Status page section UID or URL-friendly slug, e.g. "api". |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | No | Resource UID. |
| deleted | No | Always true on success. |
| checkUid | No | Pinned check UID, when the resource targets a check. |
| position | No | Display position within the section (smaller renders earlier). |
| identifier | No | The identifier that was deleted. |
| publicName | No | Display name shown on the public page. |
| explanation | No | Short explanation rendered under the resource. |
| checkGroupUid | No | Pinned check group UID, when the resource targets a group. |
TDQS
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.
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.
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.
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.
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.
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 sectionADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Section display name (required), e.g. "API services". | |
| slug | No | URL-friendly slug (required, unique within the page), e.g. "api". | |
| action | Yes | What to do with the section. | |
| position | No | Display position within the page (smaller renders earlier). | |
| pageIdentifier | Yes | Status page UID or URL-friendly slug, e.g. "public". | |
| sectionIdentifier | No | Status page section UID or URL-friendly slug, e.g. "api". |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | No | Section UID. |
| name | No | Section display name. |
| slug | No | URL-friendly slug, unique within the page. |
| deleted | No | Always true on success. |
| position | No | Display position (smaller renders earlier). |
| selector | No | Dynamic membership rule; absent on hand-curated sections. |
| identifier | No | The identifier that was deleted. |
TDQS
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.
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.
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.
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.
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.
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 targetARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| env | No | Plaintext parameters exposed as env.NAME, e.g. {"BASE_URL": "https://acme.com"}. | |
| url | No | Absolute http(s) URL. | |
| kind | Yes | What 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. | |
| script | No | The js check script (a function body that returns {status, ...}). | |
| secrets | No | Names of the secret parameters the script reads; they run empty. | |
| timeout | No | Run timeout as a duration string (default and max 30s). |
Output Schema
| Name | Required | Description |
|---|---|---|
| output | No | The script's output object, with console output under `console`. |
| status | Yes | up, down, timeout or error, as a SolidPing worker would report it. |
| metrics | No | The script's metrics. |
| durationMs | No | Run duration in milliseconds. |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | Check UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3". |
Output Schema
| Name | Required | Description |
|---|---|---|
| regions | Yes | One entry per region. |
| requestedAt | Yes | RFC3339 time the request was recorded. |
TDQS
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.
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.
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.
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.
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.
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 checkAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New human-readable name, e.g. "API production". | |
| slug | No | New URL-friendly slug, e.g. "api-prod". | |
| config | No | Replace check-specific config (full object — not merged). | |
| labels | No | Replace labels object (empty object clears all). Example: {"env":"staging"}. | |
| period | No | New check interval as HH:MM:SS, e.g. "00:00:30" for 30 seconds. | |
| enabled | No | Toggle whether the check runs. Set to false to pause the check, true to resume it. | |
| regions | No | 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. | |
| placement | No | 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. | |
| failQuorum | No | 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. | |
| identifier | Yes | Check UID or URL-friendly slug, e.g. "api-prod" or "63d49e55-97e3-4e8c-b7ab-c862de7a43f3". | |
| regionPool | No | Automatic placement only: candidate cloud region slugs; an empty array means any. Implies placement auto. | |
| description | No | Updated free-text description shown in the UI. | |
| regionCount | No | Automatic placement only: how many regions run the check. Implies placement auto. | |
| checkGroupUid | No | Move to a different group (UID or slug). Pass an empty string to ungroup. | |
| resolveOpenIncidents | No | With enabled:false, also close the check's open incidents (resolution type check_disabled). | |
| recoveryPeriodSeconds | No | Wall-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. | |
| confirmationPeriodSeconds | No | Wall-clock seconds to wait after the first failure before opening an incident. 0 = open immediately. Range 0–86400 (one day). |
Output Schema
| Name | Required | Description |
|---|---|---|
| uid | Yes | Check UID. |
| name | No | Human-readable name. |
| slug | No | URL-friendly slug. |
| type | No | Check type, e.g. "http". |
| config | No | Check-specific configuration for the type. |
| labels | No | Key-value labels. |
| period | No | Check interval as HH:MM:SS. |
| status | No | Synthesized status: up, down, validating, created or degraded. |
| enabled | No | Whether the check runs. |
| regions | No | Regions the check runs from. |
| createdAt | No | RFC3339 creation timestamp. |
| placement | No | "pinned" or "auto". |
| description | No | Free-text description. |
| lastResultAt | No | RFC3339 timestamp of the newest real result. |
| checkGroupUid | No | Check group UID, when the check belongs to a group. |
| statusChangedAt | No | RFC3339 timestamp of the last status change. |
TDQS
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.
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.
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.
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.
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.
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 pageAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New display name, e.g. "Public status page". | |
| slug | No | New URL-friendly slug, e.g. "public". | |
| enabled | No | Enable or disable the public-facing page. | |
| language | No | Language code, e.g. "en" or "fr". | |
| customCss | No | Custom 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. | |
| isDefault | No | Mark as the org's default page (only one allowed). | |
| identifier | Yes | Status page UID or URL-friendly slug, e.g. "public". | |
| visibility | No | Visibility setting. Allowed: "public", "private". | |
| autoPublish | No | Automatically 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. | |
| autoResolve | No | What 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". | |
| description | No | New free-text description shown in the UI. | |
| historyDays | No | Days of history to show on the page (default 90). | |
| showAvailability | No | Toggle availability percentage on the public page. | |
| showResponseTime | No | Toggle response-time charts on the public page. | |
| autoPublishDelaySeconds | No | Debounce 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
| Name | Required | Description |
|---|---|---|
| uid | Yes | Status page UID. |
| name | No | Display name. |
| slug | No | URL-friendly slug. |
| enabled | No | Whether the public page is served. |
| createdAt | No | RFC3339 creation timestamp. |
| isDefault | No | Whether this is the organization's default page. |
| visibility | No | "public", "private" or "password". |
| historyPeriod | No | History window: "24h", "7d", "30d" or "90d". |
TDQS
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.
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.
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.
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.
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.
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 checkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Check type (e.g. "http", "dns", "tcp", "icmp", "ssl"). | |
| config | Yes | Check-specific config to validate (e.g., {"url": "https://example.com"}). |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | True when the config would be accepted; false when at least one blocking finding exists. |
| fields | No | Blocking findings; absent when there are none (valid stays true). |
| warnings | No | Advisory findings that never block; absent when there are none. |
TDQS
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.
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.
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.
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.
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.
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.
20 tool updates
v0.42.0- Changed
create_check8 fields changed- added
Input schema / properties / checkGroupUid / maxLengthAdded value: +2048 - added
Input schema / properties / description / maxLengthAdded value: +2048 - added
Input schema / properties / failQuorum / maxLengthAdded value: +2048 - added
Input schema / properties / name / maxLengthAdded value: +2048 - added
Input schema / properties / period / maxLengthAdded value: +2048 - added
Input schema / properties / placement / maxLengthAdded value: +2048 - added
Input schema / properties / slug / maxLengthAdded value: +2048 - added
Input schema / properties / type / maxLengthAdded value: +2048
- Changed
create_status_page9 fields changed- added
Input schema / properties / autoResolve / maxLengthAdded value: +2048 - added
Input schema / properties / customCss / maxLengthAdded value: +65536 - added
Input schema / properties / description / maxLengthAdded value: +2048 - added
Input schema / properties / language / maxLengthAdded value: +2048 - added
Input schema / properties / name / maxLengthAdded value: +2048 - added
Input schema / properties / name / minLengthAdded value: +1 - added
Input schema / properties / slug / maxLengthAdded value: +2048 - added
Input schema / properties / slug / minLengthAdded value: +1 - added
Input schema / properties / visibility / maxLengthAdded value: +2048
- Changed
delete_check2 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1
- Changed
delete_status_page2 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1
- Changed
diagnose_check2 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1
- Changed
get_check3 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1 - added
Input schema / properties / with / maxLengthAdded value: +2048
- Changed
get_incident4 fields changed- added
Input schema / properties / status / maxLengthAdded value: +2048 - added
Input schema / properties / uid / maxLengthAdded value: +2048 - added
Input schema / properties / uid / minLengthAdded value: +1 - added
Input schema / properties / with / maxLengthAdded value: +2048
- Changed
get_status_page5 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1 - added
Input schema / properties / sectionIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / state / maxLengthAdded value: +2048 - added
Input schema / properties / with / maxLengthAdded value: +2048
- Changed
list_check_types1 field changed- added
Input schema / properties / type / maxLengthAdded value: +2048
- Changed
list_checks5 fields changed- added
Input schema / properties / checkGroupUid / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / minLengthAdded value: +1 - added
Input schema / properties / q / maxLengthAdded value: +2048 - added
Input schema / properties / with / maxLengthAdded value: +2048
- Changed
list_incidents9 fields changed- added
Input schema / properties / checkUid / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / minLengthAdded value: +1 - added
Input schema / properties / orderAdded 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" +} - added
Input schema / properties / since / maxLengthAdded value: +2048 - added
Input schema / properties / state / maxLengthAdded value: +2048 - added
Input schema / properties / until / maxLengthAdded value: +2048 - added
Input schema / properties / with / maxLengthAdded value: +2048 - changed
Output schema / properties / pagination / properties / cursor / descriptionPrevious 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."
- Changed
list_results10 fields changed- added
Input schema / properties / checkType / maxLengthAdded value: +2048 - added
Input schema / properties / checkUid / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / maxLengthAdded value: +2048 - added
Input schema / properties / cursor / minLengthAdded value: +1 - added
Input schema / properties / periodEndBefore / maxLengthAdded value: +2048 - added
Input schema / properties / periodStartAfter / maxLengthAdded value: +2048 - added
Input schema / properties / periodType / maxLengthAdded value: +2048 - added
Input schema / properties / region / maxLengthAdded value: +2048 - added
Input schema / properties / status / maxLengthAdded value: +2048 - added
Input schema / properties / with / maxLengthAdded value: +2048
- Changed
manage_status_page_incident10 fields changed- added
Input schema / properties / action / maxLengthAdded value: +2048 - added
Input schema / properties / action / minLengthAdded value: +1 - added
Input schema / properties / bodyMarkdown / maxLengthAdded value: +2048 - added
Input schema / properties / incidentUid / maxLengthAdded value: +2048 - added
Input schema / properties / kind / maxLengthAdded value: +2048 - added
Input schema / properties / pageIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / publicationUid / maxLengthAdded value: +2048 - added
Input schema / properties / severity / maxLengthAdded value: +2048 - added
Input schema / properties / state / maxLengthAdded value: +2048 - added
Input schema / properties / title / maxLengthAdded value: +2048
- Changed
manage_status_page_resource11 fields changed- added
Input schema / properties / action / maxLengthAdded value: +2048 - added
Input schema / properties / action / minLengthAdded value: +1 - added
Input schema / properties / checkGroupUid / maxLengthAdded value: +2048 - added
Input schema / properties / checkUid / maxLengthAdded value: +2048 - added
Input schema / properties / explanation / maxLengthAdded value: +2048 - added
Input schema / properties / pageIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / pageIdentifier / minLengthAdded value: +1 - added
Input schema / properties / publicName / maxLengthAdded value: +2048 - added
Input schema / properties / resourceUid / maxLengthAdded value: +2048 - added
Input schema / properties / sectionIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / sectionIdentifier / minLengthAdded value: +1
- Changed
manage_status_page_section7 fields changed- added
Input schema / properties / action / maxLengthAdded value: +2048 - added
Input schema / properties / action / minLengthAdded value: +1 - added
Input schema / properties / name / maxLengthAdded value: +2048 - added
Input schema / properties / pageIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / pageIdentifier / minLengthAdded value: +1 - added
Input schema / properties / sectionIdentifier / maxLengthAdded value: +2048 - added
Input schema / properties / slug / maxLengthAdded value: +2048
- Changed
probe5 fields changed- added
Input schema / properties / kind / maxLengthAdded value: +2048 - added
Input schema / properties / kind / minLengthAdded value: +1 - added
Input schema / properties / script / maxLengthAdded value: +65536 - added
Input schema / properties / timeout / maxLengthAdded value: +2048 - added
Input schema / properties / url / maxLengthAdded value: +2048
- Changed
run_check2 fields changed- added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1
- Changed
update_check10 fields changed- added
Input schema / properties / checkGroupUid / maxLengthAdded value: +2048 - added
Input schema / properties / description / maxLengthAdded value: +2048 - added
Input schema / properties / failQuorum / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1 - added
Input schema / properties / name / maxLengthAdded value: +2048 - added
Input schema / properties / period / maxLengthAdded value: +2048 - added
Input schema / properties / placement / maxLengthAdded value: +2048 - added
Input schema / properties / resolveOpenIncidentsAdded value: +{ + "description": "With enabled:false, also close the check's open incidents (resolution type check_disabled).", + "type": "boolean" +} - added
Input schema / properties / slug / maxLengthAdded value: +2048
- Changed
update_status_page9 fields changed- added
Input schema / properties / autoResolve / maxLengthAdded value: +2048 - added
Input schema / properties / customCss / maxLengthAdded value: +65536 - added
Input schema / properties / description / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / maxLengthAdded value: +2048 - added
Input schema / properties / identifier / minLengthAdded value: +1 - added
Input schema / properties / language / maxLengthAdded value: +2048 - added
Input schema / properties / name / maxLengthAdded value: +2048 - added
Input schema / properties / slug / maxLengthAdded value: +2048 - added
Input schema / properties / visibility / maxLengthAdded value: +2048
- Changed
validate_check2 fields changed- added
Input schema / properties / type / maxLengthAdded value: +2048 - added
Input schema / properties / type / minLengthAdded value: +1
23 tool updates
v0.41.0- Changed
create_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
create_status_page2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
delete_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
delete_status_page2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
diagnose_check3 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false - added
Output schema / properties / check / additionalPropertiesAdded value: +false
- Changed
get_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
get_incident2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
get_status_page2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_check_groups2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_check_types2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_checks2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_incidents2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_regions2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_results2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
list_status_pages2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
manage_status_page_incident2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
manage_status_page_resource2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
manage_status_page_section2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
probe2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
run_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
update_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
update_status_page2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
- Changed
validate_check2 fields changed- added
Input schema / additionalPropertiesAdded value: +false - added
Output schema / additionalPropertiesAdded value: +false
2 tool updates
v0.40.1- Changed
create_check1 field changed- changed
Input schema / properties / type / descriptionPrevious 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."
- Changed
list_results1 field changed- changed
Input schema / properties / checkType / descriptionPrevious 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\"."
47 tool updates
v0.38.5- Changed
create_check8 fields changed- changed
Input schema / properties / config / descriptionPrevious 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." - added
Input schema / properties / failQuorumAdded 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" +} - added
Input schema / properties / placementAdded 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" +} - added
Input schema / properties / regionCountAdded 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" +} - added
Input schema / properties / regionPoolAdded 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" +} - changed
Input schema / properties / regions / descriptionPrevious 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.)" - changed
Input schema / properties / type / descriptionPrevious 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." - changed
Output 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" +}
- Removed
create_incident_publication - Removed
create_integration - Removed
create_maintenance_window - Changed
create_status_page2 fields changed- changed
Input schema / properties / visibility / descriptionPrevious value: -"Visibility setting. Allowed: \"public\", \"private\". Default depends on system config."New value: +"Visibility setting. Allowed: \"public\", \"private\". Default \"public\"." - changed
Output 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" +}
- Removed
create_status_page_incident - Removed
create_status_page_incident_update - Removed
create_status_page_resource - Removed
create_status_page_section - Changed
delete_check1 field changed- changed
Output 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" +}
- Removed
delete_incident_publication - Removed
delete_maintenance_window - Changed
delete_status_page1 field changed- changed
Output 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" +}
- Removed
delete_status_page_resource - Removed
delete_status_page_section - Changed
diagnose_check1 field changed- changed
Output 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" +}
- Changed
get_check1 field changed- changed
Output 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" +}
- Removed
get_check_type_samples - Changed
get_incident4 fields changed- added
Input schema / properties / includeAdded value: +{ + "description": "Extra lists to return with the incident. An unknown value is an error.", + "items": { + "enum": [ + "notifications" + ], + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / limitAdded value: +{ + "description": "With include=notifications: max attempts (1-500, default 20).", + "type": "integer" +} - added
Input schema / properties / statusAdded value: +{ + "description": "With include=notifications: only attempts in this delivery status. Allowed: pending, sent, failed, cancelled, skipped.", + "type": "string" +} - changed
Output 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" +}
- Removed
get_maintenance_window - Changed
get_status_page5 fields changed- added
Input schema / properties / activeAdded value: +{ + "description": "With include=incidents: when true, only publications that are not resolved.", + "type": "boolean" +} - added
Input schema / properties / includeAdded 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" +} - added
Input schema / properties / sectionIdentifierAdded value: +{ + "description": "Section UID or slug whose resources include=resources returns (required with it).", + "type": "string" +} - added
Input schema / properties / stateAdded value: +{ + "description": "With include=incidents: only publications in this public state. Allowed: \"investigating\", \"identified\", \"monitoring\", \"resolved\".", + "type": "string" +} - changed
Output 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" +}
- Removed
incident_notifications_list - Changed
list_check_groups1 field changed- changed
Output 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" +}
- Changed
list_check_types2 fields changed- added
Input schema / properties / typeAdded value: +{ + "description": "Optional check type whose sample configs to return (e.g. \"http\", \"dns\", \"tcp\", \"icmp\", \"ssl\").", + "type": "string" +} - changed
Output 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" +}
- Changed
list_checks1 field changed- changed
Output 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" +}
- Changed
list_incidents1 field changed- changed
Output 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" +}
- Removed
list_integrations - Removed
list_maintenance_windows - Changed
list_regions1 field changed- changed
Output 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" +}
- Changed
list_results2 fields changed- changed
Input schema / properties / checkType / descriptionPrevious 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\"." - changed
Output 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" +}
- Removed
list_status_page_incidents - Removed
list_status_page_resources - Removed
list_status_page_sections - Changed
list_status_pages1 field changed- changed
Output 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" +}
- Added
manage_status_page_incident - Added
manage_status_page_resource - Added
manage_status_page_section - Added
probe - Added
run_check - Removed
set_maintenance_window_checks - Changed
update_check7 fields changed- changed
Input schema / properties / enabled / descriptionPrevious value: -"Toggle whether the check runs."New value: +"Toggle whether the check runs. Set to false to pause the check, true to resume it." - added
Input schema / properties / failQuorumAdded 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" +} - added
Input schema / properties / placementAdded 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" +} - added
Input schema / properties / regionCountAdded value: +{ + "description": "Automatic placement only: how many regions run the check. Implies placement auto.", + "type": "integer" +} - added
Input schema / properties / regionPoolAdded value: +{ + "description": "Automatic placement only: candidate cloud region slugs; an empty array means any. Implies placement auto.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / regions / descriptionPrevious 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." - changed
Output 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" +}
- Removed
update_maintenance_window - Changed
update_status_page1 field changed- changed
Output 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" +}
- Removed
update_status_page_incident - Removed
update_status_page_resource - Removed
update_status_page_section - Changed
validate_check1 field changed- changed
Output 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" +}
42 tool updates
v0.32.1- First observed
create_check - First observed
create_incident_publication - First observed
create_integration - First observed
create_maintenance_window - First observed
create_status_page - First observed
create_status_page_incident - First observed
create_status_page_incident_update - First observed
create_status_page_resource - First observed
create_status_page_section - First observed
delete_check - First observed
delete_incident_publication - First observed
delete_maintenance_window - First observed
delete_status_page - First observed
delete_status_page_resource - First observed
delete_status_page_section - First observed
diagnose_check - First observed
get_check - First observed
get_check_type_samples - First observed
get_incident - First observed
get_maintenance_window - First observed
get_status_page - First observed
incident_notifications_list - First observed
list_check_groups - First observed
list_check_types - First observed
list_checks - First observed
list_incidents - First observed
list_integrations - First observed
list_maintenance_windows - First observed
list_regions - First observed
list_results - First observed
list_status_page_incidents - First observed
list_status_page_resources - First observed
list_status_page_sections - First observed
list_status_pages - First observed
set_maintenance_window_checks - First observed
update_check - First observed
update_maintenance_window - First observed
update_status_page - First observed
update_status_page_incident - First observed
update_status_page_resource - First observed
update_status_page_section - First observed
validate_check
TDQS
Scored across 23 tools
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.
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.
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.
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
Related MCP Connectors
- sentinelOAuthio.rootstuff
Uptime, SSL, DNS and domain monitoring you can talk to from Claude or any MCP client.
Uptime monitoring: create and manage HTTP, API, SSL, ping, port and domain checks
Monitor websites, APIs, and servers: create monitors, triage incidents, and query uptime stats.
Agent-native uptime monitoring. Create, inspect, and assert monitor health. Free 50-monitor tier.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceMCP server for Uptrack uptime monitoring. Manage monitors and incidents from AI agents like Claude, ChatGPT, and Cursor.4 npmMIT
uptimepageofficial
AlicenseNot gradedqualityAmaintenanceMCP 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.50AGPL 3.0- FlicenseNot gradedqualityCmaintenanceUptime, SSL, DNS and domain monitoring you can talk to: check, create and manage monitors for all your client sites from Claude, ChatGPT, or any MCP client.1-
- AlicenseNot gradedqualityDmaintenanceOfficial 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.1MIT