SolidPing
Server Details
Self-hostable uptime monitoring: create checks, read incidents, manage status pages.
- Status
- Healthy
- Uptime
- 4.7% over 43 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- fclairamb/solidping
- GitHub Stars
- 29
- Server Listing
- SolidPing
- ChatGPT
- –
- Claude
- SolidPing
TDQS
Scored across 23 tools
Each tool targets a distinct resource+action, and descriptions actively disambiguate the overlapping read paths (get_check vs diagnose_check vs list_checks, list_incidents vs get_incident, manage_status_page_* vs the create/update/delete tools). The three manage_status_page_* tools share an action-multiplexing shape but are cleanly separated by sub-resource (section, resource, incident).
Predominantly consistent verb_noun snake_case (create_check, get_incident, list_results, update_status_page, delete_check). The main deviation is the 'manage_' prefix used for the action-multiplexed status page sub-resource tools, plus bare 'probe'; still readable and predictable, just not perfectly uniform.
23 tools is slightly heavy but justified: the server spans checks (lifecycle + validate/probe/run/diagnose) and status pages (pages + sections + resources + incidents), each with real operations. No tool looks redundant or purely decorative.
Checks and status pages have full CRUD plus diagnostics, dry-run validation, probing, and manual runs; results, incidents, regions and check types are covered read-only as expected. Gaps: check groups are only listable (no create/update/delete), and internal incidents have no acknowledge/mute/resolve operations, forcing agents to work around those lifecycle steps.
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. 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?
The description discloses behavior beyond the annotations: an enabled check starts on its next tick and opens an incident after its confirmation period, duplicate slugs are rejected with a conflict and never merged, and the call requires the mcp scope and at least the user role. It does not cover rate limits, whether side effects are reversible, or how the returned config is normalized, which is what would earn a 4-5 here.
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 dense and well front-loaded: the core action and return value come first, then the workflow guidance, then the side effects and auth constraints. Four sentences of tightly packed secondary detail (placement inference, quorum semantics) make it longer than strictly necessary, but 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?
For a 16-parameter mutation tool with nested config, an output schema, the description still covers workflow (fetch schema, validate, create), side effects, failure modes, and permission requirements. It goes beyond the annotations rather than restating 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?
With 100% schema coverage the baseline is 3, but the description adds real semantic value. It spells out the paused-versus-running distinction, the conflict-on-duplicate-slug vs. update_check split, and the return shape (uid, slug, placement, resolved periods), which lets an agent reason about the effect of each parameter instead of having to infer it from the schema alone.
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' — plus what is returned (uid, slug, placement, resolved periods). This cleanly separates it from update_check, delete_check, and list_check_types in the sibling set.
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 with type when the config shape is unknown, then validate_check to dry-run before creating. It also names the alternative for the mutation path — a duplicate slug must go through update_check — and explains enabled:false for creating paused.
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. 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?
With annotations already declaring a non-readonly, non-idempotent, non-destructive write, the description adds substantive behavior: slugs are never merged on conflict, only one page can be default and isDefault:true demotes the previous one, new pages are seeded with a 'Services' section and start enabled and public. It also discloses the auth requirements (mcp scope, mcp:read refused, user role), which is exactly the kind of context annotations cannot convey.
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?
Four sentences, no filler, with the core action and conflict rule front-loaded before configuration semantics and auth constraints. It is dense to the point of being a single wall of text, but nearly 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?
For a 13-parameter creation tool, the description covers the side effects, defaults, follow-up tools, and permission requirements an agent needs to commit the call. An output schema exists, so the return value needs no further explanation beyond the mention that the created page is returned.
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 still adds meaning beyond the schema for isDefault (the first page always becomes default, and setting it demotes the existing default) and for page initialization state, which the schema does not express.
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') plus what it returns. It is clearly distinguished from update_status_page and manage_status_page_section, which are named as the follow-up tools for later edits.
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 the agent to manage_status_page_section for additional sections and update_status_page for later edits, and warns that duplicate slugs are rejected rather than merged. It stops short of telling the agent to call list_status_pages first to avoid a slug conflict, but the context is otherwise clear.
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. To stop a check without losing it, use update_check with enabled:false instead. Returns {deleted: true, identifier}. 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?
Annotations already declare destructiveHint and idempotentHint, so the description goes beyond them with real consequences: check stops immediately, incidents resolved, scheduling jobs removed, historical results kept, tunneling checks refused. Auth requirements (mcp scope, user role, read tokens refused) are also disclosed. It stops short of describing irreversibility or error shapes, so a 4 rather than 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?
Three tight sentences: effect first, then side effects and exclusion, then the alternative and the auth/return contract. No filler and no repetition of the title or annotations.
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?
A destructive single-parameter tool with annotations and an output schema, and the description still covers side effects, refusal conditions, the preferred non-destructive alternative, authorization scopes, and the return shape. Nothing an agent needs before calling 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 identifier as UID or slug. The description repeats 'by UID or slug' without adding format or resolution rules, 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?
Opens with a specific verb and resource ('Soft-delete a monitoring check') and immediately scopes the identifier to UID or slug. It is clearly distinguishable from siblings like delete_status_page, update_check, and get_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 names the alternative ('use update_check with enabled:false instead') with the condition that selects it (stop without losing it). It also states an exclusion: a check other checks tunnel through is refused.
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 — use update_status_page with enabled:false to take a page down without destroying it. Returns {deleted: true, identifier}. 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?
Adds substantial context beyond annotations: the soft-delete cascades to sections and resources, uploaded brand assets are permanently deleted, no undelete exists, and the required mcp scope and user role are stated. This gives an agent the destructive consequences and authorization prerequisites that the annotations alone do not convey.
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 destructive action and its consequences, then alternatives, return shape, and auth requirements. It is dense and largely waste-free, though the reference to non-existent sibling tools makes one sentence less useful than it appears.
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, cascade effects, irreversibility, alternatives, return value, and authorization requirements. For a destructive single-parameter tool with annotations and an output schema, this is complete enough for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the identifier parameter is already fully documented as a UID or URL-friendly slug. The description restates that identifier accepts UID or slug but adds no new syntax, format, or validation detail 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 a specific verb and resource (soft-delete a status page) and immediately clarifies scope: removal from API and public site, cascade to sections/resources, and brand asset deletion. It distinguishes the operation from update_status_page's enabled:false and from partial removal tools, so an agent can identify the action without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when/when-not guidance: no undelete, use update_status_page with enabled:false instead, and use section/resource tools for partial removal. However, the named partial-removal tools (delete_status_page_section, delete_status_page_resource) do not appear in the sibling set, which weakens the routing guidance slightly.
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?". Returns {check, freshness, regionalIssue, recentResults, activeIncident, lastResolvedIncident} — 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 cover readOnly/idempotent/non-destructive, but the description adds real value beyond them: the auth scope ('works with mcp:read tokens') and the conditional omission semantics (freshness and regionalIssue omitted when empty, incidents null when none). It stops short of covering cost/latency or how freshness is computed, so not 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 the purpose, then the routing rule, then output shape — no filler sentences. Slightly docked because the field-by-field return enumeration partially duplicates an output schema that already exists, even if the omission/null semantics within it are useful.
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 two-parameter read-only diagnostic aggregator with an output schema, this covers purpose, alternative, auth requirements, and edge-case shape of the response. An agent has everything needed to select and call it correctly and to interpret sparse results.
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 their own descriptions (identifier as UID/slug, recentResultsLimit as 1-20 default 5), so the schema does the work. The description only echoes 'recent raw results across regions' and adds no syntax or edge-case detail beyond it — baseline 3.
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/return) and resource (a single check's current state) and enumerates exactly what is bundled: status, recent regional results, active incident, last resolved incident. This makes it trivially distinguishable from list_results, list_incidents, and get_check 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?
Explicitly says to use it 'instead of chaining list_results + list_incidents' and names the triggering situation ('a human asks what's wrong with check X?'). The alternative and the condition that selects this tool are both stated outright.
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; 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 and destructiveHint=false, but the description adds non-annotation context: the required token scope ('works with mcp:read tokens') and the opt-in extras model via with=. It does not cover pagination or response shape, though an output schema exists to do that.
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, front-loaded with the core action and lookup keys, then routing guidance and the read-only scope. No filler and every clause carries distinct 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?
For a 2-parameter read tool with full schema coverage, complete annotations and an output schema, the description supplies everything missing: sibling disambiguation, the escalation path to diagnose_check, and auth requirements. Nothing needed to invoke it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters carry examples and the full with= field list in the schema itself. The description's 'ask for extras with with=lastResult,lastStatusChange' restates the schema's enum-of-fields rather than adding new syntax or semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single check's metadata') plus the accepted lookup keys (UID or slug), and explicitly contrasts itself with diagnose_check and list_checks. An agent can distinguish it from all 22 siblings 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 explicit routing: use diagnose_check when you need a full triage briefing, use list_checks when searching by name or label. Both the alternative and the condition that selects it 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_incidentGet incidentARead-onlyIdempotentInspect
Get a single incident by UID; 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 cover read-only/idempotent, yet the description adds auth detail ('works with mcp:read tokens'), failure behavior ('unknown UID fails with an "incident not found" error'), event cap (50 most-recent), and notification ordering ('newest first') plus that an unknown include value is an error.
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 error case, then option behavior, then routing. It is dense — clauses like 'plus the check with with=check and up to 50 timeline events with with=events' stack qualifiers — but almost nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even though an output schema exists, the description tells the agent which optional data appears in the response and what can fail, which is everything needed to call it correctly on the first try.
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 goes beyond it by explaining the shape of the notifications list (one row per dispatch target with delivery status, channel and recipient, newest first) and how status/limit interact with include=notifications.
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?
Opens with a precise verb+resource and scope: 'Get a single incident by UID'. It immediately separates itself from list_incidents (search/filter) and diagnose_check (check triage), so an agent can choose 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?
Explicit routing: 'Use list_incidents to search and filter across incidents, and diagnose_check for a check's full triage briefing.' It also states the condition that selects this tool (known single UID) versus those alternatives.
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 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 readOnlyHint, idempotentHint, and destructiveHint=false, but the description adds useful auth context by noting it works with mcp:read tokens. It also discloses that include adds lists alongside page fields and that incidents can be filtered by state and active, though it does not mention rate limits or error behavior beyond the 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?
The description is front-loaded with the primary action and then explains the optional embedding and include behavior. It is appropriately sized for a six-parameter tool, though the phrase 'and return it' is slightly redundant and the include enumeration is dense.
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 annotations, full schema description coverage, and presence of an output schema, the description supplies enough context about retrieval scope, optional includes, and sibling alternatives. An agent has what it needs to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters, including with, include, state, active, identifier, and sectionIdentifier. The description restates the main parameter interactions but adds little beyond the structured field descriptions, making the baseline 3 appropriate.
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: fetch one status page by UID or slug. It also distinguishes this retrieval tool from list_status_pages and the manage_* mutation tools, so an agent can identify its role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly routes browsing to list_status_pages and changes to manage_status_page_section, _resource, and _incident. It also explains when to use with=sections versus include lists, leaving little ambiguity about alternatives.
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. Returns {data: [...]}. 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 readOnlyHint/idempotent/non-destructive, and the description adds real value beyond them: the auth requirement (works with mcp:read tokens) and the bucket-level fields each entry carries. The 'Returns {data: [...]}' note is partly redundant with the output schema, keeping 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?
Three short sentences, front-loaded with the action and scope, then the domain concept, then return shape and auth. Every sentence carries 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?
For a no-param, read-only list tool with an output schema and full annotation coverage, this is sufficient: scope, entry contents, auth precondition, and response envelope are all conveyed.
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?
Zero parameters, so the baseline is 4; the description correctly says nothing about params and instead describes the entry fields, which is the relevant semantic information here.
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 (List) and resource (check groups) with scope (for the organization), and defines what a check group is, which distinguishes it conceptually from sibling list_checks. It stops short of naming the sibling it differs from explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The org-level scope and the definition imply when the tool is useful (browsing grouped checks for incident handling/dashboards), but there is no explicit when-to-use or when-not-to-use guidance relative to list_checks or get_check.
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. 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, so the description is not burdened with the safety profile. It still adds real context beyond structured fields: the pagination round-trip ("pass pagination.cursor back as cursor") and the auth scope ("works with mcp:read tokens"). The "Returns {data, pagination}" sentence is mildly redundant given an output schema exists.
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?
Four tight sentences ordered by importance: what it is, filter scope, pagination mechanics, then sibling routing. No filler and nothing repeated from annotations.
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 list tool with full schema coverage, an output schema, and rich annotations, nothing an agent needs is missing: purpose, filtering, pagination loop, auth scope, and alternatives are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters in detail. The description's "filtered by name/slug substring, labels, or check group" merely paraphrases q, labels, and checkGroupUid and says nothing about `with` or `limit`, 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?
Starts with a specific verb+resource ("List monitoring checks") and immediately scopes it to the organization with named filter dimensions. It explicitly distinguishes itself from two siblings by name (diagnose_check, get_check), 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?
States the positive case ("browsing or filtering a fleet of checks") and two negative cases with named alternatives: diagnose_check for single-check health, get_check when the UID/slug is already known. The selection rule is fully determined.
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, idempotentHint and destructiveHint=false, but the description adds useful context beyond them: the auth requirement ('works with mcp:read tokens') and the fact that samples are complete, valid configs safe to clone and modify. Minor redundancy in restating return shapes, which the output schema already 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?
Front-loaded with the core purpose and the branching instruction, with no filler sentences. It runs long in a single dense block and repeats the '{data: [...]}' shape twice, but every sentence carries usable guidance.
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 one-optional-parameter read tool with annotations and an output schema, the description covers purpose, sequencing, return content and auth. Slightly over-complete on return values that the output schema already specifies, but nothing an agent needs 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 parameter is already documented, but the description adds genuine semantics the schema lacks: the two distinct behaviors keyed on presence/absence of `type`, and what the returned entries contain in each mode (description, enabled state, period bounds, secretFields vs. samples).
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 all monitoring check types supported by this server') and immediately distinguishes the two modes: enumeration without arguments versus sample configs with `type`. The enumerated examples (http, tcp, dns, icmp, ssl) make it unambiguous versus siblings like list_checks or get_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 prescribes a call sequence: 'Call it without arguments first when you don't know what type to use', then 'Then call it with type=<chosen type>'. It also names the alternative behavior it replaces ('much more reliable than guessing field names'), giving the agent a reason to prefer this over trial-and-error with create_check.
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. Returns {data, pagination} — total, size, and a cursor naming the last row of a full page; the cursor is not read back on the next call yet, so move forward by narrowing since/until. 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". | |
| 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?
Beyond the readOnlyHint/idempotentHint annotations it discloses the response shape ({data, pagination}) and a non-obvious operational caveat: the returned cursor is not read back on the next call yet, so paging forward requires narrowing since/until. That is genuinely useful behavioral context. It slightly restates the read-only safety profile, but the pagination limitation is the kind of detail annotations cannot carry.
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, none wasted: purpose and scope first, return/pagination caveat second, sibling routing third. Front-loaded and appropriately sized for a 7-param list 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?
Output schema exists and the description still summarizes the return envelope, plus filtering and alternatives. The one friction point is that the description calls the cursor unusable for paging while the schema presents it as a normal pagination cursor, leaving the agent to reconcile the two.
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 still adds filtering semantics (check, state, time range) and the critical guidance that the cursor parameter cannot currently be used to page forward, which contradicts the schema's cursor text and is important for 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) with scope: organization-wide, active or resolved, filtered by check/state/time. It explicitly names the two sibling tools it is not (diagnose_check, get_status_page include=incidents), so an agent can route 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?
Gives explicit alternatives with the condition that selects them: diagnose_check for one check's incidents plus current health, and get_status_page include=incidents for customer-facing entries. The read-only/mcp:read note also signals when the tool is unavailable or inappropriate.
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. Returns {data, pagination, window, effectiveFilter}: data holds the result rows, window the time bounds actually queried, and effectiveFilter the period filter that ran after defaulting. 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?
Goes beyond the annotations by describing the return envelope (data/pagination/window/effectiveFilter), the defaulting rules for periodType and periodStartAfter, and the token scope required ('works with mcp:read tokens'). The 'read-only' restatement is redundant with readOnlyHint=true, but the default-window logic and effectiveFilter behavior are genuinely new information.
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 purpose and the sibling route, then the return shape, then defaults. The defaults sentence largely duplicates schema text and could be trimmed, but nothing is padding in the harmful sense.
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 10-parameter, all-optional query tool with full schema coverage and an output schema, the description covers purpose, alternative routing, default semantics, and auth scope. An agent has everything needed to call it correctly on the first attempt.
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 each parameter, including the same periodType and periodStartAfter defaults the description repeats. The description adds little beyond the schema here, 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?
Opens with a concrete verb plus resource ('Query monitoring results (raw or aggregated)') and enumerates the filter dimensions. It explicitly names the sibling it is not (diagnose_check) and the scenario that selects that sibling, so an agent can route 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?
States positive use cases ('trend analysis or to inspect a specific window') and an explicit exclusion with the alternative ('For investigating a single check's current state, use diagnose_check instead'). Both sides of the when/when-not decision are covered.
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, and return {data: [...]}. 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 the safety profile is covered. The description contributes beyond that with the ordering guarantee (newest first) and the token/scope requirement (mcp:read), though it says nothing about pagination or result limits for large orgs.
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, front-loaded with the action and scope, then the alternative-tool routing in a parenthetical. No boilerplate or restatement of 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?
An output schema exists so return values need no prose, and annotations carry the safety profile; the description still covers scope, ordering, auth tier and the sibling handoff. Nothing an agent needs to invoke this zero-arg 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?
Zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It confirms there is no filtering input by describing the call as returning every page in the org.
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") and the response envelope. It also names the sibling get_status_page for the singular case, so an agent can distinguish it from get_status_page without inspecting 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?
Explicitly routes the agent: use this for the full collection, use get_status_page when fetching one page by UID or slug, with a hint about with=sections/include=sections. The read-only token note adds a usability condition (mcp:read tokens) that further constrains when it will succeed.
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?
Substantial disclosure beyond annotations: customer-visible content warnings, subscriber notification with an hourly cap, webhook fanout for every action, append-only entries, PATCH semantics, audit retention on unpublish, and the required mcp scope plus user role. One defect holds it back: it justifies the destructive/non-idempotent hints with 'delete is one of its actions', yet no delete action exists in the enum, which could send an agent looking for one.
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?
Dense but front-loaded, with the customer-facing safety warning placed before the mechanical action list. Most clauses earn their place; the sentence restating the annotations ('Annotated destructive and non-idempotent because delete is one of its actions') is both redundant with structured fields and factually wrong.
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, five-action mutation tool the description covers action semantics, side effects, auth requirements, and the read path, and an output schema exists so return values need no explanation. Nothing an agent needs to invoke an action 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, but the description adds meaning the flat schema cannot: it maps parameters to the action that consumes them and clarifies that title/bodyMarkdown/severity are rendered to customers. It does not, however, explain that kind's four state-advancing values interact with the separate state parameter.
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 first sentence names the specific resource (customer-facing status page incidents/publications) and explicitly contrast it with the sibling list_incidents, which returns internal incidents. Each action in the enum is then given a one-line meaning, so an agent can tell create vs publish vs unpublish apart 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?
It states which parameters each action needs (create: pageIdentifier+title; add_update: pageIdentifier+publicationUid+kind+bodyMarkdown; publish: incidentUid+pageIdentifier), and routes the agent to get_status_page include=incidents for reads. That is explicit when-to-use plus the alternative read path, with no inference required.
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?
Beyond the annotations, the description explains why the tool is destructive and non-idempotent, clarifies that delete only unpins the resource and leaves the check/group untouched, and describes return behavior for create and delete. It also discloses scope and role requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then proceeds action by action. Every sentence supplies actionable context about behavior, alternatives, or permissions, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with nine parameters, three actions, and existing annotations and output schema, the description covers the missing behavioral context: action semantics, side effects, return shapes, authorization requirements, and the read alternative. Nothing essential for correct invocation is omitted.
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 schema already documents the parameters, but the description adds action-dependent semantics: create requires exactly one of checkUid or checkGroupUid, update requires resourceUid and preserves omitted fields, and delete unpins. It does not add much beyond the schema for fields such as position, publicName, or explanation.
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 uses specific verbs ('pin, edit or unpin') and a precise resource ('a check or a check group') in a status page section. It also maps each action to its effect, making the tool clearly distinguishable from siblings like get_status_page and manage_status_page_section.
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 explicitly states what each action does and names the alternative for reading resources: get_status_page include=resources. It also states the required mcp scope and user role, so an agent knows both how and when it may be used.
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 beyond annotations by explaining what delete actually destroys ('every resource pinned in it'), what update preserves ('omitted fields are kept'), the return shapes for create/update/delete, and the auth prerequisites (mcp scope, mcp:read tokens refused, user role). This is materially more than the destructive/non-idempotent hints.
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 action multiplexing, then one clause per action, then the alternative-read tool, then the annotation rationale and auth constraints. No sentence is filler and nothing is repeated from the 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?
Despite six parameters, three actions, and destructive behavior, the description covers everything needed to invoke it safely: per-action requirements, destructive blast radius, return values, auth scope, and the read alternative. The output schema exists but the inline return shapes are a helpful bonus.
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 adds conditional semantics the schema cannot express (name+slug required for create, sectionIdentifier required for update, omitted fields retained). 'position' is left entirely to the schema, which keeps this from a 5.
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', then enumerates each action. It clearly separates itself from sibling manage_status_page_resource (pinned resources vs sections) and points to get_status_page for reads.
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 per-action usage conditions (what is required for create vs update vs delete) and routes read-only needs to the sibling 'get_status_page include=sections'. The only exclusions are implicit, but the routing is explicit enough that an agent picks correctly.
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. 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?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, and the description adds real behavioral context beyond them: nothing is persisted, `secrets` run empty (only names are passed), script executes as a SolidPing worker, fetch returns status/headers/first 16 KB, browser returns a selector-annotated tree, and the mcp:read token scope. These are the failure modes an agent would otherwise hit blindly.
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 key point — dry-run before create_check, nothing saved — is front-loaded in the first sentence, and each following clause maps to a distinct parameter concern. It is dense rather than padded, though the semicolon-chained prose for the three kinds is a touch heavier than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, yet the description still previews status/output/metrics per kind. With annotations covering safety, six parameters fully documented, and the secret-handling caveat surfaced, nothing an agent needs to call this 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 3 applies, but the description adds genuine nuance the schema only partly carries: `env` is plaintext while `secrets` only names parameters that execute empty — a distinction that changes how the agent should compose a call. The kind-mode behaviors are restated in prose rather than adding much new beyond the enum descriptions.
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 — explore a target and dry-run a js check — and immediately scopes it as a non-persisting precursor to create_check. The three `kind` modes (script/fetch/browser) are named inline, so an agent can distinguish it from create_check, run_check, and validate_check 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 a clear when: test a check before create_check, without saving anything. That establishes the main alternative and the condition that selects it. It does not explicitly exclude the other near-siblings (validate_check, run_check, diagnose_check), which would be the only thing separating a 4 from a 5.
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. Returns {requestedAt, regions: [{region, status}]} where status is queued (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?
The description adds substantial behavioral context beyond annotations: it explains that the run follows the normal result path and can open or resolve incidents, notes rate limits per check and per organization, and specifies required scope and role. It is consistent with readOnlyHint=false and destructiveHint=false.
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 purpose and usage, then adds side effects, rate limits, return semantics, follow-up tools, and auth requirements without wasted wording. Each sentence carries actionable 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?
Given a mutation-style trigger with annotations, a full output schema, and a single well-documented parameter, the description is complete. It covers purpose, side effects, rate limits, auth requirements, output status meaning, and follow-up tools.
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 input schema has 100% description coverage for the single identifier parameter, including UID and slug examples. The description does not add identifier syntax or interpretation beyond the schema, so the high-coverage baseline of 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?
The description states a specific action and scope: run a check once, now, in every region, instead of waiting for the next scheduled period. This clearly distinguishes the tool from siblings such as list_checks, get_check, 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?
It names concrete trigger contexts (right after a fix, on a freshly created check) and directs outcome reading to diagnose_check or list_results. It does not explicitly state when not to use the tool, so it falls short of the top score.
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. 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. | |
| 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?
Annotations are absent, so the description carries the full load and it does disclose the key traits: PATCH semantics with untouched fields preserved, plus an auth requirement that mcp:read tokens are rejected and user role is needed. That is useful context, but nothing is said about whether changes are validated or rejected on failure, whether updates are versioned/reversible, or what happens to incidents when a check is disabled. Satisfies the core disclosure bar without going deep.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with zero filler, front-loaded with the verb and semantics, then alternatives, then the prerequisite. Every sentence carries distinct 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?
Given a 16-parameter tool with a nested config object, a 100% schema, and an output schema, the definition is mostly complete, but the most complex parameters (regions, regionPool, regionCount, placement) have intricate behavior that is documented only in the schema. That is acceptable, but it leaves the description thin for a tool of this complexity and adds only a global PATCH rule rather than compensating for the interactions between placement parameters.
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 and the description correctly reports that only passed fields change and that enabled:false pauses. 16 parameters with rich per-parameter docs mean the description adds little beyond that global rule, so the baseline level is appropriate.
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 ("Update an existing check by UID or slug") and the observable outcome ("return the updated check"). It also explicitly distinguishes itself from create_check and delete_check so the agent can pick it out of a crowded sibling list without opening 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?
Names the alternative tools explicitly (create_check to create, delete_check to remove) and gives a non-obvious routing rule: to pause without deleting, set enabled:false rather than calling anything else. This is exactly the when/when-not guidance an agent needs.
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. 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?
Beyond the annotations, the description discloses PATCH semantics, that omitted fields keep their current values, that slug collisions are rejected, that mcp:read tokens are refused, and that at least the user role is required. These are material behavioral and authorization details not captured by the structured 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 compact and front-loaded with the core action, then adds semantics, alternatives, and authorization constraints without repeating schema field documentation. Every sentence carries useful 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?
For a 15-parameter mutation tool with full schema coverage, annotations, and an output schema, the description covers the key prerequisites and semantics an agent needs. Return-value details are omitted appropriately because an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 15 fields in detail. The description adds useful global semantics about PATCH behavior and slug rejection, but it does not add field-level meaning beyond the schema, so the baseline of 3 is appropriate.
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 status page by UID or slug, and return the updated page. It also distinguishes this tool from create_status_page and delete_status_page, so an agent can place it correctly among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool versus alternatives: use create_status_page to make a new page and delete_status_page to remove one. It also states the precondition that the page must already exist, leaving little to inference.
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. Returns {valid, fields, warnings}: 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?
Goes well past the annotations: it explains the response contract (valid is false exactly when fields is non-empty; fields lists ALL blocking findings, not just the first; warnings never block) and states the auth requirement (works with mcp:read tokens). These are exactly the traits an agent cannot infer from readOnlyHint/idempotentHint 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 core action and tightly packed with the return semantics and usage rule. There is minor redundancy: 'a pure read, no side effects' largely restates the readOnlyHint/destructiveHint annotations, though the mcp:read token note in the same sentence adds new 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?
Given an output schema exists, the description could have stopped at purpose, yet it still clarifies how to interpret the returned fields — the highest-value ambiguity for a validation tool. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (type, config) are already documented with examples in the schema. The description adds the context that config is typically assembled by hand or adapted from a sample, but no format or syntax detail beyond the schema — the baseline 3 is appropriate.
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 ('Dry-run validate a check config') plus its scope ('without creating or changing anything'), which cleanly separates it from create_check/update_check in the sibling list. An agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the moment to use it ('before create_check when you've assembled a config from scratch or modified a sample') and names the sibling it precedes. The only mild gap is not naming update_check as a second caller, but the routing signal is unambiguous.
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.
23 tool updates
- First observed
create_check - First observed
create_status_page - First observed
delete_check - First observed
delete_status_page - First observed
diagnose_check - First observed
get_check - First observed
get_incident - First observed
get_status_page - First observed
list_check_groups - First observed
list_check_types - First observed
list_checks - First observed
list_incidents - First observed
list_regions - First observed
list_results - First observed
list_status_pages - First observed
manage_status_page_incident - First observed
manage_status_page_resource - First observed
manage_status_page_section - First observed
probe - First observed
run_check - First observed
update_check - First observed
update_status_page - First observed
validate_check
Publisher details
- Operator
- WebIngenia
- Operator website
- Not applicable
- Vendor relationship
- Not applicable
- Documentation
- https://solidping.io/docs/
- Trust center
- Not applicable
- Restrictions
- Not applicable
Related MCP Connectors
Uptime checks, status pages, incidents, and maintenance for websites, APIs, DNS, and TCP.
Uptime monitoring — monitors, incidents, heartbeats, maintenance windows, status page incidents
Uptime monitoring and public status page: HTTP monitors, down/up alerts and incidents.
Status pages and uptime monitoring: read status, monitors and incidents; open incidents.
Related MCP Servers
- AlicenseAqualityBmaintenanceSelf-hostable uptime monitoring with an MCP server for managing monitors, incidents, and status pages. Runs with Docker and Postgres, with Streamable HTTP, OAuth, and API key authentication.2628MIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients such as Claude to check current uptime status, inspect monitors and incidents, trigger fresh checks, and retrieve status summaries from a self-hosted monitoring service.10 npm2MIT

uptybots-mcp-serverofficial
AlicenseAqualityBmaintenanceUptime monitoring for websites, APIs, SSL certificates, domain expiry, ping and TCP/UDP ports. 15 tools to list, create, pause and delete monitors, pull incident timelines with error codes, and read hourly or daily uptime and response-time statistics.1576 npm1MIT
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.52AGPL 3.0
Glama MCP Gateway
Add one secure layer between your agents and this server.