Skip to main content
Glama

Server Details

Uptime monitoring, status pages and on-call in one place. Create and tune monitors for HTTP, TCP, DNS, ping, TLS certificates, domain expiry, heartbeats and scripted browser logins. Run a check on demand, read uptime and response-time history, acknowledge and resolve incidents, post incident updates, schedule maintenance windows and edit public status pages. Read-only until you grant write access.

Ownership verified
Status
Healthy
Uptime
99.9% over 76 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
uptimepage/uptimepage
GitHub Stars
50
Server Listing
uptimepage

TDQS

A3.9/5.0

Scored across 41 tools

Disambiguation4/5

Most tools target distinct resources and actions, and the descriptions explicitly separate easily confused pairs such as acknowledge/resolve/post_incident_update and pause_monitor/create_maintenance. The incident and maintenance lifecycles contain several adjacent actions, but their boundaries are clarified enough that misselection should be limited.

Naming Consistency5/5

The tool set follows a consistent snake_case verb_noun pattern throughout, e.g. create_monitor, list_incidents, update_status_page, post_maintenance_update. Plural create_monitors is an intentional batch variant and does not break the overall convention.

Tool Count2/5

At 41 tools, the surface is well above the threshold where a single MCP server becomes heavy and forces the agent to scan many similar list/get/update variants. The domain is broad, but the count still feels inflated for practical tool selection.

Completeness4/5

The server covers the core monitoring lifecycle well: monitors, incidents, maintenance windows, status pages, components, viewers, health, usage, and read-only metrics. Some lifecycle gaps remain, such as deleting monitors/status pages or removing status page components, and monitor groups can be updated but not created here.

Available Tools

41 tools
acknowledge_incidentAcknowledge incidentA
Idempotent
Inspect

Acknowledge an incident: take ownership and halt escalation. Internal/operational only — does NOT post anything to the public status page. Use post_incident_update for customer-facing updates. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe incident id.
noteNoOptional internal note recorded on the incident's activity timeline. This is operator-facing, not published to the public status page.

Output Schema

NameRequiredDescription
stateYesOperational state after the action: `triggered`, `acknowledged`, `resolved`.
incident_idYes
resolved_atNoRFC 3339 resolved (ended) time, when set.
acknowledged_atNoRFC 3339 acknowledged time, when set.

TDQS

A4.7/5.0
Behavior5/5

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

Adds behavioral context beyond annotations: it mentions confirmation prompts and token scope execution ('Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope') and explicitly states it is not read-only, aligning with readOnlyHint=false. No contradiction with annotations.

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

Conciseness5/5

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

The description is compact yet complete, with each sentence serving a purpose: state the action, scope, alternatives, execution behavior, and read-only status. It is front-loaded with the primary purpose and avoids redundancy.

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

Completeness5/5

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

Given the presence of an output schema and annotations, the description covers all necessary context: purpose, usage boundaries, mutation behavior, and authorization. Nothing critical is missing for an agent to correctly invoke the tool.

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

Parameters3/5

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

Schema coverage is 100%, and the schema already describes both id and note clearly. The description does not add parameter-specific meaning; it only reinforces that the note is internal via 'Internal/operational only' but doesn't elaborate on the parameters themselves.

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

Purpose5/5

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

The description clearly states the action: 'Acknowledge an incident: take ownership and halt escalation.' It identifies the specific resource and distinguishes it from sibling tools by explicitly saying it is internal/operational only and does not post to the public status page, pointing to post_incident_update for customer-facing updates.

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

Usage Guidelines5/5

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

Provides explicit when-not-to-use guidance ('does NOT post anything to the public status page') and names the alternative tool ('Use post_incident_update for customer-facing updates'). Also clarifies it's not read-only, helping agents decide between mutation and read tools.

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

add_status_page_componentsAdd status page componentsA
Idempotent
Inspect

Add monitors to a status page as public components, in one confirmation where the client can show a prompt. Give each a public_name the page's readers will understand, since the monitor's own name is operator-facing, and a public_group to file related components together. Monitors already on the page are reported as such rather than duplicated. detail_link_enabled publishes a per-monitor detail view that shows the monitor's real name and address, not public_name. groups adds monitor groups as live sections: a heading with the members' combined state, every member as its own row, and members that join or leave the group joining or leaving the page; members past the plan's public component limit stay off. Not read-only.

NameRequiredDescriptionDefault
slugYesThe page slug (from `list_status_pages`).
groupsNoMonitor groups to show as live sections, by id from `list_monitor_groups`. Every member gets a row, and members that join or leave the group later join or leave the page.
componentsNoThe monitors to add, in the order they should appear.

Output Schema

NameRequiredDescription
slugYes
addedYes
resultsYes
sectionsYes

TDQS

A4.1/5.0
Behavior4/5

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

Goes meaningfully beyond the annotations: discloses that already-present monitors are reported rather than duplicated, that group membership is live-synced (join/leave propagates to the page), that members beyond the plan's public component limit silently stay off, and that detail_link_enabled publishes the operator-facing name and address. That last point is a genuine privacy/leak warning an agent would not get from the schema. The trailing 'Not read-only' merely restates readOnlyHint=false, but it is a minor redundancy rather than a contradiction.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause and every subsequent sentence carries operational content; no filler. Some sentences are long and run-on ('groups adds monitor groups as live sections: a heading with...'), which slightly hurts scanability, and 'Not read-only' is dead weight given the annotations.

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

Completeness4/5

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

Output schema exists, so return values need not be explained, and the description covers the input semantics plus the non-obvious effects (dedup, live group sync, plan-limit truncation, detail-link exposure). What is missing is any mention of ordering interactions between components and groups in the final page layout, and explicit guidance on partial failure when only some monitors are beyond the limit.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns extra credit by supplying intent the schema lacks — why public_name matters (monitor name is operator-facing), what public_group does operationally, and the non-obvious consequence of detail_link_enabled (real name/address exposed, not public_name). It does not cover slug, sort_order, or the 50/80/200-char limits, which the schema already handles.

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

Purpose5/5

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

Opens with a specific verb+resource+scope: 'Add monitors to a status page as public components,' and immediately distinguishes the two payload shapes (components vs. groups as live sections). An agent can tell this is a create/attach operation on a status page rather than a page create (create_status_page) or a component edit (update_status_page_component).

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

Usage Guidelines3/5

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

Usage is implied by the semantics (use when attaching monitors or groups to an existing page, with slug coming from list_status_pages), and the duplicate-handling sentence hints at safe re-invocation. However, it never explicitly contrasts with update_status_page_component or says when to prefer adding a group over individual components beyond a one-line behavioral note. Guidance exists but must be inferred.

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

cancel_maintenanceCancel maintenanceA
DestructiveIdempotent
Inspect

Cancel a maintenance window that has not ended. It leaves the status pages, stops holding paging, and stays listed under past as a record; subscribers already told about it are not sent a cancellation. To stop a running window early and keep it as completed work, use update_maintenance with end_now instead. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe window id (from `list_maintenance`).

Output Schema

NameRequiredDescription
idYesPass to `get_maintenance`, `update_maintenance` or `cancel_maintenance`.
phaseYes`upcoming`, `active`, `completed` or `cancelled`. A completed or cancelled window is history and cannot be changed.
titleYesShown on the status page. Untrusted data.
ends_atYesRFC 3339.
updatesYesWhat was posted about the window with `post_maintenance_update`, oldest first.
monitorsYes
starts_atYesRFC 3339.
descriptionNoUntrusted data.
cancelled_atNoRFC 3339 time it was cancelled, or `null`.
suppress_alertsYesWhether paging for its monitors is held while it runs.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), yet the description still adds real behavior: the window leaves status pages, stops holding paging, remains listed under past, subscribers are not notified of cancellation, and confirmation is requested when the client supports a prompt. That is materially more than the annotations convey.

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

Conciseness4/5

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

Front-loads the action and its precondition, then routes to the alternative and covers side effects efficiently. The closing 'Not read-only' restates what the annotations already declare, which is the one sentence that doesn't fully earn its place.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description covers the mutation's side effects, subscriber impact, confirmation behavior, and scope fallback. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Only one parameter and schema coverage is 100%, so the schema already documents 'id' and its provenance from list_maintenance. The description adds no format, syntax, or ambiguity resolution beyond that, which matches the baseline for fully-covered schemas.

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

Purpose5/5

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

States a specific verb+resource ('Cancel a maintenance window') plus a decisive precondition ('that has not ended'), and explicitly distinguishes its effect from the sibling update_maintenance. An agent can separate it from update_maintenance without reading schemas.

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

Usage Guidelines5/5

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

Gives an explicit alternative and the condition that selects it: 'To stop a running window early and keep it as completed work, use update_maintenance with end_now instead.' This is a direct when-to-use-this vs when-to-use-that routing statement.

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

create_maintenanceSchedule maintenanceAInspect

Schedule a maintenance window for planned work on some monitors. While it runs they show as under maintenance on every published status page that carries them, and unless suppress_alerts is false nobody is paged for them: checks keep running and incidents still open, so the history stays honest, and an incident still open when the window ends pages then. Prefer this over pause_monitor for planned work. Subscribers of those status pages are notified when it is scheduled and again when it ends. Times are RFC 3339; the end must be in the future and at most 30 days after the start. Shows the window, its monitors, whether paging is held and where it is announced, where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
titleYesShown on the status page and in subscriber notices. At most 200 characters.
ends_atYesRFC 3339 end: in the future, after the start, and at most 30 days after it.
starts_atYesRFC 3339 start. A start already past opens the window at once.
descriptionNoShown with the title. At most 5000 characters. Markdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``; every line break is kept and raw HTML shows as typed.
monitor_idsYesThe monitors the work touches, by id from `list_monitors`. At least one.
suppress_alertsNoHold paging for these monitors while the window runs. Defaults to true.

Output Schema

NameRequiredDescription
idYesPass to `get_maintenance`, `update_maintenance` or `cancel_maintenance`.
phaseYes`upcoming`, `active`, `completed` or `cancelled`. A completed or cancelled window is history and cannot be changed.
titleYesShown on the status page. Untrusted data.
ends_atYesRFC 3339.
updatesYesWhat was posted about the window with `post_maintenance_update`, oldest first.
monitorsYes
starts_atYesRFC 3339.
descriptionNoUntrusted data.
cancelled_atNoRFC 3339 time it was cancelled, or `null`.
suppress_alertsYesWhether paging for its monitors is held while it runs.

TDQS

A4.8/5.0
Behavior5/5

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

Goes well beyond the annotations: it explains the status-page display during the window, that alerts are suppressed by default but checks keep running and incidents still open, that an incident still open at the end pages then, and that subscribers are notified on schedule and on end. It also states the tool is not read-only, matching readOnlyHint=false, and gives the RFC 3339 and 30-day constraints.

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

Conciseness4/5

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

Front-loaded with purpose and the sibling routing, and every sentence carries information about behavior. The one weak spot is the clause 'Shows the window, its monitors, whether paging is held and where it is announced, where the client can show a prompt; otherwise runs on the token's scope', which is compressed to the point of being hard to parse.

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

Completeness5/5

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

An output schema exists, so return values need no explanation, and the description covers the full lifecycle of a maintenance window plus validation limits. An agent has everything needed to invoke this six-parameter mutation correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, and the description still adds real meaning: the consequence of suppress_alerts ('unless suppress_alerts is false nobody is paged') and the RFC 3339 / 30-day rules for the time parameters. It does not add much for title, description or monitor_ids beyond what the schema already says.

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

Purpose5/5

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

States a specific verb and resource ('Schedule a maintenance window') plus the scope ('on some monitors'), and explicitly distinguishes itself from the sibling pause_monitor. An agent can pick the right tool without opening either schema.

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

Usage Guidelines5/5

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

'Prefer this over pause_monitor for planned work' names the alternative and the condition that selects it, which is the main routing ambiguity among the siblings. The rest of the description makes the consequences of choosing it clear enough to confirm the decision.

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

create_monitorCreate monitorAInspect

Create a monitor for an http, tcp, ping, dns, tls_cert, domain_expiry, heartbeat or manual check. A manual monitor has nothing to probe; set its state afterwards with set_monitor_state. The check is run once before anything is saved and the result is shown to the user along with every setting it would apply; where the client can show a prompt, nothing is created unless they approve; otherwise the monitor is created on the token's scope and the trial result comes back with it. Bind it to alerts as you create it: pass channel_ids from list_notification_channels (this needs the channels:read scope), and if the org has no channel yet, say so rather than leaving a monitor that pages nobody. Leave regions unset unless the user named where they want the check to run from — omitted, it probes from the operator's default set, which is already the intended coverage; naming more regions than the plan allows is refused outright. Request headers and a request body can be set, but a credential must be referenced rather than pasted: write Bearer {{ my_key }} and call list_variables for the keys this org has. A URL carrying a username or password is refused, and browser flows cannot be created here — add those in the app. Not read-only.

NameRequiredDescriptionDefault
nameYesWhat the operator will see in lists and alerts.
tagsNoAt most 50, each at most 50 characters.
checkYes
regionsNoProbe regions to run the check from, as ids from `list_regions`. Omit unless the user named the places they want covered: omitting takes the regions `list_regions` flags `default_selected`, which is the coverage the operator chose, capped at the plan's region cap and falling back to the control plane's own region when nothing is flagged. A vantage point can be offered without being on by default, so the full catalog is not the thorough answer. Rejected for a heartbeat, which is pinged rather than probed, and a set larger than a `max_regions` `list_regions` reports is refused outright, not trimmed to fit.
group_nameNoOperator-side grouping label.
channel_idsNoChannel ids from `list_notification_channels` to alert. Omitting them creates a monitor that pages nobody, which is worth saying out loud rather than leaving for an outage to reveal. The channels themselves are set up in the app, since they hold the tokens and addresses.
interval_secsNoSeconds between checks, held to the plan's floor and the check kind's own floor. Omit it to get the cadence the app's own picker opens this kind at, which is well above the hard minimum for the slow-moving kinds: a certificate is checked twice a day, a domain registration daily.
region_policyNoDetection quorum across probe regions.
notify_recoveryNoWhether recovery is announced. Defaults to true.
alert_confirmationsNoConsecutive failing checks before the monitor alerts. Minimum 1, defaults to 2.
recovery_period_secsNoSeconds a recovered monitor must stay healthy before its incident closes; a failure confirmed inside the window keeps the incident open, so a flapping service reads as one outage. 0 to 1800; 0 closes on the confirming checks alone. Defaults to 180 on an HTTP, TCP, ping, DNS or flow monitor and 0 on the rest. Not for a manual monitor.
renotify_interval_secsNoSeconds before the first reminder while an outage stays unacknowledged; each further reminder waits twice as long, up to a day. 0 turns reminders off; otherwise at least 60. Defaults to 3600.

Output Schema

NameRequiredDescription
idYes
nameYes
probeNoThe trial run's outcome, which the operator saw before approving. Absent for a heartbeat, which has nothing to probe.
alertsYesThe channels this monitor will alert, by name, or `nobody` when nothing reaches it. One covered by a channel's tag rule rather than a binding is marked `by tag`. A channel that cannot deliver says so here.
addressYesWhat the check watches, as stored.
regionsYesProbe regions the monitor was assigned, which is the operator's default set when `regions` was omitted. Empty for a heartbeat.
interval_secsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false) are consistent with the closing "Not read-only." The description adds substantial behavior beyond them: a trial check runs before anything is saved, a prompt gates creation where the client supports it, and credentials are refused if pasted. Useful operational context rather than restated safety flags.

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

Conciseness4/5

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

Front-loads purpose then layers behavioral constraints; every sentence carries a distinct rule (trial check, approval gate, alerts, regions, credentials). It is dense and long for a single paragraph, but no sentence is filler.

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

Completeness5/5

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

Given a 12-parameter tool, an output schema that already carries return shape, and annotations covering safety, the description supplies the missing operational rules (approval flow, region defaults and caps, credential-by-reference, alert binding) that an agent needs to invoke it correctly.

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

Parameters4/5

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

Schema coverage is already 92%, so the baseline is 3; the description still adds real meaning, e.g. that omitted regions fall back to the operator's default set, that an oversized region set is refused rather than trimmed, and the credential-reference syntax for headers/body. Some content (credential rules, header format) duplicates the schema text, which keeps it from a 5.

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

Purpose5/5

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

States a specific verb ("Create") and resource ("monitor") and enumerates the eight supported check kinds (http, tcp, ping, dns, tls_cert, domain_expiry, heartbeat, manual). This lets an agent distinguish it immediately from sibling create_monitors and from update_monitor without opening any schema.

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

Usage Guidelines5/5

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

Explicit when/when-not and alternatives: manual monitors use set_monitor_state afterwards, regions should be left unset unless the user named locations, browser flows must be added in the app rather than here, and channels come from list_notification_channels. It names the exact sibling tools that complete the workflow.

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

create_monitorsCreate monitorsAInspect

Create several monitors at once, with one confirmation covering the batch where the client can show a prompt. Every check is run once first and all the results are shown together, so a misconfigured endpoint is visible before anything is saved. An item that fails validation or its trial run is reported in the results and the rest are still created. Prefer this over repeated create_monitor calls whenever the user names more than one thing to watch: it costs them one prompt instead of many. Same per-monitor fields and same limits as create_monitor. Not read-only.

NameRequiredDescriptionDefault
monitorsYesThe monitors to create. Each is validated and probed before the single confirmation covering the batch.

Output Schema

NameRequiredDescription
createdYes
resultsYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false, idempotentHint=false, destructiveHint=false. The description adds behavior an agent cannot get from those: the batch is pre-flight probed before saving, all results are surfaced together, and partial failure is non-fatal (a failing item is reported while 'the rest are still created'). That partial-success contract is the single most important thing to know before calling a batch-creation tool.

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

Conciseness4/5

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

The purpose and the when-to-use rule are front-loaded in the first and fourth sentences, which is the right ordering. Six sentences is slightly more than needed, and the trailing 'Not read-only' merely restates readOnlyHint=false rather than earning its place.

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

Completeness5/5

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

An output schema exists, so return shape need not be described. Combined with the schema, the description covers what an agent needs: batch semantics, the pre-save probe, the confirmation prompt, and the partial-failure outcome. Nothing material is left unstated.

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

Parameters4/5

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

Schema coverage is 100% and the nested $defs already document every per-monitor field in depth, so the baseline is 3. The description adds a useful pointer beyond the schema: 'Same per-monitor fields and same limits as create_monitor' tells the agent to mirror a sibling tool's accepted fields and limits rather than infer them.

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

Purpose5/5

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

The opening sentence states a specific verb and resource with scope: 'Create several monitors at once.' It goes further and names the sibling it replaces, explicitly contrasting with 'repeated create_monitor calls', so an agent can distinguish it without opening either schema.

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

Usage Guidelines5/5

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

Gives an explicit selection rule: 'Prefer this over repeated create_monitor calls whenever the user names more than one thing to watch.' The alternative (create_monitor) is named and the condition that selects it is stated, 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.

create_status_pageCreate status pageAInspect

Create a status page. It is created unpublished unless you pass enabled, so its components can be curated before anyone can read it. The slug is the page's public address: it is first-come across the platform and moving it later breaks every existing link, so confirm it with the user rather than inventing one. Pass access with protected true to make it private: only the listed domains and addresses can open it, after signing in with a code sent to their email (Team plan). Add monitors to it with add_status_page_components. Not read-only.

NameRequiredDescriptionDefault
nameYesPage display name, at most 80 characters.
slugYesURL slug, lowercase. This is the page's public address and cannot be guessed back later, so pick it deliberately.
accessNoMake it private from the start. Omit for a public page.
enabledNoDefaults to false: a page is created dark so components can be curated before anyone can read it.

Output Schema

NameRequiredDescription
nameYes
slugYes
accessNoWho may open it, or null for a page never made private.
enabledYes
public_urlYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false, and the description reinforces 'Not read-only' while adding genuine context beyond them: the unpublished-by-default state, the platform-wide first-come slug semantics with link-breakage warning, the private-access sign-in flow with email codes (Team plan), and the password caveat that the secret never passes through this call.

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

Conciseness4/5

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

Five dense sentences, front-loaded with purpose and default state before drilling into slug and access semantics. Every sentence carries information relevant to correct invocation, though the access/plan parenthetical is slightly heavy for a description of this length.

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

Completeness5/5

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

With an output schema present, return values need no explanation, and the description covers the remaining gaps: the default unpublished state, slug permanence and uniqueness, privacy semantics, and the follow-up tool for adding monitors. An agent has everything needed to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description nonetheless adds meaning the schema does not carry, such as the platform-wide slug uniqueness and the instruction to confirm it with the user, plus the practical effect of enabling the page and of setting access.protected=true. This is additive rather than redundant.

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

Purpose5/5

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

States a specific verb and resource ('Create a status page') and immediately distinguishes its scope from siblings by naming the companion tool add_status_page_components for monitor attachment. An agent can tell this apart from update_status_page or create_monitor without opening any schema.

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

Usage Guidelines4/5

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

Gives clear operating context: pages are created dark, add components separately, and confirm the slug with the user rather than inventing one. It stops short of explicitly naming when to prefer update_status_page or the conditions under which creation should be refused (e.g., slug collision handling), but the when-to guidance is strong.

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

get_flow_runsBrowser flow runsA
Read-only
Inspect

A browser flow monitor's recent runs over a window (1h/24h/7d/30d): every declared step with its outcome and duration, the step a failure stopped on, and the page the browser saw. Use this to answer why a login check failed. Read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`), of a `flow` monitor.
windowYesTime window: `1h`, `24h`, `7d`, or `30d`.

Output Schema

NameRequiredDescription
runsYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description reinforces it with 'Read-only.' The description adds behavioral context by specifying the time window options (1h/24h/7d/30d) and the type of data returned (every declared step, failure step, page). This adds value beyond the schema and annotation without contradicting them. No hidden side effects are mentioned, but the bar is met given the annotation.

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

Conciseness5/5

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

The description is two sentences, with the first packing all essential facts about the resource, data, and scope, and the second giving a practical use case. There is no redundant or filler language; every phrase contributes.

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

Completeness5/5

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

With an output schema present, the description need not detail return formats. It explains what the tool returns conceptually, the windows, the monitor type, and a motivating use case. For a two-parameter read-only tool, this is complete.

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

Parameters3/5

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

The input schema already provides descriptions for both parameters with 100% coverage. The description only restates the window choices and confirms the id must be a flow monitor (already in the schema). No additional parameter semantics are added, so the baseline of 3 applies.

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

Purpose5/5

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

The description opens with a specific noun phrase ('A browser flow monitor's recent runs') and details the contents (steps, outcomes, durations, failure step, page). It clearly specifies the resource (flow monitor runs) and the action (get). It also distinguishes from siblings by focusing on recent runs with failure details, and even offers a concrete use case ('why a login check failed').

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

Usage Guidelines4/5

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

The description provides a clear context for when to use the tool: 'Use this to answer why a login check failed.' It implies this is the diagnostic tool for inspecting individual runs and step outcomes. However, it does not name alternative tools or specify exclusions, so it falls short of full alternative guidance.

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

get_flow_step_trendBrowser flow step trendA
Read-only
Inspect

How long each step of a browser flow monitor takes over a window (1h/24h/7d/30d), and how far it has moved: per step the earliest and latest mean duration, their ratio, and how many runs passed or failed it. Use this to spot a step drifting toward failure while the monitor still reports up. Read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`), of a `flow` monitor.
windowYesTime window: `1h`, `24h`, `7d`, or `30d`.

Output Schema

NameRequiredDescription
stepsYes

TDQS

A4.1/5.0
Behavior4/5

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

In addition to the read-only annotation, the description discloses the exact output semantics: per-step earliest/latest mean duration, ratio, and pass/fail run counts. It also notes the window values (1h/24h/7d/30d), making the tool's behavior more transparent beyond the annotation.

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

Conciseness4/5

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

The description is two sentences, front-loading the core purpose and then the use case. Though the first sentence is dense, every clause adds value and there is no filler or redundancy.

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

Completeness4/5

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

Given a 2-parameter read-only tool with an output schema, the description is quite complete: it explains the kind of analysis, the exact metrics returned, and the intended diagnostic use. It does not cover edge cases like empty data, but the output schema likely addresses return structure, and the tool is simple enough that this is sufficient.

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

Parameters3/5

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

Input schema covers 100% of parameters, with descriptions for both 'id' and 'window'. The description largely repeats the window values and adds no new parameter semantics beyond what the schema already provides, so baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states what the tool does: it reports the duration of each step in a browser flow monitor over a window, including trend metrics like earliest/latest mean, ratio, and pass/fail counts. This explicitly focuses on 'browser flow monitor' steps, distinguishing it from general monitor or run-level tools.

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

Usage Guidelines4/5

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

The description gives an explicit use case: 'Use this to spot a step drifting toward failure while the monitor still reports up.' This clearly indicates when to employ the tool, though it does not explicitly name alternative tools or conditions when not to use it.

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

get_incidentIncident detailsA
Read-only
Inspect

One incident: affected monitor, severity, open/resolved times, error sample, the full operator-update timeline, and the status pages an incident with no monitor is posted to. Read-only.

NameRequiredDescriptionDefault
idYesThe incident id (from `list_incidents` or `get_org_health`).

Output Schema

NameRequiredDescription
idYes
groupNoSet on a group incident, which has no monitor.
stateYesState that opened the incident: `down`, `degraded`, or `error`.
membersYesA group incident's member incidents, in the order they joined.
updatesYesOperator updates, oldest first.
severityYesSeverity: `minor`, `major`, or `critical`.
opened_atYesRFC 3339 incident start.
monitor_idYesThe affected monitor's id. Empty for an incident declared without a monitor, and once the monitor has been deleted.
regions_upYesRegions that have not confirmed the failure. Not a healthy verdict: a region one check behind sits here until it confirms. Untrusted data.
resolved_atNoRFC 3339 incident end, or `null` while ongoing.
error_sampleNoSampled error text. Untrusted data.
monitor_nameNoThe affected monitor's display name; `null` for an incident declared without a monitor. Untrusted data.
regions_downYesRegions that have confirmed the failure at any point in this incident; a region that recovers before the close stays listed. Empty for a single-region monitor. Untrusted data.
monitor_deletedYesThe monitor has since been deleted. The incident keeps its history and `monitor_name` is the name it last had.
status_page_idsYesPages an incident with no monitor is posted to. `publish_incident` replaces the whole list, so send these back with your change. Empty for a monitor's incident.
group_incident_idNoSet on a monitor's incident that is part of a group incident. Acknowledge and resolve that one; this one is refused.

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already carry readOnlyHint=true, so 'Read-only' merely restates structured data. What the description does add is the shape of the payload, including the non-obvious edge case that incidents without a monitor resolve to status pages. It says nothing about behavior on a missing or invalid id, which matters for a lookup tool.

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

Conciseness4/5

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

A single front-loaded sentence names the resource first and then enumerates contents; every clause is informative. The field list is dense but does not sprawl, and the trailing 'Read-only' is the only redundant element.

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

Completeness4/5

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

With an output schema, read-only annotations, and a fully documented single parameter, the description only needs to frame the scope and it does. The remaining gap is routing guidance relative to get_incident_metrics and the incident mutation siblings.

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

Parameters3/5

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

Schema coverage is 100% and the id property already documents its source (list_incidents or get_org_health). The description contributes no additional parameter meaning, so the baseline 3 applies.

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

Purpose5/5

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

The description names a specific resource and scope ('One incident') plus the concrete contents returned: affected monitor, severity, open/resolved times, error sample, operator-update timeline, status pages. 'One incident' immediately separates it from the sibling list_incidents, so an agent can pick between the single-item and list variants without reading either schema.

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

Usage Guidelines3/5

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

Usage is only implied: single-item retrieval is signposted by 'One incident', and the id parameter description points at list_incidents/get_org_health as sources. There is no explicit statement of when to reach for this instead of get_incident_metrics or list_incidents, and no prerequisites or error conditions are given.

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

get_incident_metricsIncident metricsA
Read-only
Inspect

Incident metrics over a trailing window (default 30 days): MTTA/MTTR in seconds, total incidents, counts by severity and state, auto- vs human-resolved, and the noisiest monitors. Read-only.

NameRequiredDescriptionDefault
window_daysNoTrailing window in days (1..=365). Defaults to 30 when omitted.

Output Schema

NameRequiredDescription
totalYesIncidents opened in the window.
by_stateYes
mtta_secsNoMean time to acknowledge, seconds. `null` if none were acknowledged.
mttr_secsNoMean time to resolve, seconds. `null` if none were resolved.
by_severityYes
window_daysYes
top_monitorsYesNoisiest monitors, most incidents first.
auto_resolvedYesResolved automatically on recovery, with no human resolver.
human_resolvedYesResolved by a person.
closed_with_monitorYesClosed because their monitor or their group was deleted; counted in neither of the above nor in MTTR.

TDQS

A3.7/5.0
Behavior3/5

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

'Read-only' merely restates readOnlyHint=true, so no credit there. The description does add the aggregation semantics (trailing window, default 30 days, time units in seconds) which is genuine context, but it says nothing about whether figures are org-wide, how freshness/latency behaves, or cost of the call.

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

Conciseness4/5

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

A single dense sentence with the window scope front-loaded and the metric list following. Efficient, though the metric enumeration overlaps with what the output schema already defines.

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

Completeness4/5

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

An output schema exists, so the description need not explain return values, and it still covers read-only status plus window semantics. The only real gap is the aggregation scope (organization-wide vs monitor-specific) and any relationship to get_org_health.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents window_days with range 1..=365 and the 30-day default. The description's 'trailing window (default 30 days)' adds no syntax or semantic detail beyond that, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource (incident metrics) and enumerates exactly what is aggregated: MTTA/MTTR in seconds, totals, severity/state breakdowns, auto-vs-human resolution, noisiest monitors. That content signature cleanly separates it from list_incidents, get_incident and get_org_health without needing to name them.

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

Usage Guidelines3/5

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

The 'trailing window (default 30 days)' phrasing implies the reporting context, but there is no explicit when-to-use, when-not-to-use, or routing toward list_incidents or get_org_health for other needs. Usage is inferable rather than stated.

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

get_maintenanceMaintenance window detailsA
Read-only
Inspect

One maintenance window: title, description, start and end, phase, the monitors it covers, and whether it holds their paging. Read-only.

NameRequiredDescriptionDefault
idYesThe window id (from `list_maintenance`).

Output Schema

NameRequiredDescription
idYesPass to `get_maintenance`, `update_maintenance` or `cancel_maintenance`.
phaseYes`upcoming`, `active`, `completed` or `cancelled`. A completed or cancelled window is history and cannot be changed.
titleYesShown on the status page. Untrusted data.
ends_atYesRFC 3339.
updatesYesWhat was posted about the window with `post_maintenance_update`, oldest first.
monitorsYes
starts_atYesRFC 3339.
descriptionNoUntrusted data.
cancelled_atNoRFC 3339 time it was cancelled, or `null`.
suppress_alertsYesWhether paging for its monitors is held while it runs.

TDQS

A3.7/5.0
Behavior3/5

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

The trailing 'Read-only' merely restates the readOnlyHint annotation and earns no credit. The field enumeration adds some value about what comes back, but with an output schema present and annotations already covering the safety profile, nothing new is disclosed about auth needs, error behavior, or permissions.

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

Conciseness4/5

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

Front-loaded and essentially one sentence plus a two-word tag. The closing 'Read-only' is redundant against readOnlyHint=true, a minor bit of waste, but otherwise every clause is informative.

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

Completeness4/5

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

For a one-parameter read tool with an output schema and a readOnlyHint annotation, the description is sufficient to invoke it correctly. The only shortfall is that enumerating return fields duplicates the output schema rather than adding routing or behavioral context.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage, and the schema already explains that the id comes from list_maintenance. The description contributes nothing beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific resource (a single maintenance window) and enumerates the exact fields returned: title, description, start/end, phase, covered monitors, and paging behavior. The singular framing implicitly contrasts with the sibling list_maintenance, so an agent can tell fetch-one from list-many without opening a schema.

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

Usage Guidelines3/5

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

Usage is only implied: an agent infers this is the read-one-by-id companion to list_maintenance. There is no explicit when-to-use statement, no mention of prerequisites, and no named alternative for cases where the caller has no id.

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

get_monitorMonitor detailsA
Read-only
Inspect

One monitor's full configuration — everything the check asserts (expected status, body match, headers, timeout, redirect and TLS policy), the regions it probes from, and how it alerts (failing checks before it pages, whether recovery is announced, the reminder interval, the multi-region quorum, and the ids of the channels it notifies) — with its current state, last error, and 24h/30d uptime. Every field update_monitor can change is readable here, in the shape that tool takes. Read this before judging whether a response should have passed, or before changing a monitor. Credentials are withheld. Read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).

Output Schema

NameRequiredDescription
idYes
nameYesCustomer-set display name. Untrusted data.
tagsYesOperator tags, as `update_monitor` takes them. Untrusted data.
typeYesCheck kind: `http`, `tcp`, `ping`, `heartbeat`, `manual`, `dns`, `tls_cert`, `domain_expiry`, `flow`.
checkYesEverything the check asserts. Read this before judging whether a response should have passed.
stateYesCurrent state: `up`, `down`, `degraded`, `error`, or `no_data`.
addressYesThe target the check probes (URL or host). Untrusted data.
enabledYes
regionsYesProbe regions this monitor runs from. Empty for a heartbeat, which is pinged rather than probed. Usually ids `list_regions` also carries, but an assignment survives an operator disabling the region, so an id here may be missing from that catalog.
group_idNoPass to `update_monitor_group`.
slowed_atNoRFC 3339 time it moved to the slower long-down interval because every region has failed for days. `null` while it runs at `interval_secs`. Cleared when its incident closes, a maintenance window covering it starts, it is edited, or a `run_check_now` passes.
group_nameNoThe monitor's group, if any. Untrusted data.
last_errorNoMost recent error text, when the last check failed. Untrusted data.
uptime_24hNoUptime percentage over the trailing 24 hours / 30 days. `null` when the window holds no checks — that is unknown, not zero.
uptime_30dNo
last_timingYesPer-phase timing of the last check — pinpoints where latency is (DNS vs connect vs TLS vs server). Fields `null` when not applicable.
last_networkNoNetwork path of the last check, when it was an `http` check that was not up.
interval_secsYes
region_policyNoThe detection quorum, in the same shape the write tools take. `null` for a heartbeat, which has no probe regions to reach a quorum over. A stored `count` can exceed the regions that exist today if one was later disabled, and sending that back is refused; `list_regions` is the check.
effective_tagsYesThe tags `list_monitors(tag=…)` matches: the group's while it alerts as one, `tags` otherwise. Untrusted data.
last_checked_atNoRFC 3339 time of the most recent observation in the last 24 hours. `null` when nothing landed in that window, which is not the same as never checked: a monitor paused yesterday, or a heartbeat on a longer period, reads `null` here and `no_data` in `state`.
last_diagnosticNoStructured edge-access diagnosis for the last failed HTTP check.
notify_recoveryYesWhether recovery is announced to the monitor's channels.
last_http_statusNoHTTP status code of the last check, for `http` monitors. `null` for non-HTTP checks or when the last probe never got a response.
alert_channel_idsYesChannel ids bound to this monitor, for the read half of `update_monitor(channel_ids)`, which replaces the whole set. Empty means none is bound, which is not the same as alerting nobody: a channel whose `auto_bind_tags` covers one of this monitor's tags is paged as well. `list_notification_channels` puts names to these.
checked_every_secsYesHow often it is checked: `interval_secs`, or the long-down interval while `slowed_at` is set. Report this, not `interval_secs`.
last_response_sizeNoResponse body size of the last check in bytes, when measured.
managed_externallyYesTerraform declares this monitor, so `update_monitor`, `pause_monitor` and `resume_monitor` all refuse it. Change it in the `.tf` instead.
alert_confirmationsYesConsecutive failing checks before the monitor alerts.
group_alerts_as_oneYesIts group alerts as one: a failure joins the group's one incident and pages the group's channels and policy, so `alert_channel_ids` stay quiet until the monitor leaves the group or the switch is off.
recovery_period_secsYesSeconds a recovered monitor must stay healthy before its incident closes. 0 closes on the confirming checks alone.
renotify_interval_secsYesSeconds before the first reminder while an outage stays unacknowledged; each further reminder waits twice as long, up to a day. 0 means reminders are off.

TDQS

A4.2/5.0
Behavior4/5

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

With readOnlyHint already set, the description still adds real context: 'Credentials are withheld' warns the agent that secrets will be absent and prevents false assumptions, and the round-trip guarantee ('every field update_monitor can change is readable here, in the shape that tool takes') tells the agent it can safely read-modify-write. 'Read-only' merely restates the annotation.

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

Conciseness4/5

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

Three sentences, front-loaded with the core identity, then usage conditions. The long parenthetical enumeration of alerting fields is dense but each item maps to actual returned data, so it earns its place; only slightly over-packed for a single-screen read.

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

Completeness5/5

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

An output schema exists so return shape needn't be spelled out, and the description still covers what's included and what's deliberately excluded (credentials). Combined with the safety hint and the read-before-update advice, an agent has everything needed to call this correctly.

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

Parameters3/5

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

Single parameter with 100% schema coverage, and the schema already says the id comes from list_monitors. The description adds nothing beyond that about the id (format, prefix, or failure mode for a bad id), so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('One monitor's full configuration') and enumerates exactly what is returned: assertion fields, probe regions, alerting behavior, current state, last error, uptime windows. This clearly separates it from get_monitor_history (history), list_monitors (enumeration), and update_monitor (mutation).

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

Usage Guidelines4/5

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

Gives concrete when-to-use conditions: 'before judging whether a response should have passed, or before changing a monitor.' Implicitly positions itself against update_monitor by guaranteeing field parity. No explicit when-not guidance or direct naming of get_monitor_history as the alternative for historical data.

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

get_monitor_historyMonitor historyA
Read-only
Inspect

One monitor's history over a window (1h/24h/7d/30d): uptime, latency series, a per-region split of the same window, failures with error text, and incident windows. Pass region to narrow it to one probe region and tell a partial outage from a total one. Read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).
regionNoNarrow uptime, the latency series, and the region breakdown to one probe region (an id the monitor is assigned to, from `get_monitor.regions`). Omit for every region together.
windowYesTime window: `1h`, `24h`, `7d`, or `30d`.

Output Schema

NameRequiredDescription
regionNoThe region this answer was narrowed to, or `null` for all of them.
uptimeNoUptime percentage over the window. `null` when the window holds no checks — that is unknown, not zero. Unfiltered it counts confirmed incidents; under a `region` filter it is that region's raw check rate, so the two are not comparable.
regionsYesPer-region split of the same window, so a partial outage is visible. Always every region the monitor runs in, including under a `region` filter, and empty when it runs in only one. Regions that ran no checks in the window are omitted; this reads per-minute data, which is kept for 30 days, so at the far edge of a `30d` window a region can be short of samples or absent while the headline numbers still cover it.
failuresYesConfirmed failures on the monitor as a whole. A `region` filter does not narrow these: an incident is raised for the monitor, not per region.
incidentsYesIncident windows on the monitor as a whole, unnarrowed by `region` for the same reason as `failures`.
latency_seriesYes

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already covers the safety profile, and the description reinforces it with 'Read-only.' It adds genuine value by disclosing the payload composition (per-region split, failure error text, incident windows), though the existing output schema would carry some of that weight.

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

Conciseness4/5

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

A single front-loaded sentence plus one purpose clause and a safety tag — dense but every listed item is informative. The comma-separated enumeration is slightly heavy but not wasteful.

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

Completeness5/5

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

With a full input schema, an output schema, and a readOnly annotation, the description supplies everything else an agent needs: what the payload covers, the purpose of region filtering, and the safety profile. No material gaps.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; the description earns above baseline by explaining what `region` actually scopes (uptime, latency series, region breakdown) and why an agent would narrow it, which goes beyond the schema's wording. `id` and `window` need no extra explanation given the schema's enumerations.

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

Purpose5/5

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

States a specific verb+resource ('one monitor's history') and enumerates exactly what the response contains (uptime, latency, region split, failures, incident windows). This clearly separates it from get_monitor (config) and list_monitors (enumeration).

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

Usage Guidelines4/5

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

Explains the operational purpose of the `region` param — telling a partial outage from a total one — which gives concrete when-to-use context. It does not explicitly contrast with get_monitor or list_monitors, so it stops short of full alternative routing.

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

get_org_healthOrg healthA
Read-only
Inspect

Org health summary: per-state monitor totals and the worst currently-failing monitors. The one-shot answer to 'what is broken right now?'. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
orgYesThe org slug this connector is bound to.
worstYesNon-up monitors, newest failure first, capped.
totalsYes

TDQS

A4.5/5.0
Behavior4/5

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

The readOnlyHint annotation already indicates this is a safe read operation. The description adds value by explaining the output content (per-state totals and worst failing monitors) and the 'current' snapshot nature, which goes beyond the annotation. The explicit 'Read-only' statement is consistent with the annotation.

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

Conciseness5/5

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

The description is two short sentences, front-loaded with the key summary and immediately followed by the use case. Every word earns its place, and the redundant 'Read-only' is minimal and harmless.

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

Completeness5/5

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

For a simple no-parameter tool with an output schema present, the description is complete: it states what the tool does, what data it returns, and when to use it. There are no significant gaps given the tool's simplicity.

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

Parameters4/5

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

The tool has zero parameters, so there is nothing to explain. The empty schema is fully covered, and the description correctly omits unnecessary parameter details. Baseline 4 is appropriate for a no-parameter tool.

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

Purpose5/5

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

The description clearly identifies the tool as providing an org health summary with per-state monitor totals and the worst currently-failing monitors. This is specific and distinguishes it from sibling tools like list_monitors and get_incident, and the 'one-shot answer' phrase further clarifies its scope.

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

Usage Guidelines4/5

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

The description explicitly states the use case: 'The one-shot answer to what is broken right now?'. It does not mention alternative tools or exclusions, but the positioning as a summary tool is clear enough to guide appropriate selection.

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

get_org_usageUsage against planA
Read-only
Inspect

Which org this connector is bound to, and the account's resource usage against plan limits: monitors, status pages, members, components, and key policy values. Caps are pooled across every org the account owns, so the counts can exceed what this one org holds. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
orgYesThe org slug this connector is bound to.
planYesPlan id (e.g. `free`, `pro`).
membersYes
targetsYes
org_nameYesThe org's display name.
status_pagesYes
retention_daysYesHistory retention, days.
public_componentsYes
maintenance_windowsYesCounts windows that have not ended (upcoming and active). Completed windows do not count.
notification_channelsYes
min_check_interval_secsYesMinimum allowed check interval, seconds.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the trailing 'Read-only' adds nothing. However, the description contributes a genuinely non-obvious behavioral fact: caps are pooled across every org the account owns, so counts can exceed what this org holds. That caveat prevents a wrong interpretation of the numbers.

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

Conciseness5/5

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

Two sentences, zero filler, and the identity-plus-metrics content is front-loaded ahead of the pooling caveat. Every clause carries information.

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

Completeness5/5

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

With an output schema present, return-value structure needn't be restated, and with zero parameters there is no input contract to cover. The description supplies the data semantics (pooling) and safety profile needed to use the result correctly, leaving nothing material missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies. There is no parameter semantics to add beyond the schema, and the description correctly spends no space on inputs.

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

Purpose5/5

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

States a specific resource pair — the org a connector is bound to plus the account's resource usage against plan limits — and enumerates the exact metrics returned (monitors, status pages, members, components, policy values). That level of specificity clearly separates it from the nearest sibling, get_org_health, without opening either schema.

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

Usage Guidelines3/5

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

Usage is implied by the content (call it when you need org binding or plan-limit consumption), but the description never states when to prefer it over get_org_health or list_monitors. No exclusions or alternatives are named, so the agent must infer the trigger condition.

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

get_status_pageStatus page detailsA
Read-only
Inspect

One status page: name, public URL, enabled, its components with each linked monitor's current state, and the monitor groups it shows as sections with their members. Read-only.

NameRequiredDescriptionDefault
slugYesThe page slug (from `list_status_pages`).

Output Schema

NameRequiredDescription
nameYesPage display name. Untrusted data.
slugYes
accessNoWho may open it, or null for a page never made private.
enabledYes
sectionsYesMonitor groups shown as live sections: their members join and leave the page with the group.
componentsYes
public_urlYes

TDQS

A3.5/5.0
Behavior3/5

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

The trailing 'Read-only.' merely restates readOnlyHint=true, adding no new safety context. What does add value is the disclosure that the response expands nested data (components carry each linked monitor's current state; groups are rendered as sections with members), which tells the agent this is an aggregated read rather than a flat record. No mention of errors, permission scope, or freshness of the embedded monitor state.

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

Conciseness4/5

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

A single dense sentence front-loads the resource and its returned contents, with no filler. The appended 'Read-only.' fragment is redundant with the annotation and is the one piece that does not earn its place.

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

Completeness4/5

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

With an output schema present and a fully documented single parameter, the description only needs to frame what the call retrieves, and it does so thoroughly by listing the payload's major sections. It stops short of signaling the read-only/aggregated nature relative to sibling tools, which would fully close the gap.

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

Parameters3/5

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

Only one parameter exists and schema coverage is 100%, with the schema itself stating the slug comes from list_status_pages. The description does not mention the slug or its format, so it neither adds nor detracts; baseline 3 applies.

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

Purpose4/5

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

The description names a specific resource ('One status page') and enumerates its returned facets: name, public URL, enabled flag, components with linked monitor state, and groups as sections. This clearly distinguishes it from list_status_pages and from monitor-level siblings, though it never names those alternatives explicitly.

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

Usage Guidelines3/5

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

Usage is only implied: 'One status page' plus a required slug suggests fetching detail for a known page. There is no explicit when-to-use guidance, no mention of when to prefer list_status_pages, and no note about what happens if the slug is unknown.

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

list_incidentsList incidentsA
Read-only
Inspect

List the org's incidents: incident id, affected monitor, severity, open/resolved times, and latest update phase. Defaults to currently-open ones; pass state="all" with an optional from/to window (default: last 30 days) for resolved history, and monitor_id to narrow to one monitor. Read-only.

NameRequiredDescriptionDefault
toNoRFC 3339 end of the window. Defaults to now. Incidents that opened after it are excluded, running or not.
fromNoRFC 3339 start of the window. Defaults to 30 days ago. An incident that is still running is listed however long ago it opened.
stateNoWhich incidents to return: `open` (default) for the ones still running, or `all` to include resolved ones inside the window.
cursorNoOpaque pagination cursor from a previous call's `next_cursor`. It carries the whole query, so send it on its own: any other filter passed alongside it is ignored rather than silently changing the page.
monitor_idNoRestrict to one monitor (id from `list_monitors`).

Output Schema

NameRequiredDescription
toYes
fromYesRFC 3339 window actually read, after the defaults and the one-year cap. It bounds the *resolved* incidents only: one that is still running is listed however long ago it opened, so it can be older than `from`. Describe spans from these, never from what was asked for.
itemsYes
next_cursorNo

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, and the description's 'Read-only' statement simply repeats that. However, the description adds useful behavioral context beyond annotations: default filtering to open incidents and a default 30-day window for resolved history. Pagination behavior is left to the schema's cursor documentation.

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

Conciseness5/5

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

The description is two compact sentences, front-loads the purpose and returned fields, then packs the filter defaults and usage conditions without waste.

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

Completeness5/5

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

Given the output schema exists and the input schema has full parameter descriptions, the description covers the operational essentials: default state, resolved-history window, monitor filtering, and read-only nature. Nothing an agent needs in order to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the input schema already documents every parameter, including state, from/to defaults, cursor behavior, and monitor_id. The description repeats the key semantics but adds little beyond what the schema provides; baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific verb and resource ('List the org's incidents') and enumerates the returned fields (id, monitor, severity, times, latest update phase). It is clearly a plural listing tool, but it does not explicitly differentiate itself from siblings like get_incident or list_maintenance.

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

Usage Guidelines4/5

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

It explains the default behavior (currently open), when to pass state="all" with from/to for resolved history, and how monitor_id narrows scope. It gives clear usage conditions, though it does not explicitly name get_incident as the alternative for retrieving a single incident.

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

list_maintenanceList maintenance windowsA
Read-only
Inspect

List maintenance windows: title, start and end, phase (upcoming, active, completed or cancelled), the monitors each covers, and whether it holds their paging. status narrows to active, upcoming or past (ended or cancelled); the default is all, latest start first. Cursor-paginated. Read-only.

NameRequiredDescriptionDefault
cursorNoOpaque pagination cursor from a previous call's `next_cursor`. It carries the whole query, so send it on its own.
statusNoDefaults to `all`.

Output Schema

NameRequiredDescription
itemsYes
next_cursorNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, and the description adds real value on top: cursor-based pagination and per-status ordering behavior (soonest first, most recent first, latest start first). It doesn't mention permission/auth requirements, but the pagination and ordering contract is the important operational detail here.

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

Conciseness4/5

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

Single dense paragraph, front-loaded with what is returned before the filtering and pagination mechanics, and every clause conveys usable information. The trailing 'Read-only' duplicates the readOnlyHint annotation, a small redundancy.

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

Completeness5/5

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

With an output schema present, return values need not be explained, yet the description still covers field content, filtering semantics, default behavior, ordering, and pagination. Nothing an agent needs in order to invoke this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100% and the MaintenanceStatus enum already documents each value plus its ordering, so the description's status explanation largely restates structured data. It reinforces the default and filtering intent but adds no syntax or format detail the schema lacks; baseline 3 is appropriate.

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

Purpose5/5

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

Names a specific verb and resource ('List maintenance windows') and enumerates exactly what each entry contains (title, start/end, phase, covered monitors, paging hold). This clearly separates it from the single-window sibling get_maintenance and from the other list_* tools.

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

Usage Guidelines4/5

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

Explains precisely how the status filter narrows results (active, upcoming, past = ended or cancelled) and what the default is, which tells an agent when to reach for this tool versus get_maintenance. It stops short of naming an explicit alternative for single-window lookups, so it gives clear context but no exclusion guidance.

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

list_monitor_groupsList monitor groupsA
Read-only
Inspect

The org's monitor groups, empty ones included: name, whether the group alerts as one (a member's failure opens one group incident that pages the group's channels, and the members' own stay quiet), member count, the group incident open now, its channels, reminder interval, whether another member going down sends a message, and tags. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes

TDQS

A3.6/5.0
Behavior3/5

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

The trailing 'Read-only' merely restates readOnlyHint=true, earning no extra credit, but the parenthetical genuinely explains the group-alerting model (a member failure opens one group incident and suppresses member alerts), which helps an agent interpret results. It says nothing about rate limits, ordering, or result size, so it adds only moderate value over the annotations.

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

Conciseness4/5

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

A single front-loaded sentence with the scope ('the org's monitor groups, empty ones included') stated first. The long field enumeration somewhat duplicates the output schema that already exists, which is the only inefficiency.

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

Completeness4/5

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

With an output schema present, the description does not need to document return shapes, and it usefully defines the one non-obvious concept (the group incident). A note on ordering or result volume would make it fully complete for an argument-free list tool.

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

Parameters4/5

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

The tool takes zero parameters, so there is no parameter semantics to explain; baseline for a no-param tool is 4. The description correctly spends its words on scope and returned fields instead.

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

Purpose4/5

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

States a specific resource and scope: the org's monitor groups, explicitly including empty ones, and enumerates the salient fields. It is clearly distinguishable from get_monitor (single monitor) and update_monitor_group (mutation), though it never names those siblings or says 'returns all'.

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

Usage Guidelines3/5

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

Usage is only implied – an agent infers it should call this to survey monitor groups. There is no explicit 'use this when…' guidance, no mention of when to prefer get_monitor or list_monitors, and no note on ordering or pagination for an unpaginated list.

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

list_monitorsList monitorsA
Read-only
Inspect

List monitors with optional state/type/tag filters and cursor pagination. Each item carries its current state and last-checked time. Read-only.

NameRequiredDescriptionDefault
tagNoFilter to monitors carrying this exact tag.
typeNoFilter by check kind: `http`, `tcp`, `ping`, `heartbeat`, `manual`, `dns`, `tls_cert`, `domain_expiry`, `flow`.
stateNoFilter by current state: `up`, `down`, `degraded`, `error`, `no_data`.
cursorNoOpaque pagination cursor from a previous call's `next_cursor`.

Output Schema

NameRequiredDescription
itemsYes
next_cursorNo

TDQS

A3.6/5.0
Behavior3/5

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

readOnlyHint=true already declares the safety profile, and "Read-only" merely restates it. The note that each item carries current state and last-checked time is useful, but with an output schema present that information is already available structurally, and nothing is said about page size limits or ordering of results.

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

Conciseness5/5

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

Three short sentences, zero filler, and the filter/pagination scope is front-loaded before the return-shape note. Nothing could be cut without losing information.

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

Completeness4/5

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

With annotations covering read-only status, a full schema, and an output schema, the description covers the essentials for a filtered list call. It stops short of telling the agent how pagination terminates or whether results are ordered, the only real remaining gap.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already enumerates the valid type and state values plus the cursor's origin. The description only names the same three filter categories, adding no semantics (e.g., whether tag matching is exact or whether filters combine with AND) beyond the schema.

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

Purpose4/5

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

States a specific verb and resource ("List monitors") plus the scope of its filters and pagination, so the agent knows exactly what the call returns conceptually. It never explicitly contrasts itself with get_monitor or list_monitor_groups, so the sibling distinction is only implied by the verb.

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

Usage Guidelines3/5

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

"Optional" filters imply you call it bare to enumerate everything, which is usable guidance, but there is no explicit when-to-use/when-not, no pointer to get_monitor for a single record, and no note on when to prefer filtered listing over client-side filtering.

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

list_notification_channelsList notification channelsA
Read-only
Inspect

The org's notification channels: id, operator-set name, kind (email, slack, telegram, webhook, and so on), and whether the channel is enabled. Two flags say a channel is not working even where it reads as ready: awaiting_verification for an email address nobody confirmed, and not_delivering for an enabled channel whose recent alerts all failed to arrive. auto_bind_tags is the channel's tag rule: it also pages any monitor carrying one of those tags, so a monitor with no binding can still be covered. Channel settings are withheld, since they hold webhook URLs and bot tokens. Channels are created in the Uptimepage app, not here. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only assert readOnlyHint=true, but the description adds substantial behavioral context: the meaning of awaiting_verification and not_delivering (a channel can read as ready yet be broken), how auto_bind_tags extends coverage to tagged monitors, and that channel settings are withheld because they contain webhook URLs and bot tokens. This is real disclosure beyond the annotation.

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

Conciseness4/5

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

Front-loaded with the resource and its fields, then layers the two health flags, the auto_bind_tags rule, and the security caveat. Dense but every clause carries information; only mildly longer than strictly necessary.

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

Completeness5/5

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

Given an output schema exists, the description need not explain return values, yet it usefully annotates the non-obvious flags (awaiting_verification, not_delivering, auto_bind_tags) that a raw schema would not interpret. Combined with the creation-boundary note and withheld-settings warning, 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.

Parameters4/5

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

Zero input parameters, so the baseline is 4; there is nothing for the description to add or compensate for on the input side. It correctly spends no words pretending there are parameters.

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

Purpose5/5

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

States a specific verb+resource ('The org's notification channels') and enumerates the fields returned (id, name, kind, enabled), so the agent knows exactly what it will get. No sibling tool covers notification channels, making it trivially distinguishable from the rest of the catalog.

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

Usage Guidelines4/5

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

Clarifies the boundary that channels are created in the Uptimepage app, not via this tool, implicitly steering the agent away from looking for a create sibling. However, it does not state explicit when-to-use/when-not conditions or name an alternative read path, so it falls short of a full 5.

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

list_regionsList probe regionsA
Read-only
Inspect

The fleet's probe regions: id, display name, city, country, continent, and whether each is on by default for a new monitor. Reports max_regions only when the plan reaches fewer regions than the catalog lists, so a set too large to be accepted is visible before it is sent. Use it to pass a valid region to get_monitor_history, and to read where a check would run from. This is a catalog, not a menu to fill: leave create_monitor.regions unset unless the user named the places they want covered. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes
max_regionsNoHow many of these regions one monitor may probe from, when the plan allows fewer than the catalog holds. A `create_monitor` naming more is refused outright, not trimmed to fit. Null when the plan reaches every region listed, which is not licence to name them all: what a monitor takes by default is `default_selected`, not this ceiling.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, and the description reinforces it with 'Read-only.' It adds valuable behavioral detail about `max_regions` appearing only when the plan limit is lower than catalog count, which is beyond annotation coverage.

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

Conciseness5/5

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

Three sentences, each earning its place: the catalog contents, the max_regions behavior, and usage guidance. The most critical usage warning is placed last but clearly marked, and the text is front-loaded with the resource description.

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

Completeness5/5

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

With an output schema present, the description doesn't need to detail return values. It covers the fields, the edge case of max_regions, and proper usage, making it fully complete for an agent to call correctly without ambiguity.

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

Parameters4/5

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

The tool has zero parameters, so the description carries no parameter burden. The description focuses on output and usage, which is appropriate for a parameterless tool; a 4 reflects the baseline for 0-param tools.

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

Purpose5/5

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

The description clearly states the tool lists probe regions and specifies the exact fields returned: id, display name, city, country, continent, and default status. It also explains its role in supplying valid `region` values for other tools, distinguishing it from sibling list tools.

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

Usage Guidelines5/5

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

The description explicitly directs when to use it: to pass a valid `region` to get_monitor_history and to read where a check runs. It also gives a clear exclusion: not to use it as a menu to fill create_monitor.regions unless the user named specific places.

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

list_status_pagesList status pagesA
Read-only
Inspect

List the org's status pages: slug, name, public URL, enabled. Cursor-paginated. Read-only.

NameRequiredDescriptionDefault
cursorNoOpaque pagination cursor from a previous call's `next_cursor`.

Output Schema

NameRequiredDescription
itemsYes
next_cursorNo

TDQS

A4.2/5.0
Behavior4/5

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

The description adds behavioral details beyond the readOnlyHint annotation by disclosing cursor-based pagination and the specific fields returned. While 'read-only' repeats the annotation, the pagination behavior is valuable and not present in the annotations.

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

Conciseness5/5

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

The description is three short sentences, front-loaded with the action and resource. Every phrase contributes to the tool's understanding, with no filler or redundant clauses beyond the optional 'Read-only' which is also in annotations.

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

Completeness4/5

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

For a simple list operation with a single optional cursor parameter and an existing output schema, the description sufficiently conveys purpose, pagination, and output fields. It lacks explicit default page size or contrast with get_status_page, but these are not critical given the schema and output schema.

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

Parameters3/5

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

The input schema already provides a complete description of the cursor parameter (opaque cursor from next_cursor), achieving 100% schema coverage. The description merely mentions cursor-paginated, which aligns with the schema but adds no new syntax or semantics beyond what the schema documents.

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

Purpose5/5

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

The description states a specific verb 'List', identifies the resource 'status pages', specifies scope 'org's', and enumerates the fields returned (slug, name, public URL, enabled). This clearly distinguishes it from sibling tools that list incidents, monitors, regions, etc., and from get_status_page which retrieves a single page.

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

Usage Guidelines4/5

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

The description clearly communicates the tool's function for listing all status pages and notes cursor-based pagination, which implies its use case for enumerating status pages. It does not explicitly contrast with get_status_page or provide exclusionary guidance, but the purpose is self-evident among siblings.

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

list_status_page_viewersList status page viewersA
Read-only
Inspect

List who signed in to a private status page: each viewer's address, first and last visit, saved passkeys, whether they subscribe by email, and whether they are blocked; and for the page password, which names nobody, the devices signed in with it, its last sign-in and the wrong tries in 24 hours. Addresses are customer data. Read-only.

NameRequiredDescriptionDefault
slugYesThe page slug (from `list_status_pages`).

Output Schema

NameRequiredDescription
viewersYes
passwordNo`null` for a page never made private.

TDQS

A3.9/5.0
Behavior4/5

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

The readOnlyHint annotation already covers the safety profile, yet the description adds real value beyond it: it flags 'Addresses are customer data' (a PII/privacy warning) and discloses the returned behavioral data such as blocked status and wrong-try counts. It stops short of describing auth/permission prerequisites for reading this sensitive data.

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

Conciseness4/5

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

Front-loaded with the verb and resource, and every clause names concrete return data or a constraint, so little is wasted. It is a single dense sentence, but it is appropriately sized for the amount of information conveyed.

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

Completeness4/5

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

With an output schema present, the description need not enumerate return values, yet it usefully previews them, and annotations carry the read-only guarantee. The only gap is the absence of guidance on prerequisites for accessing customer data on private pages.

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

Parameters3/5

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

Schema description coverage is 100% and the single slug parameter is fully documented in the schema (including its provenance from list_status_pages), so the baseline of 3 applies. The description adds no additional meaning about the slug itself.

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

Purpose5/5

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

States a specific verb and resource ('List who signed in to a private status page') and enumerates exactly what the result contains. It is clearly distinct from siblings such as list_status_pages and get_status_page, so an agent can pick it without opening a schema.

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

Usage Guidelines3/5

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

The description scopes applicability to private status pages, which implies when the tool is relevant, but it names no alternative and gives no explicit when-to-use/when-not guidance against siblings like get_status_page or list_status_pages.

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

list_tagsList tagsA
Read-only
Inspect

Every tag in use across the org's monitors, most-used first, with how many monitors carry each. Pass one back as the tag filter to list_monitors. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes
truncatedYesThe org has more tags than the cap returned here, so a tag missing from `items` is not proof it does not exist.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description redundantly states 'Read-only.' However, it adds behavioral details beyond annotations: it lists tags sorted by usage ('most-used first') and includes per-tag monitor counts, plus the scope covers 'every tag in use across the org's monitors.' This enriches the agent's understanding of output formatting and data scope.

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

Conciseness5/5

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

Two sentences, front-loaded with the essential output description, immediately followed by a usage hint and read-only note. No wasted words.

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

Completeness5/5

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

Given the tool has no parameters and an output schema exists, the description is fully sufficient. It explains the ordering, counting, and how to use the results with list_monitors. No gaps for a simple read-only list tool.

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

Parameters4/5

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

The tool has zero parameters, so the schema fully covers parameter semantics. The description adds no parameter-specific detail, but none is needed. Baseline for 0 parameters is 4.

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

Purpose5/5

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

The description clearly states the tool lists tags in use across the org's monitors, ordered by usage frequency, and includes monitor counts. It also distinguishes itself by explaining how the output feeds into list_monitors, which is its primary use case.

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

Usage Guidelines4/5

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

The description provides explicit guidance: pass a returned tag as the `tag` filter to list_monitors. It implies the tool is a precursor to filtering monitors, but does not explicitly state exclusions or alternatives beyond that. The context is clear and actionable.

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

list_variablesList variablesA
Read-only
Inspect

The org's reusable variables: key, and whether it is a secret. Values are never returned, and a secret's value is never even read. Write a variable into a monitor's header or body as {{ key }}, which is resolved when the check runs: this is how an authenticated check is built here, since pasting the credential itself is refused. Variables are created and edited in the app, not here. Read-only.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
itemsYes

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the readOnlyHint annotation, the description discloses that values are never returned and that secret values are never even read. It also explains the security context around credential pasting being refused. This gives the agent an accurate mental model of the tool's safety and behavior.

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

Conciseness5/5

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

The description is compact and front-loaded with the core purpose. Each sentence contributes meaningful context: the resource, the privacy behavior, the usage pattern, and the mutation boundary. There is no redundant filler.

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

Completeness5/5

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

The tool has no parameters and an output schema, so the description only needs to convey what is listed and any important behavioral caveats. It does both thoroughly, including the critical guarantee that secret values are never read or returned. Nothing an agent needs to safely call this tool is missing.

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

Parameters4/5

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

The input schema has no parameters, so there are no parameter semantics to document. The baseline for a zero-parameter tool is 4, and the description appropriately signals that the tool simply lists all variables without requiring input.

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

Purpose5/5

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

The description clearly states the tool lists the org's reusable variables with their keys and secret status. It is distinct from every sibling list_* tool because no other sibling targets variables, and it names the exact resource being operated on.

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

Usage Guidelines4/5

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

The description explains why and how variables are used: they go into a monitor's header or body as {{ key }} and are resolved at check time to build authenticated checks. It also explicitly says variables are created and edited in the app, not here, which prevents an agent from attempting mutations. It does not name sibling alternatives, but none are direct alternatives for this resource.

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

pause_monitorPause monitorA
DestructiveIdempotent
Inspect

Pause a monitor (stop its checks until resumed). For planned work, create_maintenance holds paging instead while the checks keep running. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only; idempotent.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).

Output Schema

NameRequiredDescription
idYes
enabledYesThe monitor's enabled state after the change.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=true, so the closing 'Not read-only; idempotent' is largely a restatement. The genuinely additive content is the confirmation behavior ('Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope'), which tells the agent about interactive and auth-fallback behavior not captured in annotations.

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

Conciseness5/5

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

Three tight sentences, each carrying distinct information: the core action, the sibling alternative for planned work, and the confirmation/scope behavior. The core action is front-loaded and nothing is padded.

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

Completeness5/5

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

An output schema exists, so return values need no explanation. For a single-param mutation the description covers the effect, the alternative tool, the confirmation prompt, and the token-scope fallback — enough for an agent to call it correctly.

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

Parameters3/5

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

There is a single parameter with 100% schema description coverage, and the schema already tells the agent the id comes from list_monitors. The description adds no format or sourcing detail beyond that, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb+resource ('Pause a monitor') and immediately clarifies the scope of the effect ('stop its checks until resumed'), which an agent can distinguish from sibling operations like resume_monitor or create_monitor without opening a schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: 'For planned work, create_maintenance holds paging instead while the checks keep running' names the alternative and the condition that selects it. It also implies the resume_monitor counterpart ('until resumed').

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

post_incident_updatePost incident updateAInspect

Post a public, customer-facing update to an incident's status-page timeline (phase + message). This is what your subscribers and status-page visitors see. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe incident id.
phaseNoOptional phase: `investigating`, `identified`, `monitoring`, `resolved`, `postmortem`. Defaults to `investigating`.
messageYesPublic message shown on the status page. Markdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``; every line break is kept and raw HTML shows as typed.

Output Schema

NameRequiredDescription
posted_atYesRFC 3339 time the update was posted.
incident_idYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is covered; the description adds genuinely new behavior: a confirmation prompt where the client supports one, fallback to the token's scope otherwise, and the fact that the message becomes publicly visible. It does not mention whether posting a 'resolved' phase mutates incident state or any rate limits, which keeps it below a 5.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core action and audience before the confirmation caveat. 'Not read-only' is largely redundant with the readOnlyHint annotation, a minor wasted clause, but nothing else is padding.

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

Completeness4/5

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

With an output schema present and annotations covering mutability, the description supplies the missing pieces an agent needs: public visibility of the content, the confirmation/token-scope auth behavior, and the phase+message shape. It stops short of describing side effects on incident status or failure modes, which is a small residual gap.

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

Parameters3/5

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

Schema coverage is 100% and the schema already documents the id, the full phase list with default, and Markdown formatting rules. The description only restates 'phase + message' without adding syntax or constraint detail, so it earns the baseline 3 for a schema that does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource (post an update to an incident's status-page timeline) plus the fields it carries (phase + message). The incident focus cleanly separates it from the sibling post_maintenance_update, and the 'public, customer-facing' qualifier tells the agent this is outward-visible output, not an internal note.

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

Usage Guidelines3/5

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

The description establishes the audience ('what your subscribers and status-page visitors see'), which implies when this tool is appropriate, but never states explicit when-to-use or when-not conditions versus siblings like publish_incident, resolve_incident, or post_maintenance_update. The agent must infer the routing decision.

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

post_maintenance_updatePost maintenance updateAInspect

Post an update to a maintenance window: say the work is running late, that it finished, or what changed. Works on an upcoming, running or completed window (a completed window is read-only otherwise, so this is how to add a closing note), not on a cancelled one. The update shows on the status pages that show the window and goes to their email and webhook subscribers; it cannot be edited or removed. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe window id (from `list_maintenance`).
messageYesWhat readers should know now, up to 2000 characters: the work runs late, it finished, or what changed. Write it for the people reading the status page, and give any time with its zone. Markdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``; every line break is kept and raw HTML shows as typed.

Output Schema

NameRequiredDescription
idYesPass to `get_maintenance`, `update_maintenance` or `cancel_maintenance`.
phaseYes`upcoming`, `active`, `completed` or `cancelled`. A completed or cancelled window is history and cannot be changed.
titleYesShown on the status page. Untrusted data.
ends_atYesRFC 3339.
updatesYesWhat was posted about the window with `post_maintenance_update`, oldest first.
monitorsYes
starts_atYesRFC 3339.
descriptionNoUntrusted data.
cancelled_atNoRFC 3339 time it was cancelled, or `null`.
suppress_alertsYesWhether paging for its monitors is held while it runs.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations, the description explains the downstream effects: updates appear on status pages and go to email and webhook subscribers, and cannot be edited or removed. It also discloses the confirmation-prompt behavior and token-scope fallback, which are important operational details for a non-read-only action.

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

Conciseness5/5

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

The description is front-loaded with the core action and then adds scope, effects, and confirmation behavior in compact sentences. Every sentence provides useful operational context without repetition.

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

Completeness5/5

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

The description covers the tool's action, valid window states, user-visible effects, immutability, and confirmation behavior. With an output schema present and 100% parameter documentation, no critical information is missing for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters in detail, including the message length and Markdown support. The description reinforces the message intent but does not add syntax or constraints beyond the schema.

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

Purpose5/5

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

The description uses a specific verb and resource: posting an update to a maintenance window, with concrete examples of what the update can say. It also distinguishes this from window-editing operations by noting that a completed window is read-only otherwise, so this is the way to add a closing note.

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

Usage Guidelines4/5

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

It clearly states when the tool works: upcoming, running, or completed windows, and explicitly excludes cancelled windows. It does not explicitly name update_maintenance or cancel_maintenance as alternatives, but the state-based guidance is clear enough for correct use.

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

publish_incidentPublish incidentA
Idempotent
Inspect

Publish an incident so it appears on every status page carrying the affected monitor, optionally seeding the public title and description. An incident with no monitor needs status_page_ids naming the pages to show it on; the list replaces its pages, so start from get_incident's status_page_ids. Status-page subscribers may be notified. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only; idempotent.

NameRequiredDescriptionDefault
idYesThe incident id.
public_titleNoPublic headline shown on the status page.
status_page_idsNoStatus page ids (from `list_status_pages`) for an incident with no monitor; replaces its pages, so start from `get_incident`'s `status_page_ids` to add or drop one. Leave unset for a monitor's incident, which shows on the pages carrying that monitor.
public_descriptionNoPublic summary shown under the headline.

Output Schema

NameRequiredDescription
visibilityYesVisibility after the change: `public` or `internal`.
incident_idYes

TDQS

A4.4/5.0
Behavior5/5

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

Beyond annotations (readOnlyHint=false, idempotentHint=true), the description discloses that subscribers may be notified, that confirmation may be requested, and that the status_page_ids list replaces existing pages—behavioral details not captured in annotations. No contradiction.

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

Conciseness4/5

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

Four sentences, front-loaded with the main action. Each sentence adds necessary context (monitor vs no monitor, replacement behavior, notification, confirmation, idempotency). Slightly long but no redundancy.

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

Completeness5/5

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

Covers all critical aspects: the publishing behavior, the conditional use of status_page_ids, replacement semantics, notification side effects, confirmation behavior, and idempotency. The output schema exists, so return values are covered. No missing information for correct invocation.

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

Parameters3/5

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

Schema coverage is 100% with detailed descriptions for all parameters, including the replacement semantics for status_page_ids. The tool description adds only a general 'optionally seeding' phrase, which adds little beyond the schema. Baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the verb 'publish' and the resource 'incident', and explains the effect (appears on status pages). It differentiates from siblings like unpublish_incident and post_incident_update by focusing on the publishing action and its scope.

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

Usage Guidelines4/5

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

Provides explicit guidance on when to set status_page_ids (incidents with no monitor) and when not to (monitor incidents). Mentions starting from get_incident's status_page_ids. While it doesn't name alternative tools, it gives clear when/when-not conditions for parameter usage.

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

resolve_incidentResolve incidentA
DestructiveIdempotent
Inspect

Resolve an incident (mark the operational state resolved). Internal only — does not post to the public status page. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe incident id.
noteNoOptional internal note recorded on the incident's activity timeline. This is operator-facing, not published to the public status page.

Output Schema

NameRequiredDescription
stateYesOperational state after the action: `triggered`, `acknowledged`, `resolved`.
incident_idYes
resolved_atNoRFC 3339 resolved (ended) time, when set.
acknowledged_atNoRFC 3339 acknowledged time, when set.

TDQS

A4.5/5.0
Behavior5/5

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

The description adds meaningful behavioral detail beyond the annotations: it states the operation is not read-only, confirms the internal-only status page behavior, and explains the confirmation/authorization behavior ('Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope'). This is valuable context that annotations alone do not provide, and it does not contradict the destructiveHint or idempotentHint.

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

Conciseness5/5

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

The description is three concise sentences with no filler. It front-loads the core purpose, then adds behavioral caveats and a scope clarification. Every sentence contributes useful information for tool selection and invocation.

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

Completeness5/5

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

Given the output schema exists, the 100% schema coverage, and the annotations describing read-only, idempotency, and destructiveness, the description adds the remaining essential context: internal scope, public status page exclusion, and confirmation behavior. An agent has enough information to select and invoke this tool correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The description repeats the internal-only nature of the note, which is already documented in the schema, and does not add new parameter-level meaning beyond what the schema provides. The required 'id' parameter is also already described adequately in the schema.

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

Purpose5/5

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

The description states a specific verb and resource ('Resolve an incident') and clarifies the exact meaning with 'mark the operational state resolved.' It also distinguishes itself from sibling tools by explicitly noting 'Internal only — does not post to the public status page,' which differentiates it from publish_incident and related public-facing tools.

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

Usage Guidelines4/5

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

The description provides clear context for when to use the tool: resolving an incident internally without public status page impact. It does not explicitly name alternative tools, but the 'Internal only' and 'does not post to the public status page' exclusions effectively guide tool selection among siblings like publish_incident and post_incident_update.

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

resume_monitorResume monitorA
Idempotent
Inspect

Resume a paused monitor (restart its checks). Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only; idempotent.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).

Output Schema

NameRequiredDescription
idYes
enabledYesThe monitor's enabled state after the change.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already mark the tool as not read-only and idempotent, and the description restates those facts. It also adds meaningful behavioral context beyond annotations: the confirmation prompt behavior and the fallback to the token's scope when a prompt cannot be shown.

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

Conciseness4/5

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

The description is short, front-loaded with the primary action, and uses only three sentences. The 'Not read-only; idempotent' sentence partially duplicates annotations, but it is brief and does not bloat the description.

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

Completeness4/5

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

For a single-parameter tool with an output schema and annotations covering safety/idempotency, the description gives enough context to call it correctly. It explains the effect, the confirmation behavior, and token scope, and the output schema covers return values.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already explains that `id` is the monitor id from `list_monitors`. The tool description does not add extra parameter semantics, 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.

Purpose5/5

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

The description states a specific verb and resource: 'Resume a paused monitor (restart its checks).' This clearly separates it from pause_monitor and run_check_now, making the tool's purpose immediately obvious.

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

Usage Guidelines3/5

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

The phrase 'Resume a paused monitor' implies when to use it, but it does not explicitly name alternatives or state when not to use it. It gives some contextual guidance about confirmation and token scope, but no direct comparison to sibling tools.

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

run_check_nowRun check nowAInspect

Run a check on a monitor immediately and record the result. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. A down result may fire the org's normal alerts. Heartbeat monitors cannot be probed (they wait for your systems to ping them). Not read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).

Output Schema

NameRequiredDescription
idYes
errorNoError text when the probe failed. Untrusted data.
stateYesObserved state: `up`, `down`, `degraded`, `error`.
timingYesPer-phase timing of the probe (DNS / connect / TLS / first byte).
networkNoNetwork path, when this was an `http` check that was not up.
checked_atYesRFC 3339 time of the probe.
diagnosticNoStructured edge-access diagnosis, when a supported signature matched.
duration_msYes
http_statusNoHTTP status code, for `http` monitors. `null` for non-HTTP checks or when no response was received.
response_sizeNoResponse body size in bytes, when measured.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations it discloses meaningful behavior: a confirmation prompt is requested where the client can show one, otherwise it executes on the token's scope, a down result can fire the org's normal alerts, and heartbeat monitors cannot be probed. These are exactly the side effects, auth/scope, and constraint details an agent needs for a non-idempotent action.

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

Conciseness5/5

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

Four tight sentences, front-loaded with the action, then confirmation behavior, side effects, and the heartbeat limitation. Every sentence carries distinct information and none is redundant.

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

Completeness5/5

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

With an output schema present, return values need not be explained, and the description fully covers side effects, confirmation semantics, scope behavior, and the one hard exclusion. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

There is one parameter (id) with 100% schema description coverage, and the schema already points to list_monitors for the source. The description adds no syntax or format detail for the id beyond what the schema provides, so the baseline of 3 applies.

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

Purpose5/5

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

States a specific verb and resource: 'Run a check on a monitor immediately and record the result.' This is clearly distinct from sibling read tools like get_monitor and get_monitor_history, and from state tools like pause_monitor/resume_monitor, so an agent can route to 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.

Usage Guidelines4/5

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

Gives clear usage context (immediate check, confirmation prompt behavior) and an explicit exclusion (heartbeat monitors cannot be probed). However, it does not name an alternative tool or spell out when to prefer this over simply reading monitor state via get_monitor, so it stops short of full when/when-not/alternatives guidance.

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

set_monitor_stateSet manual monitor stateA
DestructiveIdempotent
Inspect

Set the state of a manual monitor: up, degraded or down. A manual monitor has no probe; its state is whatever an operator last set, for a service only people can judge, such as a SIP trunk, a carrier link or a partner's back office. Down or degraded opens an incident within about 30 seconds, which pages the monitor's channels unless a maintenance window holds it, and shows on its status pages as a major outage or degraded performance; up closes the incident. A paused monitor, or one the plan no longer covers, keeps the state and acts on it once it runs again. The note becomes the incident's cause, so make it a reason a responder can act on. Refused for any other kind of monitor. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only; idempotent.

NameRequiredDescriptionDefault
idYesThe id of a `manual` monitor (from `list_monitors`).
noteNoWhy, in one line of at most 200 characters. It becomes the incident's cause and reaches whoever is paged. Omit for none; it replaces the previous note.
stateYes

Output Schema

NameRequiredDescription
idYes
noteNoUntrusted data.
stateYes`up`, `degraded` or `down`.
set_atYesRFC 3339 time the state was set.
changedYes`false` when the monitor already had this state and note.

TDQS

A4.6/5.0
Behavior5/5

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

Far exceeds the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=true) by disclosing the ~30-second incident-open latency, that channels are paged unless a maintenance window holds it, the status-page presentation per state, that up closes the incident, that the note becomes the incident cause, and the confirmation/token-scope behavior. This is exactly the mutation side-effect detail an agent needs before calling.

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

Conciseness4/5

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

Front-loads the core action and legal values in the first sentence, then layers consequences. Dense and mostly waste-free, though the note guidance ('make it a reason a responder can act on') partially duplicates the schema's own note description.

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

Completeness5/5

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

An output schema exists so return values need no explanation, and the description covers the remaining risk surface for a mutating tool: incident lifecycle, paging, maintenance suppression, paused-plan edge case, refusal conditions, and confirmation/auth behavior. Nothing material is missing.

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

Parameters4/5

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

With 67% schema coverage the schema already documents id, state and note, but the description adds intent-level guidance the schema lacks: why the state matters (outage vs degraded on status pages), that the note must be actionable for a responder, and the monitor-kind constraint on id. It adds real semantic value over the structured fields.

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

Purpose5/5

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

States the exact verb and resource (set the state of a manual monitor) plus the three legal values, and immediately scopes it to manual monitors with no probe, distinguishing it from every update_monitor/pause_monitor sibling. An agent knows precisely what this does without opening the schema.

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

Usage Guidelines4/5

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

Gives a strong when-to-use rationale ('a service only people can judge, such as a SIP trunk, a carrier link or a partner's back office') and an explicit when-not ('Refused for any other kind of monitor'), plus the paused/no-longer-covered caveat. It stops short of naming sibling alternatives such as pause_monitor or update_monitor for adjacent operations.

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

unpublish_incidentUnpublish incidentA
DestructiveIdempotent
Inspect

Hide a published incident from the public status pages again. Its operator timeline is untouched. Asks for confirmation where the client can show a prompt; otherwise runs on the token's scope. Not read-only; idempotent.

NameRequiredDescriptionDefault
idYesThe incident id (from `list_incidents` or `get_org_health`).

Output Schema

NameRequiredDescription
visibilityYesVisibility after the change: `public` or `internal`.
incident_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Beyond the annotations, the description adds genuinely useful behavioral context: the operator timeline is untouched, and it 'asks for confirmation where the client can show a prompt; otherwise runs on the token's scope,' covering both interactive and non-interactive paths. The final sentence ('Not read-only; idempotent') restates the annotations rather than adding value, but the other disclosures lift this above baseline. No contradiction with readOnlyHint=false, idempotentHint=true, or destructiveHint=true.

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

Conciseness4/5

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

The core action is front-loaded in the first sentence, with behavioral caveats following in short, separate sentences. The only waste is the final 'Not read-only; idempotent,' which duplicates the annotations — a minor redundancy in an otherwise tight definition.

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

Completeness4/5

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

For a single-parameter tool with a full output schema and safety annotations, the description covers the essential added context: the reversible nature of the action, the unaffected operator timeline, and the confirmation/token-scope behavior. No critical call-blocking information is missing.

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

Parameters3/5

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

The schema already documents the single id parameter at 100% coverage, including a provenance hint ('from list_incidents or get_org_health'), so the schema carries the full load. The description adds no parameter-specific meaning, which per the baseline rule for high schema coverage warrants a 3.

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

Purpose4/5

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

The description uses a specific verb and resource — 'Hide a published incident from the public status pages again' — clearly identifying what the tool does. The 'again' phrasing and the unpublish/publish pairing with sibling publish_incident make the action unambiguous, though it doesn't explicitly name the sibling it inverts.

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

Usage Guidelines3/5

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

Usage context is implied: call this when an incident is currently published and you want to remove it from public status pages, and 'again' signals it reverses a prior publish action. However, it doesn't explicitly name alternatives such as publish_incident or state conditions for when not to use it, leaving the routing decision to inference.

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

update_maintenanceEdit maintenanceA
DestructiveIdempotent
Inspect

Edit an upcoming or running maintenance window: its title, description, start, end, the monitors it covers (monitor_ids replaces the whole set) or whether it holds their paging. end_now ends a running window at once and keeps it as completed work. A completed or cancelled window is history and is refused. Shows the old and new value of every field before it runs, where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe window id (from `list_maintenance`).
titleNoAt most 200 characters.
end_nowNoEnd a running window now. Cannot be combined with `starts_at` or `ends_at`.
ends_atNoRFC 3339, in the future. To stop a running window now, send `end_now` instead.
starts_atNoRFC 3339.
descriptionNoAt most 5000 characters. An empty string clears it. Markdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``; every line break is kept and raw HTML shows as typed.
monitor_idsNoReplaces the whole set, by id from `list_monitors`. Read the window first: a monitor left out stops being covered.
suppress_alertsNoHold paging for its monitors while it runs.

Output Schema

NameRequiredDescription
windowYes
changesYesWhat moved. Empty when every value sent already matched, in which case nothing was written and no confirmation was asked for.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare destructive=true and idempotent=true; the description adds genuinely new behavior: a pre-execution diff of old vs new values shown where the client supports a prompt, falling back to the token's scope. It also clarifies that end_now marks the window completed rather than deleting it. Slight repetition of 'not read-only' is the only wasted clause.

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

Conciseness4/5

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

Four dense sentences, front-loaded with the purpose and scope before the field-level and behavioral details. Every sentence carries information, though the closing 'Not read-only' is redundant with readOnlyHint=false.

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

Completeness4/5

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

With an output schema present and full parameter documentation, the description need only cover mutation semantics — and it does, including refusal of history windows and the confirmation prompt. Missing only an explicit pointer to cancel_maintenance for permanent termination.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents replace semantics, end_now exclusivity, RFC 3339 formats, and length limits. The description's restatement of monitor_ids replacing the whole set and end_now's outcome adds marginal meaning beyond the schema, so this sits at the baseline.

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

Purpose5/5

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

Opens with a specific verb+resource and an explicit scope constraint ('Edit an upcoming or running maintenance window'), then enumerates the editable fields. An agent can distinguish it from create_maintenance, cancel_maintenance, and get_maintenance without consulting any schema.

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

Usage Guidelines4/5

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

States the preconditions clearly (only upcoming or running windows; completed/cancelled are refused) and explains when to use end_now instead of end dates. It does not name cancel_maintenance as the alternative for terminating a window permanently, which is the one obvious routing gap.

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

update_monitorRetune monitorA
DestructiveIdempotent
Inspect

Change how loudly a monitor is watched: check interval, alert confirmations, recovery notices, reminder interval, tags, group, the multi-region detection quorum, and which notification channels it alerts (channel_ids replaces the whole set, and needs the channels:read scope). It cannot change what the check watches — name, address, assertions, expected status, headers, body, probe regions and owner are refused. A monitor managed by Terraform is refused outright. Shows the old and new value of every field before it runs, where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe monitor id (from `list_monitors`).
tagsNoReplaces the whole tag list. Read the monitor first: a tag left out of this list is removed. At most 50 tags, each at most 50 characters.
group_nameNoOperator-side grouping label. Send `null` to clear it; omit to keep it.
channel_idsNoReplaces the whole set of alerted channels, by id from `list_notification_channels`. Read the monitor first: a channel left out of this list stops being alerted. An empty list silences the monitor.
interval_secsNoSeconds between checks. Held to the plan's floor and the check kind's own floor, whichever is higher.
region_policyNoDetection quorum across probe regions.
notify_recoveryNoWhether recovery is announced to the monitor's channels.
alert_confirmationsNoConsecutive failing checks before the monitor alerts. Minimum 1. Raising it quietens a flapping monitor at the cost of alerting later.
recovery_period_secsNoSeconds a recovered monitor must stay healthy before its incident closes, 0 to 1800. Raising it folds a flapping monitor's short outages into one incident, at the cost of announcing recovery later.
renotify_interval_secsNoSeconds before the first reminder while an outage stays unacknowledged; each further reminder waits twice as long, up to a day. 0 turns reminders off; otherwise at least 60.

Output Schema

NameRequiredDescription
idYes
changesYesWhat moved. Empty when every value sent already matched the stored one, in which case nothing was written and no confirmation was asked for.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses that channel_ids and tags are full replacements (not merges), that Terraform-managed monitors are refused outright, and that the client previews old vs. new values before running or else acts on the token's scope. This is exactly the kind of consequence detail a destructiveHint=true mutation needs.

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

Conciseness4/5

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

Front-loaded with the core purpose and tightly organized into editable fields, refused fields, and execution behavior. It is dense but every clause carries operational weight; only the density of the long opening sentence slightly taxes readability.

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

Completeness5/5

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

For a 10-parameter mutation with an output schema present, the description covers scope requirements, refusal conditions, replacement semantics, and preview behavior, leaving nothing an agent needs to call it correctly unaddressed.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning on top of it: replacement vs. additive semantics for channel_ids and tags, the scope requirement, and the explicit list of non-editable parameters that error rather than no-op. This meaningfully compensates beyond what the schema states.

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

Purpose5/5

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

States a precise verb (change) and resource (monitor), then enumerates exactly which fields are mutable (interval, alert confirmations, recovery, renotify, tags, group, region quorum, channels) and which are refused. This distinguishes it clearly from create_monitor, pause_monitor, and set_monitor_state without needing to name them.

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

Usage Guidelines4/5

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

Gives strong when/when-not guidance: it names the preconditions (channels:read scope for channel_ids, Terraform-managed monitors are refused) and the excluded field set. It does not explicitly route to a sibling for the refused operations, but the constraints are clear enough to prevent misuse.

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

update_monitor_groupChange monitor groupA
DestructiveIdempotent
Inspect

Change a monitor group: its name, whether it alerts as one (a member's failure opens one group incident that pages the group's channels, and the members' own stay quiet), which notification channels the group incident alerts (channel_ids replaces the whole set, and needs the channels:read scope), the reminder interval, and whether another member going down sends a message. Turning alert as one on or off changes only failures that start afterwards. A group managed by Terraform is refused outright. Shows the old and new value of every field before it runs, where the client can show a prompt; otherwise runs on the token's scope. Not read-only.

NameRequiredDescriptionDefault
idYesThe group id (from `list_monitor_groups`).
nameNoNew name, at most 50 characters. Members keep their group.
alert_againNoWhether another member going down sends a message or only a timeline line.
channel_idsNoReplaces the whole set of channels the group incident alerts, by id from `list_notification_channels`. Read the group first.
alert_as_oneNoTurns alerting as one on or off. Only failures that start afterwards follow the new setting; an incident open now ends the way it started.
renotify_interval_secsNoSeconds before the first reminder while the group incident stays unacknowledged; 0 turns reminders off, otherwise at least 60.

Output Schema

NameRequiredDescription
idYes
changesYesWhat moved. Empty when every value sent already matched the stored one, in which case nothing was written and no confirmation was asked for.

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the dry-run preview (old and new value of every field, prompting where the client supports it, otherwise token-scope fallback), the hard refusal for Terraform-managed groups, the non-retroactive semantics of alert_as_one, and the scope requirement on channel_ids. Annotations only say destructive/idempotent; the description explains what is actually destroyed and what is refused.

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

Conciseness4/5

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

Front-loaded with the verb and the enumerated mutable fields, then constraints. The long parenthetical describing alert-as-one is dense but carries real semantics; a few clauses (e.g., restating channel_ids replacement already in the schema) could be trimmed without loss.

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

Completeness5/5

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

For a destructive mutation with an output schema already covering returns, the description supplies everything else an agent needs: confirmation/preview behavior, scope fallback, Terraform refusal, and retroactivity rules. Nothing material is left for the agent to guess.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds genuinely new parameter-level meaning: channel_ids requires the channels:read scope, and alert_as_one is explicitly non-retroactive for already-open incidents. The explanations of alert-as-one fan-out and alert_again largely restate the schema descriptions, keeping it below a full 5.

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

Purpose5/5

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

States a specific verb (change) and resource (monitor group) and enumerates exactly which fields are mutable: name, alert-as-one, channel set, reminder interval, alert_again. An agent can distinguish this from update_monitor and list_monitor_groups without opening any schema.

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

Usage Guidelines4/5

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

Gives concrete gating context: Terraform-managed groups are refused outright, channel_ids requires the channels:read scope, and turning alert-as-one on/off only affects failures that start afterwards. It does not name a sibling alternative (e.g., update_monitor for individual monitors) or state exclusions for when not to use it, so it stops short of a 5.

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

update_status_pageUpdate status pageA
DestructiveIdempotent
Inspect

Rename a status page, move it to a new slug, publish and unpublish it, or change who may open it. An omitted field is left alone. Changing the slug moves the public URL and breaks existing links. access replaces the page's access settings and list whole: protected true makes it private to the listed domains and addresses (Team plan), and removes subscribers the list does not cover; protected false makes it public again and keeps the list. Not read-only; idempotent.

NameRequiredDescriptionDefault
nameNoNew display name.
slugYesThe page to change, by its current slug.
accessNoReplace who may open it: make it private, change its list, or make it public again.
enabledNoPublish or unpublish the page.
new_slugNoNew slug. Changing it moves the public URL and breaks existing links.

Output Schema

NameRequiredDescription
nameYes
slugYes
accessNoWho may open it, or null for a page never made private.
enabledYes
public_urlYes

TDQS

A4.6/5.0
Behavior5/5

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

Strongly exceeds the annotations: it spells out that slug changes move the public URL and break links, that access replaces the whole settings object, that protected=true removes uncovered subscribers and requires Team plan, that protected=false keeps the list, and that it is not read-only and idempotent. These are the destructive/side-effect facts an agent needs beyond destructiveHint=true and idempotentHint=true.

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

Conciseness4/5

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

Front-loads the four capabilities, then gives the partial-update rule, then the highest-risk consequence (URL breakage), then access semantics. Well ordered and dense; the access sentence is long but every clause carries actionable meaning.

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

Completeness5/5

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

Given annotations that already flag destructiveness and idempotence, plus a 100%-covered schema and an output schema, the description supplies exactly the missing behavioral context: partial-update semantics, URL migration risk, and access replacement/subscriber-removal consequences. Nothing critical is absent for correct invocation.

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

Parameters4/5

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

Schema coverage is already 100% and includes good field descriptions, but the tool description adds cross-parameter semantics the schema cannot: omitted fields are left alone, access replaces rather than merges, and the protected true/false consequences on subscriber removal and list retention. It does not add much on name/enabled specifically, but those are self-explanatory.

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

Purpose5/5

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

The description states a specific verb and resource, then enumerates exactly the four kinds of change this tool makes: rename, re-slug, publish/unpublish, change access. It is immediately distinguishable from siblings like get_status_page, list_status_pages, create_status_page and update_status_page_component.

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

Usage Guidelines4/5

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

The description establishes when to use this tool (an existing page, partial updates) and implicitly contrasts with create_status_page by saying 'An omitted field is left alone.' It does not name alternatives explicitly, but the update-vs-create and update-page-vs-update-component boundaries are clear enough from the phrasing.

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

update_status_page_componentUpdate status page componentA
Idempotent
Inspect

Change how one monitor is presented on a status page: its public name, description, group or position; or, with section_id, a group section's heading. An omitted field is left alone. A section member's heading is its section's, so its public_group does nothing. Not read-only; idempotent.

NameRequiredDescriptionDefault
slugYesThe page slug (from `list_status_pages`).
headingNoThe section's public heading, at most 50 characters; blank shows the group's name.
monitor_idNoThe monitor id whose curation is being changed. Send this or `section_id`.
section_idNoA section (from `get_status_page`) whose `heading` is being changed.
sort_orderNo
public_nameNo
public_groupNoIgnored on a section member, whose heading is the section's.
public_descriptionNo

Output Schema

NameRequiredDescription
slugYes
monitor_idNo
section_idNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds useful behavior beyond those annotations: omitted fields are left alone, section member headings come from the section, and public_group is ignored in that case. It does not add auth or rate-limit context.

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

Conciseness5/5

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

Three tightly written sentences front-load the main action and then add the critical exception and field-preservation rule. There is no filler.

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

Completeness4/5

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

The tool is a mutation with annotations and an output schema, so the description need not explain return values. It covers the key mutation semantics and section/member exception. It could say more about monitor_id vs section_id exclusivity and error behavior, but is sufficient for correct invocation.

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

Parameters4/5

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

Schema coverage is 63%, with key parameters like slug, heading, monitor_id, section_id, and public_group documented in the schema. The description adds meaningful semantics: omitted fields are preserved, section_id targets a section heading, and public_group has no effect on section members. This compensates well for the remaining gaps such as sort_order and public_name details.

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

Purpose5/5

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

The description states a specific verb and resource: changing how one monitor is presented on a status page, or with section_id, a section heading. It clearly scopes the tool to component-level curation, distinguishing it from the page-level sibling update_status_page.

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

Usage Guidelines4/5

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

It explains the two usage paths: monitor curation by default, or section heading via section_id. It also warns that public_group does nothing for a section member. It does not name alternative tools such as update_status_page or add_status_page_components, 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.

Tool Schema Changelog

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

  1. 4 tool updates
    • Changedcreate_maintenance1 field changed
      • changedInput schema / properties / description / description
        Previous value: -"Shown with the title. At most 5000 characters."New value: +"Shown with the title. At most 5000 characters.\nMarkdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``;\nevery line break is kept and raw HTML shows as typed."
    • Changedpost_incident_update1 field changed
      • changedInput schema / properties / message / description
        Previous value: -"Public message shown on the status page."New value: +"Public message shown on the status page.\nMarkdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``;\nevery line break is kept and raw HTML shows as typed."
    • Changedpost_maintenance_update1 field changed
      • changedInput schema / properties / message / description
        Previous value: -"What readers should know now, up to 2000 characters: the work runs\nlate, it finished, or what changed. Write it for the people reading\nthe status page, and give any time with its zone."New value: +"What readers should know now, up to 2000 characters: the work runs\nlate, it finished, or what changed. Write it for the people reading\nthe status page, and give any time with its zone.\nMarkdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``;\nevery line break is kept and raw HTML shows as typed."
    • Changedupdate_maintenance1 field changed
      • changedInput schema / properties / description / description
        Previous value: -"At most 5000 characters. An empty string clears it."New value: +"At most 5000 characters. An empty string clears it.\nMarkdown: `**bold**`, `_italic_`, `[links](url)`, lists and `` `code` ``;\nevery line break is kept and raw HTML shows as typed."
  2. 10 tool updates
    • Changedadd_status_page_components6 fields changed
      • addedInput schema / $defs / NewSectionArg
        Added value: +{
        +  "description": "One monitor group to show on a page.",
        +  "properties": {
        +    "group_id": {
        +      "type": "string"
        +    },
        +    "heading": {
        +      "description": "Public heading, at most 50 characters. Defaults to the group's name.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "group_id"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / groups
        Added value: +{
        +  "description": "Monitor groups to show as live sections, by id from\n`list_monitor_groups`. Every member gets a row, and members that join\nor leave the group later join or leave the page.",
        +  "items": {
        +    "$ref": "#/$defs/NewSectionArg"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "components"
        -]New value: +[
        +  "slug"
        +]
      • addedOutput schema / $defs / SectionOutcome
        Added value: +{
        +  "description": "What became of one requested section.",
        +  "properties": {
        +    "error": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "group_id": {
        +      "type": "string"
        +    },
        +    "left_off": {
        +      "description": "Members the plan's public component limit kept off the page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "outcome": {
        +      "description": "`added`, `already_on_page`, or `failed`.",
        +      "type": "string"
        +    },
        +    "section_id": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "group_id",
        +    "outcome",
        +    "left_off"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / sections
        Added value: +{
        +  "items": {
        +    "$ref": "#/$defs/SectionOutcome"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "slug",
        -  "added",
        -  "results"
        -]New value: +[
        +  "slug",
        +  "added",
        +  "results",
        +  "sections"
        +]
    • Changedget_incident6 fields changed
      • addedOutput schema / $defs / IncidentGroup
        Added value: +{
        +  "description": "The group a group incident is about.",
        +  "properties": {
        +    "id": {
        +      "description": "`null` once the group is deleted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "The name it has, or last had. Untrusted data.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / IncidentMember
        Added value: +{
        +  "description": "One monitor's incident inside a group incident.",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "monitor_id": {
        +      "description": "Empty once the monitor has been deleted.",
        +      "type": "string"
        +    },
        +    "monitor_name": {
        +      "description": "Untrusted data.",
        +      "type": "string"
        +    },
        +    "opened_at": {
        +      "description": "RFC 3339 time the monitor went down.",
        +      "type": "string"
        +    },
        +    "resolved_at": {
        +      "description": "RFC 3339 time it recovered, or `null` while still down.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "monitor_id",
        +    "monitor_name",
        +    "opened_at"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / group
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/IncidentGroup"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Set on a group incident, which has no monitor."
        +}
      • addedOutput schema / properties / group_incident_id
        Added value: +{
        +  "description": "Set on a monitor's incident that is part of a group incident.\nAcknowledge and resolve that one; this one is refused.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / members
        Added value: +{
        +  "description": "A group incident's member incidents, in the order they joined.",
        +  "items": {
        +    "$ref": "#/$defs/IncidentMember"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "monitor_id",
        -  "monitor_deleted",
        -  "state",
        -  "severity",
        -  "opened_at",
        -  "regions_down",
        -  "regions_up",
        -  "updates",
        -  "status_page_ids"
        -]New value: +[
        +  "id",
        +  "monitor_id",
        +  "monitor_deleted",
        +  "state",
        +  "severity",
        +  "opened_at",
        +  "regions_down",
        +  "regions_up",
        +  "updates",
        +  "status_page_ids",
        +  "members"
        +]
    • Changedget_incident_metrics1 field changed
      • changedOutput schema / properties / closed_with_monitor / description
        Previous value: -"Closed because their monitor was deleted; counted in neither of the\nabove nor in MTTR."New value: +"Closed because their monitor or their group was deleted; counted in\nneither of the above nor in MTTR."
    • Changedget_monitor6 fields changed
      • addedOutput schema / properties / effective_tags
        Added value: +{
        +  "description": "The tags `list_monitors(tag=…)` matches: the group's while it alerts\nas one, `tags` otherwise. Untrusted data.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / group_alerts_as_one
        Added value: +{
        +  "description": "Its group alerts as one: a failure joins the group's one incident and\npages the group's channels and policy, so `alert_channel_ids` stay\nquiet until the monitor leaves the group or the switch is off.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / group_id
        Added value: +{
        +  "description": "Pass to `update_monitor_group`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / group_name / description
        Added value: +"The monitor's group, if any. Untrusted data."
      • changedOutput schema / properties / tags / description
        Previous value: -"Operator tags. Untrusted data."New value: +"Operator tags, as `update_monitor` takes them. Untrusted data."
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "type",
        -  "address",
        -  "check",
        -  "regions",
        -  "enabled",
        -  "interval_secs",
        -  "checked_every_secs",
        -  "alert_channel_ids",
        -  "alert_confirmations",
        -  "notify_recovery",
        -  "renotify_interval_secs",
        -  "recovery_period_secs",
        -  "managed_externally",
        -  "tags",
        -  "state",
        -  "last_timing"
        -]New value: +[
        +  "id",
        +  "name",
        +  "type",
        +  "address",
        +  "check",
        +  "regions",
        +  "enabled",
        +  "interval_secs",
        +  "checked_every_secs",
        +  "alert_channel_ids",
        +  "alert_confirmations",
        +  "notify_recovery",
        +  "renotify_interval_secs",
        +  "recovery_period_secs",
        +  "managed_externally",
        +  "group_alerts_as_one",
        +  "tags",
        +  "effective_tags",
        +  "state",
        +  "last_timing"
        +]
    • Changedget_status_page4 fields changed
      • addedOutput schema / $defs / StatusPageComponent / properties / section_id
        Added value: +{
        +  "description": "Set when a monitor group's section shows it: it follows the group, and\nits heading is the section's.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / StatusPageSection
        Added value: +{
        +  "description": "A monitor group shown on a page.",
        +  "properties": {
        +    "group_id": {
        +      "type": "string"
        +    },
        +    "heading": {
        +      "description": "The public heading: the section's own, else the group's name.\nUntrusted data.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "left_off": {
        +      "description": "Members the plan's public component limit keeps off the page.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    },
        +    "members": {
        +      "description": "Members on the page, by monitor id, in page order.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "group_id",
        +    "heading",
        +    "members",
        +    "left_off"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / sections
        Added value: +{
        +  "description": "Monitor groups shown as live sections: their members join and leave\nthe page with the group.",
        +  "items": {
        +    "$ref": "#/$defs/StatusPageSection"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "slug",
        -  "name",
        -  "public_url",
        -  "enabled",
        -  "components"
        -]New value: +[
        +  "slug",
        +  "name",
        +  "public_url",
        +  "enabled",
        +  "components",
        +  "sections"
        +]
    • Changedlist_incidents6 fields changed
      • addedOutput schema / $defs / IncidentGroup
        Added value: +{
        +  "description": "The group a group incident is about.",
        +  "properties": {
        +    "id": {
        +      "description": "`null` once the group is deleted.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "name": {
        +      "description": "The name it has, or last had. Untrusted data.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / IncidentMember
        Added value: +{
        +  "description": "One monitor's incident inside a group incident.",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "monitor_id": {
        +      "description": "Empty once the monitor has been deleted.",
        +      "type": "string"
        +    },
        +    "monitor_name": {
        +      "description": "Untrusted data.",
        +      "type": "string"
        +    },
        +    "opened_at": {
        +      "description": "RFC 3339 time the monitor went down.",
        +      "type": "string"
        +    },
        +    "resolved_at": {
        +      "description": "RFC 3339 time it recovered, or `null` while still down.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "monitor_id",
        +    "monitor_name",
        +    "opened_at"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / IncidentSummary / properties / group
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/IncidentGroup"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Set on a group incident, which has no monitor: `monitor_id` and\n`monitor_name` are empty and `members` lists the monitors down in it."
        +}
      • addedOutput schema / $defs / IncidentSummary / properties / group_incident_id
        Added value: +{
        +  "description": "Set on a monitor's incident that is part of a group incident.\nAcknowledge and resolve that one; this one is refused.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / $defs / IncidentSummary / properties / members
        Added value: +{
        +  "description": "A group incident's member incidents, in the order they joined: the\nfirst 25, `get_incident` lists the rest.",
        +  "items": {
        +    "$ref": "#/$defs/IncidentMember"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / $defs / IncidentSummary / required
        Previous value: -[
        -  "id",
        -  "monitor_id",
        -  "monitor_deleted",
        -  "monitor_name",
        -  "severity",
        -  "opened_at"
        -]New value: +[
        +  "id",
        +  "monitor_id",
        +  "monitor_deleted",
        +  "monitor_name",
        +  "severity",
        +  "opened_at",
        +  "members"
        +]
    • Addedlist_monitor_groups
    • Changedlist_monitors4 fields changed
      • addedOutput schema / $defs / MonitorListItem / properties / group_alerts_as_one
        Added value: +{
        +  "description": "Its group alerts as one: a failure joins the group's one incident and\npages the group's channels, not this monitor's own.",
        +  "type": "boolean"
        +}
      • addedOutput schema / $defs / MonitorListItem / properties / group_id
        Added value: +{
        +  "description": "Pass to `update_monitor_group`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / MonitorListItem / properties / group_name / description
        Previous value: -"Operator-side grouping label, if set. Untrusted data."New value: +"The monitor's group, if any. Untrusted data."
      • changedOutput schema / $defs / MonitorListItem / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "type",
        -  "state",
        -  "interval_secs",
        -  "checked_every_secs",
        -  "enabled"
        -]New value: +[
        +  "id",
        +  "name",
        +  "type",
        +  "state",
        +  "group_alerts_as_one",
        +  "interval_secs",
        +  "checked_every_secs",
        +  "enabled"
        +]
    • Addedupdate_monitor_group
    • Changedupdate_status_page_component9 fields changed
      • addedInput schema / properties / heading
        Added value: +{
        +  "description": "The section's public heading, at most 50 characters; blank shows the\ngroup's name.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / properties / monitor_id / description
        Previous value: -"The monitor id whose curation is being changed."New value: +"The monitor id whose curation is being changed. Send this or\n`section_id`."
      • changedInput schema / properties / monitor_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedInput schema / properties / public_group / description
        Added value: +"Ignored on a section member, whose heading is the section's."
      • addedInput schema / properties / section_id
        Added value: +{
        +  "description": "A section (from `get_status_page`) whose `heading` is being changed.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedInput schema / required
        Previous value: -[
        -  "slug",
        -  "monitor_id"
        -]New value: +[
        +  "slug"
        +]
      • changedOutput schema / properties / monitor_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • addedOutput schema / properties / section_id
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "slug",
        -  "monitor_id"
        -]New value: +[
        +  "slug"
        +]
  3. 1 tool update
    • Changedget_monitor_history3 fields changed
      • addedOutput schema / $defs / IncidentWindow / properties / paused
        Added value: +{
        +  "description": "Stretches inside the window the monitor was paused in, so nothing\nchecked it. The incident stays open across them; `uptime` does not\ncount them.",
        +  "items": {
        +    "$ref": "#/$defs/PausedStretch"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / $defs / IncidentWindow / required
        Previous value: -[
        -  "opened_at",
        -  "counts_as_downtime",
        -  "impact",
        -  "recovered"
        -]New value: +[
        +  "opened_at",
        +  "counts_as_downtime",
        +  "impact",
        +  "recovered",
        +  "paused"
        +]
      • addedOutput schema / $defs / PausedStretch
        Added value: +{
        +  "description": "A stretch an incident's monitor was paused in.",
        +  "properties": {
        +    "from": {
        +      "description": "RFC 3339 start.",
        +      "type": "string"
        +    },
        +    "until": {
        +      "description": "RFC 3339 end, when it was resumed, or `null` while still paused.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "from"
        +  ],
        +  "type": "object"
        +}
  4. 2 tool updates
    • Changedget_monitor3 fields changed
      • addedOutput schema / properties / checked_every_secs
        Added value: +{
        +  "description": "How often it is checked: `interval_secs`, or the long-down interval\nwhile `slowed_at` is set. Report this, not `interval_secs`.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / slowed_at
        Added value: +{
        +  "description": "RFC 3339 time it moved to the slower long-down interval because every\nregion has failed for days. `null` while it runs at `interval_secs`.\nCleared when its incident closes, a maintenance window covering it\nstarts, it is edited, or a `run_check_now` passes.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "type",
        -  "address",
        -  "check",
        -  "regions",
        -  "enabled",
        -  "interval_secs",
        -  "alert_channel_ids",
        -  "alert_confirmations",
        -  "notify_recovery",
        -  "renotify_interval_secs",
        -  "recovery_period_secs",
        -  "managed_externally",
        -  "tags",
        -  "state",
        -  "last_timing"
        -]New value: +[
        +  "id",
        +  "name",
        +  "type",
        +  "address",
        +  "check",
        +  "regions",
        +  "enabled",
        +  "interval_secs",
        +  "checked_every_secs",
        +  "alert_channel_ids",
        +  "alert_confirmations",
        +  "notify_recovery",
        +  "renotify_interval_secs",
        +  "recovery_period_secs",
        +  "managed_externally",
        +  "tags",
        +  "state",
        +  "last_timing"
        +]
    • Changedlist_monitors3 fields changed
      • addedOutput schema / $defs / MonitorListItem / properties / checked_every_secs
        Added value: +{
        +  "description": "How often it is checked: `interval_secs`, or the long-down interval\nwhile `slowed_at` is set. Report this, not `interval_secs`.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / $defs / MonitorListItem / properties / slowed_at
        Added value: +{
        +  "description": "RFC 3339 time it moved to the slower long-down interval because every\nregion has failed for days. `null` while it runs at `interval_secs`.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / MonitorListItem / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "type",
        -  "state",
        -  "interval_secs",
        -  "enabled"
        -]New value: +[
        +  "id",
        +  "name",
        +  "type",
        +  "state",
        +  "interval_secs",
        +  "checked_every_secs",
        +  "enabled"
        +]
  5. 4 tool updates
    • Changedcreate_status_page16 fields changed
      • removedInput schema / $defs / PageAccessArg / properties / email / default / session_days
        Removed value: -null
      • addedInput schema / $defs / PageAccessArg / properties / password
        Added value: +{
        +  "$ref": "#/$defs/PagePasswordAccessArg",
        +  "default": {
        +    "enabled": false
        +  }
        +}
      • changedInput schema / $defs / PageAccessArg / properties / protected / description
        Previous value: -"Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time."New value: +"Private when true: only people a way in lets through can open the\npage: the addresses and domains in `rules`, by a code sent to their\nemail, or anyone with the page password. False makes it public again\nand keeps the list and the password for next time."
      • changedInput schema / $defs / PageAccessArg / properties / rules / description
        Previous value: -"Who can open it, up to 500 entries. Read back, these are customer data."New value: +"Who can get an email code, up to 500 entries. Read back, these are\ncustomer data."
      • addedInput schema / $defs / PageAccessArg / properties / session_days
        Added value: +{
        +  "default": null,
        +  "description": "Keep a sign-in, by email or password, for 7, 30 or 90 days. Omit to\nkeep it until sign-out.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedInput schema / $defs / PageEmailAccessArg / properties / enabled / description
        Previous value: -"Defaults to true; a private page needs it."New value: +"Defaults to true. A private page needs it or the password."
      • removedInput schema / $defs / PageEmailAccessArg / properties / session_days
        Removed value: -{
        -  "default": null,
        -  "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        -  "format": "int32",
        -  "type": [
        -    "integer",
        -    "null"
        -  ]
        -}
      • addedInput schema / $defs / PagePasswordAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The page password way in. The password itself never passes through here:\nit is set in the app, the API or Terraform.",
        +  "properties": {
        +    "enabled": {
        +      "default": false,
        +      "description": "Anyone with the page password can open the page. Turning it on needs\none already set; turning it off keeps it and signs out everyone who\ncame in with it.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / $defs / PageAccessArg / properties / email / default / session_days
        Removed value: -null
      • addedOutput schema / $defs / PageAccessArg / properties / password
        Added value: +{
        +  "$ref": "#/$defs/PagePasswordAccessArg",
        +  "default": {
        +    "enabled": false
        +  }
        +}
      • changedOutput schema / $defs / PageAccessArg / properties / protected / description
        Previous value: -"Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time."New value: +"Private when true: only people a way in lets through can open the\npage: the addresses and domains in `rules`, by a code sent to their\nemail, or anyone with the page password. False makes it public again\nand keeps the list and the password for next time."
      • changedOutput schema / $defs / PageAccessArg / properties / rules / description
        Previous value: -"Who can open it, up to 500 entries. Read back, these are customer data."New value: +"Who can get an email code, up to 500 entries. Read back, these are\ncustomer data."
      • addedOutput schema / $defs / PageAccessArg / properties / session_days
        Added value: +{
        +  "default": null,
        +  "description": "Keep a sign-in, by email or password, for 7, 30 or 90 days. Omit to\nkeep it until sign-out.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / PageEmailAccessArg / properties / enabled / description
        Previous value: -"Defaults to true; a private page needs it."New value: +"Defaults to true. A private page needs it or the password."
      • removedOutput schema / $defs / PageEmailAccessArg / properties / session_days
        Removed value: -{
        -  "default": null,
        -  "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        -  "format": "int32",
        -  "type": [
        -    "integer",
        -    "null"
        -  ]
        -}
      • addedOutput schema / $defs / PagePasswordAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The page password way in. The password itself never passes through here:\nit is set in the app, the API or Terraform.",
        +  "properties": {
        +    "enabled": {
        +      "default": false,
        +      "description": "Anyone with the page password can open the page. Turning it on needs\none already set; turning it off keeps it and signs out everyone who\ncame in with it.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_status_page8 fields changed
      • removedOutput schema / $defs / PageAccessArg / properties / email / default / session_days
        Removed value: -null
      • addedOutput schema / $defs / PageAccessArg / properties / password
        Added value: +{
        +  "$ref": "#/$defs/PagePasswordAccessArg",
        +  "default": {
        +    "enabled": false
        +  }
        +}
      • changedOutput schema / $defs / PageAccessArg / properties / protected / description
        Previous value: -"Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time."New value: +"Private when true: only people a way in lets through can open the\npage: the addresses and domains in `rules`, by a code sent to their\nemail, or anyone with the page password. False makes it public again\nand keeps the list and the password for next time."
      • changedOutput schema / $defs / PageAccessArg / properties / rules / description
        Previous value: -"Who can open it, up to 500 entries. Read back, these are customer data."New value: +"Who can get an email code, up to 500 entries. Read back, these are\ncustomer data."
      • addedOutput schema / $defs / PageAccessArg / properties / session_days
        Added value: +{
        +  "default": null,
        +  "description": "Keep a sign-in, by email or password, for 7, 30 or 90 days. Omit to\nkeep it until sign-out.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / PageEmailAccessArg / properties / enabled / description
        Previous value: -"Defaults to true; a private page needs it."New value: +"Defaults to true. A private page needs it or the password."
      • removedOutput schema / $defs / PageEmailAccessArg / properties / session_days
        Removed value: -{
        -  "default": null,
        -  "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        -  "format": "int32",
        -  "type": [
        -    "integer",
        -    "null"
        -  ]
        -}
      • addedOutput schema / $defs / PagePasswordAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The page password way in. The password itself never passes through here:\nit is set in the app, the API or Terraform.",
        +  "properties": {
        +    "enabled": {
        +      "default": false,
        +      "description": "Anyone with the page password can open the page. Turning it on needs\none already set; turning it off keeps it and signs out everyone who\ncame in with it.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_status_page_viewers2 fields changed
      • addedOutput schema / $defs / PagePasswordUse
        Added value: +{
        +  "description": "How the page password is used. Password visitors are anonymous, so this is\nall there is to see of them.",
        +  "properties": {
        +    "enabled": {
        +      "type": "boolean"
        +    },
        +    "last_sign_in": {
        +      "description": "Last sign-in with it, RFC 3339, if any.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "sessions": {
        +      "description": "Devices signed in with it now.",
        +      "format": "int64",
        +      "type": "integer"
        +    },
        +    "wrong_tries_24h": {
        +      "description": "Wrong passwords tried in the last 24 hours.",
        +      "format": "int64",
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "enabled",
        +    "sessions",
        +    "wrong_tries_24h"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / password
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PagePasswordUse"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "`null` for a page never made private."
        +}
    • Changedupdate_status_page16 fields changed
      • removedInput schema / $defs / PageAccessArg / properties / email / default / session_days
        Removed value: -null
      • addedInput schema / $defs / PageAccessArg / properties / password
        Added value: +{
        +  "$ref": "#/$defs/PagePasswordAccessArg",
        +  "default": {
        +    "enabled": false
        +  }
        +}
      • changedInput schema / $defs / PageAccessArg / properties / protected / description
        Previous value: -"Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time."New value: +"Private when true: only people a way in lets through can open the\npage: the addresses and domains in `rules`, by a code sent to their\nemail, or anyone with the page password. False makes it public again\nand keeps the list and the password for next time."
      • changedInput schema / $defs / PageAccessArg / properties / rules / description
        Previous value: -"Who can open it, up to 500 entries. Read back, these are customer data."New value: +"Who can get an email code, up to 500 entries. Read back, these are\ncustomer data."
      • addedInput schema / $defs / PageAccessArg / properties / session_days
        Added value: +{
        +  "default": null,
        +  "description": "Keep a sign-in, by email or password, for 7, 30 or 90 days. Omit to\nkeep it until sign-out.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedInput schema / $defs / PageEmailAccessArg / properties / enabled / description
        Previous value: -"Defaults to true; a private page needs it."New value: +"Defaults to true. A private page needs it or the password."
      • removedInput schema / $defs / PageEmailAccessArg / properties / session_days
        Removed value: -{
        -  "default": null,
        -  "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        -  "format": "int32",
        -  "type": [
        -    "integer",
        -    "null"
        -  ]
        -}
      • addedInput schema / $defs / PagePasswordAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The page password way in. The password itself never passes through here:\nit is set in the app, the API or Terraform.",
        +  "properties": {
        +    "enabled": {
        +      "default": false,
        +      "description": "Anyone with the page password can open the page. Turning it on needs\none already set; turning it off keeps it and signs out everyone who\ncame in with it.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / $defs / PageAccessArg / properties / email / default / session_days
        Removed value: -null
      • addedOutput schema / $defs / PageAccessArg / properties / password
        Added value: +{
        +  "$ref": "#/$defs/PagePasswordAccessArg",
        +  "default": {
        +    "enabled": false
        +  }
        +}
      • changedOutput schema / $defs / PageAccessArg / properties / protected / description
        Previous value: -"Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time."New value: +"Private when true: only people a way in lets through can open the\npage: the addresses and domains in `rules`, by a code sent to their\nemail, or anyone with the page password. False makes it public again\nand keeps the list and the password for next time."
      • changedOutput schema / $defs / PageAccessArg / properties / rules / description
        Previous value: -"Who can open it, up to 500 entries. Read back, these are customer data."New value: +"Who can get an email code, up to 500 entries. Read back, these are\ncustomer data."
      • addedOutput schema / $defs / PageAccessArg / properties / session_days
        Added value: +{
        +  "default": null,
        +  "description": "Keep a sign-in, by email or password, for 7, 30 or 90 days. Omit to\nkeep it until sign-out.",
        +  "format": "int32",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / PageEmailAccessArg / properties / enabled / description
        Previous value: -"Defaults to true; a private page needs it."New value: +"Defaults to true. A private page needs it or the password."
      • removedOutput schema / $defs / PageEmailAccessArg / properties / session_days
        Removed value: -{
        -  "default": null,
        -  "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        -  "format": "int32",
        -  "type": [
        -    "integer",
        -    "null"
        -  ]
        -}
      • addedOutput schema / $defs / PagePasswordAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The page password way in. The password itself never passes through here:\nit is set in the app, the API or Terraform.",
        +  "properties": {
        +    "enabled": {
        +      "default": false,
        +      "description": "Anyone with the page password can open the page. Turning it on needs\none already set; turning it off keeps it and signs out everyone who\ncame in with it.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
  6. 3 tool updates
    • Changedcreate_monitor1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_records": {
        -        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "array",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "ip_version": {
        +        "description": "`any` (default), `ipv4` or `ipv6`. See `ip_version` on `Tcp`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "ip_version": {
        +        "description": "`any` (default) dials whichever of IPv6 and IPv4 connects first,\nso a broken AAAA record or IPv6 firewall stays hidden. `ipv4` or\n`ipv6` checks only that family and fails when the host has no\naddress in it. To watch both, create one monitor per family.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "ip_version": {
        +        "description": "`any` (default), `ipv4` or `ipv6`. See `ip_version` on `Tcp`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcreate_monitors1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_records": {
        -        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "array",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "ip_version": {
        +        "description": "`any` (default), `ipv4` or `ipv6`. See `ip_version` on `Tcp`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "ip_version": {
        +        "description": "`any` (default) dials whichever of IPv6 and IPv4 connects first,\nso a broken AAAA record or IPv6 firewall stays hidden. `ipv4` or\n`ipv6` checks only that family and fails when the host has no\naddress in it. To watch both, create one monitor per family.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "ip_version": {
        +        "description": "`any` (default), `ipv4` or `ipv6`. See `ip_version` on `Tcp`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_monitor6 fields changed
      • addedOutput schema / $defs / HttpCheckConfig / properties / ip_version
        Added value: +{
        +  "description": "Address family the probe dials: `any`, `ipv4` or `ipv6`. With `any`\nit takes whichever connects first, so a broken family stays hidden.",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / HttpCheckConfig / required
        Previous value: -[
        -  "url",
        -  "method",
        -  "timeout_ms",
        -  "follow_redirects",
        -  "max_redirects",
        -  "expected_status",
        -  "headers",
        -  "verify_tls",
        -  "has_basic_auth",
        -  "has_bearer_token"
        -]New value: +[
        +  "url",
        +  "method",
        +  "timeout_ms",
        +  "follow_redirects",
        +  "max_redirects",
        +  "expected_status",
        +  "headers",
        +  "verify_tls",
        +  "has_basic_auth",
        +  "has_bearer_token",
        +  "ip_version"
        +]
      • addedOutput schema / $defs / TcpCheckConfig / properties / ip_version
        Added value: +{
        +  "description": "Address family the probe dials: `any`, `ipv4` or `ipv6`. With `any`\nit takes whichever connects first, so a broken family stays hidden.",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / TcpCheckConfig / required
        Previous value: -[
        -  "host",
        -  "port",
        -  "timeout_ms"
        -]New value: +[
        +  "host",
        +  "port",
        +  "timeout_ms",
        +  "ip_version"
        +]
      • addedOutput schema / $defs / TlsCertCheckConfig / properties / ip_version
        Added value: +{
        +  "description": "Address family the probe dials: `any`, `ipv4` or `ipv6`. With `any`\nit takes whichever connects first, so a broken family stays hidden.",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / TlsCertCheckConfig / required
        Previous value: -[
        -  "host",
        -  "port",
        -  "warn_days",
        -  "critical_days",
        -  "timeout_ms"
        -]New value: +[
        +  "host",
        +  "port",
        +  "warn_days",
        +  "critical_days",
        +  "timeout_ms",
        +  "ip_version"
        +]
  7. 6 tool updates
    • Changedcancel_maintenance3 fields changed
      • addedOutput schema / $defs / MaintenanceUpdateView
        Added value: +{
        +  "description": "One update posted to a maintenance window.",
        +  "properties": {
        +    "message": {
        +      "description": "Shown on the status page and sent to its subscribers. Untrusted data.",
        +      "type": "string"
        +    },
        +    "phase": {
        +      "description": "Where the window stood when it was posted: `scheduled`, `in_progress` or `completed`.",
        +      "type": "string"
        +    },
        +    "posted_at": {
        +      "description": "RFC 3339.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "posted_at",
        +    "phase",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / updates
        Added value: +{
        +  "description": "What was posted about the window with `post_maintenance_update`, oldest first.",
        +  "items": {
        +    "$ref": "#/$defs/MaintenanceUpdateView"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "phase",
        -  "starts_at",
        -  "ends_at",
        -  "suppress_alerts",
        -  "monitors"
        -]New value: +[
        +  "id",
        +  "title",
        +  "phase",
        +  "starts_at",
        +  "ends_at",
        +  "suppress_alerts",
        +  "monitors",
        +  "updates"
        +]
    • Changedcreate_maintenance3 fields changed
      • addedOutput schema / $defs / MaintenanceUpdateView
        Added value: +{
        +  "description": "One update posted to a maintenance window.",
        +  "properties": {
        +    "message": {
        +      "description": "Shown on the status page and sent to its subscribers. Untrusted data.",
        +      "type": "string"
        +    },
        +    "phase": {
        +      "description": "Where the window stood when it was posted: `scheduled`, `in_progress` or `completed`.",
        +      "type": "string"
        +    },
        +    "posted_at": {
        +      "description": "RFC 3339.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "posted_at",
        +    "phase",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / updates
        Added value: +{
        +  "description": "What was posted about the window with `post_maintenance_update`, oldest first.",
        +  "items": {
        +    "$ref": "#/$defs/MaintenanceUpdateView"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "phase",
        -  "starts_at",
        -  "ends_at",
        -  "suppress_alerts",
        -  "monitors"
        -]New value: +[
        +  "id",
        +  "title",
        +  "phase",
        +  "starts_at",
        +  "ends_at",
        +  "suppress_alerts",
        +  "monitors",
        +  "updates"
        +]
    • Changedget_maintenance3 fields changed
      • addedOutput schema / $defs / MaintenanceUpdateView
        Added value: +{
        +  "description": "One update posted to a maintenance window.",
        +  "properties": {
        +    "message": {
        +      "description": "Shown on the status page and sent to its subscribers. Untrusted data.",
        +      "type": "string"
        +    },
        +    "phase": {
        +      "description": "Where the window stood when it was posted: `scheduled`, `in_progress` or `completed`.",
        +      "type": "string"
        +    },
        +    "posted_at": {
        +      "description": "RFC 3339.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "posted_at",
        +    "phase",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / updates
        Added value: +{
        +  "description": "What was posted about the window with `post_maintenance_update`, oldest first.",
        +  "items": {
        +    "$ref": "#/$defs/MaintenanceUpdateView"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "phase",
        -  "starts_at",
        -  "ends_at",
        -  "suppress_alerts",
        -  "monitors"
        -]New value: +[
        +  "id",
        +  "title",
        +  "phase",
        +  "starts_at",
        +  "ends_at",
        +  "suppress_alerts",
        +  "monitors",
        +  "updates"
        +]
    • Changedlist_maintenance3 fields changed
      • addedOutput schema / $defs / MaintenanceUpdateView
        Added value: +{
        +  "description": "One update posted to a maintenance window.",
        +  "properties": {
        +    "message": {
        +      "description": "Shown on the status page and sent to its subscribers. Untrusted data.",
        +      "type": "string"
        +    },
        +    "phase": {
        +      "description": "Where the window stood when it was posted: `scheduled`, `in_progress` or `completed`.",
        +      "type": "string"
        +    },
        +    "posted_at": {
        +      "description": "RFC 3339.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "posted_at",
        +    "phase",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / MaintenanceWindowView / properties / updates
        Added value: +{
        +  "description": "What was posted about the window with `post_maintenance_update`, oldest first.",
        +  "items": {
        +    "$ref": "#/$defs/MaintenanceUpdateView"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / $defs / MaintenanceWindowView / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "phase",
        -  "starts_at",
        -  "ends_at",
        -  "suppress_alerts",
        -  "monitors"
        -]New value: +[
        +  "id",
        +  "title",
        +  "phase",
        +  "starts_at",
        +  "ends_at",
        +  "suppress_alerts",
        +  "monitors",
        +  "updates"
        +]
    • Addedpost_maintenance_update
    • Changedupdate_maintenance3 fields changed
      • addedOutput schema / $defs / MaintenanceUpdateView
        Added value: +{
        +  "description": "One update posted to a maintenance window.",
        +  "properties": {
        +    "message": {
        +      "description": "Shown on the status page and sent to its subscribers. Untrusted data.",
        +      "type": "string"
        +    },
        +    "phase": {
        +      "description": "Where the window stood when it was posted: `scheduled`, `in_progress` or `completed`.",
        +      "type": "string"
        +    },
        +    "posted_at": {
        +      "description": "RFC 3339.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "posted_at",
        +    "phase",
        +    "message"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / MaintenanceWindowView / properties / updates
        Added value: +{
        +  "description": "What was posted about the window with `post_maintenance_update`, oldest first.",
        +  "items": {
        +    "$ref": "#/$defs/MaintenanceUpdateView"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / $defs / MaintenanceWindowView / required
        Previous value: -[
        -  "id",
        -  "title",
        -  "phase",
        -  "starts_at",
        -  "ends_at",
        -  "suppress_alerts",
        -  "monitors"
        -]New value: +[
        +  "id",
        +  "title",
        +  "phase",
        +  "starts_at",
        +  "ends_at",
        +  "suppress_alerts",
        +  "monitors",
        +  "updates"
        +]
  8. 4 tool updates
    • Changedcreate_status_page5 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "PageAccessArg": {
        +    "additionalProperties": false,
        +    "description": "Who may open a status page; the same shape as the REST `access` field. As a\nwrite it replaces what is stored, whole.",
        +    "properties": {
        +      "email": {
        +        "$ref": "#/$defs/PageEmailAccessArg",
        +        "default": {
        +          "enabled": true,
        +          "passkeys_enabled": true,
        +          "recheck_days": null,
        +          "session_days": null
        +        }
        +      },
        +      "protected": {
        +        "description": "Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time.",
        +        "type": "boolean"
        +      },
        +      "rules": {
        +        "default": [],
        +        "description": "Who can open it, up to 500 entries. Read back, these are customer data.",
        +        "items": {
        +          "$ref": "#/$defs/PageAccessRuleArg"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "protected"
        +    ],
        +    "type": "object"
        +  },
        +  "PageAccessRuleArg": {
        +    "additionalProperties": false,
        +    "description": "One access list entry.",
        +    "properties": {
        +      "kind": {
        +        "description": "`domain` lets in every address at `value` (`example.com`); `address`\nlets in one person (`name@example.com`).",
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "PageEmailAccessArg": {
        +    "additionalProperties": false,
        +    "description": "The emailed-code way in, and the passkeys that shortcut it.",
        +    "properties": {
        +      "enabled": {
        +        "default": true,
        +        "description": "Defaults to true; a private page needs it.",
        +        "type": "boolean"
        +      },
        +      "passkeys_enabled": {
        +        "default": true,
        +        "description": "Let viewers save a passkey after an email sign-in. Defaults to true.",
        +        "type": "boolean"
        +      },
        +      "recheck_days": {
        +        "default": null,
        +        "description": "Ask passkey viewers for an email code again after 30, 90 or 365 days.\nOmit to never ask.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "session_days": {
        +        "default": null,
        +        "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / access
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PageAccessArg"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Make it private from the start. Omit for a public page."
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "PageAccessArg": {
        +    "additionalProperties": false,
        +    "description": "Who may open a status page; the same shape as the REST `access` field. As a\nwrite it replaces what is stored, whole.",
        +    "properties": {
        +      "email": {
        +        "$ref": "#/$defs/PageEmailAccessArg",
        +        "default": {
        +          "enabled": true,
        +          "passkeys_enabled": true,
        +          "recheck_days": null,
        +          "session_days": null
        +        }
        +      },
        +      "protected": {
        +        "description": "Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time.",
        +        "type": "boolean"
        +      },
        +      "rules": {
        +        "default": [],
        +        "description": "Who can open it, up to 500 entries. Read back, these are customer data.",
        +        "items": {
        +          "$ref": "#/$defs/PageAccessRuleArg"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "protected"
        +    ],
        +    "type": "object"
        +  },
        +  "PageAccessRuleArg": {
        +    "additionalProperties": false,
        +    "description": "One access list entry.",
        +    "properties": {
        +      "kind": {
        +        "description": "`domain` lets in every address at `value` (`example.com`); `address`\nlets in one person (`name@example.com`).",
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "PageEmailAccessArg": {
        +    "additionalProperties": false,
        +    "description": "The emailed-code way in, and the passkeys that shortcut it.",
        +    "properties": {
        +      "enabled": {
        +        "default": true,
        +        "description": "Defaults to true; a private page needs it.",
        +        "type": "boolean"
        +      },
        +      "passkeys_enabled": {
        +        "default": true,
        +        "description": "Let viewers save a passkey after an email sign-in. Defaults to true.",
        +        "type": "boolean"
        +      },
        +      "recheck_days": {
        +        "default": null,
        +        "description": "Ask passkey viewers for an email code again after 30, 90 or 365 days.\nOmit to never ask.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "session_days": {
        +        "default": null,
        +        "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / access
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PageAccessArg"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Who may open it, or null for a page never made private."
        +}
    • Changedget_status_page5 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedOutput schema / $defs / PageAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Who may open a status page; the same shape as the REST `access` field. As a\nwrite it replaces what is stored, whole.",
        +  "properties": {
        +    "email": {
        +      "$ref": "#/$defs/PageEmailAccessArg",
        +      "default": {
        +        "enabled": true,
        +        "passkeys_enabled": true,
        +        "recheck_days": null,
        +        "session_days": null
        +      }
        +    },
        +    "protected": {
        +      "description": "Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time.",
        +      "type": "boolean"
        +    },
        +    "rules": {
        +      "default": [],
        +      "description": "Who can open it, up to 500 entries. Read back, these are customer data.",
        +      "items": {
        +        "$ref": "#/$defs/PageAccessRuleArg"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "protected"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / PageAccessRuleArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "One access list entry.",
        +  "properties": {
        +    "kind": {
        +      "description": "`domain` lets in every address at `value` (`example.com`); `address`\nlets in one person (`name@example.com`).",
        +      "type": "string"
        +    },
        +    "value": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "kind",
        +    "value"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / PageEmailAccessArg
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The emailed-code way in, and the passkeys that shortcut it.",
        +  "properties": {
        +    "enabled": {
        +      "default": true,
        +      "description": "Defaults to true; a private page needs it.",
        +      "type": "boolean"
        +    },
        +    "passkeys_enabled": {
        +      "default": true,
        +      "description": "Let viewers save a passkey after an email sign-in. Defaults to true.",
        +      "type": "boolean"
        +    },
        +    "recheck_days": {
        +      "default": null,
        +      "description": "Ask passkey viewers for an email code again after 30, 90 or 365 days.\nOmit to never ask.",
        +      "format": "int32",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    },
        +    "session_days": {
        +      "default": null,
        +      "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        +      "format": "int32",
        +      "type": [
        +        "integer",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / access
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PageAccessArg"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Who may open it, or null for a page never made private."
        +}
    • Addedlist_status_page_viewers
    • Changedupdate_status_page5 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "PageAccessArg": {
        +    "additionalProperties": false,
        +    "description": "Who may open a status page; the same shape as the REST `access` field. As a\nwrite it replaces what is stored, whole.",
        +    "properties": {
        +      "email": {
        +        "$ref": "#/$defs/PageEmailAccessArg",
        +        "default": {
        +          "enabled": true,
        +          "passkeys_enabled": true,
        +          "recheck_days": null,
        +          "session_days": null
        +        }
        +      },
        +      "protected": {
        +        "description": "Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time.",
        +        "type": "boolean"
        +      },
        +      "rules": {
        +        "default": [],
        +        "description": "Who can open it, up to 500 entries. Read back, these are customer data.",
        +        "items": {
        +          "$ref": "#/$defs/PageAccessRuleArg"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "protected"
        +    ],
        +    "type": "object"
        +  },
        +  "PageAccessRuleArg": {
        +    "additionalProperties": false,
        +    "description": "One access list entry.",
        +    "properties": {
        +      "kind": {
        +        "description": "`domain` lets in every address at `value` (`example.com`); `address`\nlets in one person (`name@example.com`).",
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "PageEmailAccessArg": {
        +    "additionalProperties": false,
        +    "description": "The emailed-code way in, and the passkeys that shortcut it.",
        +    "properties": {
        +      "enabled": {
        +        "default": true,
        +        "description": "Defaults to true; a private page needs it.",
        +        "type": "boolean"
        +      },
        +      "passkeys_enabled": {
        +        "default": true,
        +        "description": "Let viewers save a passkey after an email sign-in. Defaults to true.",
        +        "type": "boolean"
        +      },
        +      "recheck_days": {
        +        "default": null,
        +        "description": "Ask passkey viewers for an email code again after 30, 90 or 365 days.\nOmit to never ask.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "session_days": {
        +        "default": null,
        +        "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / access
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PageAccessArg"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Replace who may open it: make it private, change its list, or make it\npublic again."
        +}
      • addedOutput schema / $defs
        Added value: +{
        +  "PageAccessArg": {
        +    "additionalProperties": false,
        +    "description": "Who may open a status page; the same shape as the REST `access` field. As a\nwrite it replaces what is stored, whole.",
        +    "properties": {
        +      "email": {
        +        "$ref": "#/$defs/PageEmailAccessArg",
        +        "default": {
        +          "enabled": true,
        +          "passkeys_enabled": true,
        +          "recheck_days": null,
        +          "session_days": null
        +        }
        +      },
        +      "protected": {
        +        "description": "Private when true: only the addresses and domains in `rules` can open\nthe page, by signing in on it with a code sent to their email. False\nmakes it public again and keeps the list for next time.",
        +        "type": "boolean"
        +      },
        +      "rules": {
        +        "default": [],
        +        "description": "Who can open it, up to 500 entries. Read back, these are customer data.",
        +        "items": {
        +          "$ref": "#/$defs/PageAccessRuleArg"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "protected"
        +    ],
        +    "type": "object"
        +  },
        +  "PageAccessRuleArg": {
        +    "additionalProperties": false,
        +    "description": "One access list entry.",
        +    "properties": {
        +      "kind": {
        +        "description": "`domain` lets in every address at `value` (`example.com`); `address`\nlets in one person (`name@example.com`).",
        +        "type": "string"
        +      },
        +      "value": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "value"
        +    ],
        +    "type": "object"
        +  },
        +  "PageEmailAccessArg": {
        +    "additionalProperties": false,
        +    "description": "The emailed-code way in, and the passkeys that shortcut it.",
        +    "properties": {
        +      "enabled": {
        +        "default": true,
        +        "description": "Defaults to true; a private page needs it.",
        +        "type": "boolean"
        +      },
        +      "passkeys_enabled": {
        +        "default": true,
        +        "description": "Let viewers save a passkey after an email sign-in. Defaults to true.",
        +        "type": "boolean"
        +      },
        +      "recheck_days": {
        +        "default": null,
        +        "description": "Ask passkey viewers for an email code again after 30, 90 or 365 days.\nOmit to never ask.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "session_days": {
        +        "default": null,
        +        "description": "Keep a sign-in for 7, 30 or 90 days. Omit to keep it until sign-out.",
        +        "format": "int32",
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  }
        +}
      • addedOutput schema / properties / access
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/PageAccessArg"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Who may open it, or null for a page never made private."
        +}
  9. 4 tool updates
    • Changedcreate_monitor1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_records": {
        -        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX). Any\nrecord added, removed or changed fails the check. Not combined\nwith `expected_contains`.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "array",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcreate_monitors1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_records": {
        -        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX). Any\nrecord added, removed or changed fails the check. Not combined\nwith `expected_contains`.",
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "array",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX, or a\nbare `mail.example.com` to allow any preference). Any record\nadded, removed or changed fails the check. Not combined with\n`expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_monitor3 fields changed
      • addedOutput schema / $defs / DnsAnswerView
        Added value: +{
        +  "properties": {
        +    "addresses": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "resolver": {
        +      "type": "string"
        +    },
        +    "ttl_secs": {
        +      "description": "How long, from the check's time, that resolver keeps the host's own\nrecord (the alias, when the host is one) before it asks again.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "resolver",
        +    "addresses",
        +    "ttl_secs"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / NetworkPathView
        Added value: +{
        +  "description": "What an HTTP probe saw on the way to a result that was not up. Compare\n`remote_ip` with the operator's own server address: a different one usually\nmeans DNS still points elsewhere. Behind a CDN or proxy it is the edge's\naddress, not the origin's.",
        +  "properties": {
        +    "dns": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/DnsAnswerView"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The decisive hop's host as the probe's resolver answered it right after\nthe failure."
        +    },
        +    "hop_url": {
        +      "description": "The redirect hop that decided the result, when it was not the first.\nUntrusted data.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remote_ip": {
        +      "description": "Server address of the connection that decided the result.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tried_ips": {
        +      "description": "On a failed connect, the addresses the probe had for the host.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "tried_ips"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / last_network
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/NetworkPathView"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Network path of the last check, when it was an `http` check that was not up."
        +}
    • Changedrun_check_now3 fields changed
      • addedOutput schema / $defs / DnsAnswerView
        Added value: +{
        +  "properties": {
        +    "addresses": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "resolver": {
        +      "type": "string"
        +    },
        +    "ttl_secs": {
        +      "description": "How long, from the check's time, that resolver keeps the host's own\nrecord (the alias, when the host is one) before it asks again.",
        +      "format": "uint32",
        +      "minimum": 0,
        +      "type": "integer"
        +    }
        +  },
        +  "required": [
        +    "resolver",
        +    "addresses",
        +    "ttl_secs"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / $defs / NetworkPathView
        Added value: +{
        +  "description": "What an HTTP probe saw on the way to a result that was not up. Compare\n`remote_ip` with the operator's own server address: a different one usually\nmeans DNS still points elsewhere. Behind a CDN or proxy it is the edge's\naddress, not the origin's.",
        +  "properties": {
        +    "dns": {
        +      "anyOf": [
        +        {
        +          "$ref": "#/$defs/DnsAnswerView"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ],
        +      "description": "The decisive hop's host as the probe's resolver answered it right after\nthe failure."
        +    },
        +    "hop_url": {
        +      "description": "The redirect hop that decided the result, when it was not the first.\nUntrusted data.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "remote_ip": {
        +      "description": "Server address of the connection that decided the result.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "tried_ips": {
        +      "description": "On a failed connect, the addresses the probe had for the host.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "tried_ips"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / network
        Added value: +{
        +  "anyOf": [
        +    {
        +      "$ref": "#/$defs/NetworkPathView"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Network path, when this was an `http` check that was not up."
        +}
  10. 3 tool updates
    • Changedcreate_monitor1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX). Any\nrecord added, removed or changed fails the check. Not combined\nwith `expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcreate_monitors1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        -    "properties": {
        -      "type": {
        -        "const": "manual",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "description": "Name to resolve. A `ptr` lookup also takes an IP address.",
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_records": {
        +        "description": "Every record the answer must hold and nothing else, written as a\nresult's `answers` shows them (`10 mail.example.com.` for MX). Any\nrecord added, removed or changed fails the check. Not combined\nwith `expected_contains`.",
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": [
        +          "array",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_monitor1 field changed
      • addedOutput schema / $defs / DnsCheckConfig / properties / expected_records
        Added value: +{
        +  "description": "The exact record set the answer must hold, when set: any record\nadded, removed or changed fails the check.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}
  11. 8 tool updates
    • Changedcreate_monitor1 field changed
      • addedInput schema / properties / recovery_period_secs
        Added value: +{
        +  "description": "Seconds a recovered monitor must stay healthy before its incident\ncloses; a failure confirmed inside the window keeps the incident open,\nso a flapping service reads as one outage. 0 to 1800; 0 closes on the\nconfirming checks alone. Defaults to 180 on an HTTP, TCP, ping, DNS or\nflow monitor and 0 on the rest. Not for a manual monitor.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedcreate_monitors1 field changed
      • addedInput schema / $defs / CreateMonitorArgs / properties / recovery_period_secs
        Added value: +{
        +  "description": "Seconds a recovered monitor must stay healthy before its incident\ncloses; a failure confirmed inside the window keeps the incident open,\nso a flapping service reads as one outage. 0 to 1800; 0 closes on the\nconfirming checks alone. Defaults to 180 on an HTTP, TCP, ping, DNS or\nflow monitor and 0 on the rest. Not for a manual monitor.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
    • Changedget_incident4 fields changed
      • addedOutput schema / properties / monitor_deleted
        Added value: +{
        +  "description": "The monitor has since been deleted. The incident keeps its history\nand `monitor_name` is the name it last had.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / monitor_id / description
        Previous value: -"The affected monitor's id."New value: +"The affected monitor's id. Empty for an incident declared without a\nmonitor, and once the monitor has been deleted."
      • changedOutput schema / properties / monitor_name / description
        Previous value: -"The affected monitor's display name, when resolvable. Untrusted data."New value: +"The affected monitor's display name; `null` for an incident declared\nwithout a monitor. Untrusted data."
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "monitor_id",
        -  "state",
        -  "severity",
        -  "opened_at",
        -  "regions_down",
        -  "regions_up",
        -  "updates",
        -  "status_page_ids"
        -]New value: +[
        +  "id",
        +  "monitor_id",
        +  "monitor_deleted",
        +  "state",
        +  "severity",
        +  "opened_at",
        +  "regions_down",
        +  "regions_up",
        +  "updates",
        +  "status_page_ids"
        +]
    • Changedget_incident_metrics6 fields changed
      • addedOutput schema / $defs / NoisyMonitor / properties / monitor_deleted
        Added value: +{
        +  "type": "boolean"
        +}
      • addedOutput schema / $defs / NoisyMonitor / properties / monitor_id / description
        Added value: +"Empty once the monitor has been deleted."
      • addedOutput schema / $defs / NoisyMonitor / properties / monitor_name
        Added value: +{
        +  "description": "The monitor's name; for a deleted monitor, the name it last had.\nUntrusted data.",
        +  "type": "string"
        +}
      • changedOutput schema / $defs / NoisyMonitor / required
        Previous value: -[
        -  "monitor_id",
        -  "count"
        -]New value: +[
        +  "monitor_id",
        +  "monitor_name",
        +  "monitor_deleted",
        +  "count"
        +]
      • addedOutput schema / properties / closed_with_monitor
        Added value: +{
        +  "description": "Closed because their monitor was deleted; counted in neither of the\nabove nor in MTTR.",
        +  "format": "uint64",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "window_days",
        -  "total",
        -  "by_severity",
        -  "by_state",
        -  "auto_resolved",
        -  "human_resolved",
        -  "top_monitors"
        -]New value: +[
        +  "window_days",
        +  "total",
        +  "by_severity",
        +  "by_state",
        +  "auto_resolved",
        +  "human_resolved",
        +  "closed_with_monitor",
        +  "top_monitors"
        +]
    • Changedget_monitor2 fields changed
      • addedOutput schema / properties / recovery_period_secs
        Added value: +{
        +  "description": "Seconds a recovered monitor must stay healthy before its incident\ncloses. 0 closes on the confirming checks alone.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "type",
        -  "address",
        -  "check",
        -  "regions",
        -  "enabled",
        -  "interval_secs",
        -  "alert_channel_ids",
        -  "alert_confirmations",
        -  "notify_recovery",
        -  "renotify_interval_secs",
        -  "managed_externally",
        -  "tags",
        -  "state",
        -  "last_timing"
        -]New value: +[
        +  "id",
        +  "name",
        +  "type",
        +  "address",
        +  "check",
        +  "regions",
        +  "enabled",
        +  "interval_secs",
        +  "alert_channel_ids",
        +  "alert_confirmations",
        +  "notify_recovery",
        +  "renotify_interval_secs",
        +  "recovery_period_secs",
        +  "managed_externally",
        +  "tags",
        +  "state",
        +  "last_timing"
        +]
    • Changedget_monitor_history6 fields changed
      • changedOutput schema / $defs / IncidentWindow / properties / counts_as_downtime / description
        Previous value: -"`false` when this window is listed but explains none of the `uptime` gap."New value: +"`false` when this window is listed but kept out of `uptime`."
      • addedOutput schema / $defs / IncidentWindow / properties / impact
        Added value: +{
        +  "description": "`major_outage`, `partial_outage` or `degraded`. A counted window\nexplains the `uptime` gap by it: a major outage in full, a partial\noutage for 30% of its length, a degraded one not at all.",
        +  "type": "string"
        +}
      • addedOutput schema / $defs / IncidentWindow / properties / recovered
        Added value: +{
        +  "description": "Stretches inside the window the monitor was back up in before the\nfailure returned. `uptime` does not count them.",
        +  "items": {
        +    "$ref": "#/$defs/RecoveredStretch"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / $defs / IncidentWindow / properties / recovering_since
        Added value: +{
        +  "description": "RFC 3339 moment the monitor came back up while the incident waits out\nits recovery period. `uptime` stops counting the window here.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • changedOutput schema / $defs / IncidentWindow / required
        Previous value: -[
        -  "opened_at",
        -  "counts_as_downtime"
        -]New value: +[
        +  "opened_at",
        +  "counts_as_downtime",
        +  "impact",
        +  "recovered"
        +]
      • addedOutput schema / $defs / RecoveredStretch
        Added value: +{
        +  "description": "A stretch an incident was back up in.",
        +  "properties": {
        +    "from": {
        +      "description": "RFC 3339 start.",
        +      "type": "string"
        +    },
        +    "until": {
        +      "description": "RFC 3339 end, when the failure came back.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "from",
        +    "until"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_incidents3 fields changed
      • addedOutput schema / $defs / IncidentSummary / properties / monitor_deleted
        Added value: +{
        +  "description": "The monitor has since been deleted. The incident keeps its history\nand `monitor_name` is the name it last had.",
        +  "type": "boolean"
        +}
      • changedOutput schema / $defs / IncidentSummary / properties / monitor_id / description
        Previous value: -"The affected monitor's id."New value: +"The affected monitor's id. Empty once the monitor has been deleted."
      • changedOutput schema / $defs / IncidentSummary / required
        Previous value: -[
        -  "id",
        -  "monitor_id",
        -  "monitor_name",
        -  "severity",
        -  "opened_at"
        -]New value: +[
        +  "id",
        +  "monitor_id",
        +  "monitor_deleted",
        +  "monitor_name",
        +  "severity",
        +  "opened_at"
        +]
    • Changedupdate_monitor1 field changed
      • addedInput schema / properties / recovery_period_secs
        Added value: +{
        +  "description": "Seconds a recovered monitor must stay healthy before its incident\ncloses, 0 to 1800. Raising it folds a flapping monitor's short outages\ninto one incident, at the cost of announcing recovery later.",
        +  "format": "uint32",
        +  "minimum": 0,
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
  12. 5 tool updates
    • Changedcreate_monitor1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcreate_monitors1 field changed
      • changedInput schema / $defs / NewCheck / oneOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "description": "An HTTP(S) endpoint.",
        -    "properties": {
        -      "body": {
        -        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_body_contains": {
        -        "description": "Text the response body must contain for the check to pass.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "expected_status": {
        -        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "follow_redirects": {
        -        "description": "Defaults to true, following at most 5 hops.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      },
        -      "headers": {
        -        "additionalProperties": {
        -          "type": "string"
        -        },
        -        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        -        "type": [
        -          "object",
        -          "null"
        -        ]
        -      },
        -      "method": {
        -        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      },
        -      "url": {
        -        "type": "string"
        -      },
        -      "verify_tls": {
        -        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        -        "type": [
        -          "boolean",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "url"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TCP port accepting connections.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host",
        -      "port"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "ICMP reachability.",
        -    "properties": {
        -      "host": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A DNS record resolving, optionally to an expected value.",
        -    "properties": {
        -      "domain": {
        -        "type": "string"
        -      },
        -      "expected_contains": {
        -        "description": "Text the answer must contain.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "record_type": {
        -        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "resolver": {
        -        "description": "Resolver to ask. Defaults to the agent's own.",
        -        "type": [
        -          "string",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A TLS certificate's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Days of remaining validity that fail it. Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "host": {
        -        "type": "string"
        -      },
        -      "port": {
        -        "description": "Defaults to 443.",
        -        "format": "uint16",
        -        "maximum": 65535,
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Days of remaining validity that degrade the check. Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "host"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "A domain registration's remaining validity.",
        -    "properties": {
        -      "critical_days": {
        -        "description": "Default 7.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "domain": {
        -        "type": "string"
        -      },
        -      "timeout_ms": {
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      },
        -      "warn_days": {
        -        "description": "Default 30.",
        -        "format": "uint32",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "domain"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        -    "properties": {
        -      "grace_secs": {
        -        "description": "Lateness tolerated before the monitor fails.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "max_runtime_secs": {
        -        "description": "Fail a run that starts and does not finish within this.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": [
        -          "integer",
        -          "null"
        -        ]
        -      },
        -      "period_secs": {
        -        "description": "How often the job is expected to report.",
        -        "format": "uint64",
        -        "minimum": 0,
        -        "type": "integer"
        -      },
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type",
        -      "period_secs",
        -      "grace_secs"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "description": "An HTTP(S) endpoint.",
        +    "properties": {
        +      "body": {
        +        "description": "Request body, sent as given. `{{ key }}` references are resolved at\nprobe time, so a body may carry a secret by reference.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_body_contains": {
        +        "description": "Text the response body must contain for the check to pass.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expected_status": {
        +        "description": "A single code like `200`, a range like `200-299`, or a list like\n`200,201,204`. Defaults to `200-299`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "follow_redirects": {
        +        "description": "Defaults to true, following at most 5 hops.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      },
        +      "headers": {
        +        "additionalProperties": {
        +          "type": "string"
        +        },
        +        "description": "Request headers. A header that carries a credential\n(`authorization`, `x-api-key`, `api-key`, `cookie`,\n`proxy-authorization`) must reference an org variable rather than\nspell the secret out: `Bearer {{ my_key }}`. Use `list_variables`\nto find the key, and never paste the credential itself — this tool\nrefuses it, and a pasted one would live on in the chat log.",
        +        "type": [
        +          "object",
        +          "null"
        +        ]
        +      },
        +      "method": {
        +        "description": "`get` (default), `head`, `post`, `put`, `patch`, `delete`, `options`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "description": "Defaults to 10000. A redirect counts as a pass only with\n`follow_redirects`.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      },
        +      "url": {
        +        "type": "string"
        +      },
        +      "verify_tls": {
        +        "description": "Defaults to true. False accepts an invalid certificate, which a\n`tls_cert` monitor is the better way to watch.",
        +        "type": [
        +          "boolean",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "url"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TCP port accepting connections.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host",
        +      "port"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "ICMP reachability.",
        +    "properties": {
        +      "host": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A DNS record resolving, optionally to an expected value.",
        +    "properties": {
        +      "domain": {
        +        "type": "string"
        +      },
        +      "expected_contains": {
        +        "description": "Text the answer must contain.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "record_type": {
        +        "description": "`a` (default), `aaaa`, `cname`, `mx`, `ns`, `txt`, `soa`, `ptr`,\n`caa`, `srv`.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "resolver": {
        +        "description": "Resolver to ask. Defaults to the agent's own.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A TLS certificate's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Days of remaining validity that fail it. Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "host": {
        +        "type": "string"
        +      },
        +      "port": {
        +        "description": "Defaults to 443.",
        +        "format": "uint16",
        +        "maximum": 65535,
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Days of remaining validity that degrade the check. Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "host"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A domain registration's remaining validity.",
        +    "properties": {
        +      "critical_days": {
        +        "description": "Default 7.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "domain": {
        +        "type": "string"
        +      },
        +      "timeout_ms": {
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      },
        +      "warn_days": {
        +        "description": "Default 30.",
        +        "format": "uint32",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "domain"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "An inbound ping from a job that is expected to report in. Nothing is\nprobed; the monitor fails when the ping does not arrive. The ping URL\nand its token are shown in the app, never here.",
        +    "properties": {
        +      "grace_secs": {
        +        "description": "Lateness tolerated before the monitor fails.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "max_runtime_secs": {
        +        "description": "Fail a run that starts and does not finish within this.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": [
        +          "integer",
        +          "null"
        +        ]
        +      },
        +      "period_secs": {
        +        "description": "How often the job is expected to report.",
        +        "format": "uint64",
        +        "minimum": 0,
        +        "type": "integer"
        +      },
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type",
        +      "period_secs",
        +      "grace_secs"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "description": "A service no probe can judge, such as a SIP trunk or a partner's back\noffice. Nothing is checked: it starts up, and `set_monitor_state` moves\nit, opening and closing incidents like any other monitor.",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedget_monitor3 fields changed
      • changedOutput schema / $defs / CheckConfig / oneOf
        Previous value: -[
        -  {
        -    "$ref": "#/$defs/HttpCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "http",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/TcpCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "tcp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/PingCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "ping",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/HeartbeatCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "heartbeat",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/DnsCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "dns",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/TlsCertCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "tls_cert",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/DomainExpiryCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "domain_expiry",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "$ref": "#/$defs/FlowCheckConfig",
        -    "properties": {
        -      "type": {
        -        "const": "flow",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "type"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "$ref": "#/$defs/HttpCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "http",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/TcpCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "tcp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/PingCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "ping",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/HeartbeatCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "heartbeat",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/ManualCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "manual",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/DnsCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "dns",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/TlsCertCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "tls_cert",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/DomainExpiryCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "domain_expiry",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "$ref": "#/$defs/FlowCheckConfig",
        +    "properties": {
        +      "type": {
        +        "const": "flow",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  }
        +]
      • addedOutput schema / $defs / ManualCheckConfig
        Added value: +{
        +  "description": "Nothing is probed: the state is whatever an operator last set with\n`set_monitor_state`, and the monitor's `state` reports it.",
        +  "type": "object"
        +}
      • changedOutput schema / properties / type / description
        Previous value: -"Check kind: `http`, `tcp`, `ping`, `heartbeat`, `dns`, `tls_cert`,\n`domain_expiry`, `flow`."New value: +"Check kind: `http`, `tcp`, `ping`, `heartbeat`, `manual`, `dns`,\n`tls_cert`, `domain_expiry`, `flow`."
    • Changedlist_monitors2 fields changed
      • changedInput schema / properties / type / description
        Previous value: -"Filter by check kind: `http`, `tcp`, `ping`, `heartbeat`, `dns`,\n`tls_cert`, `domain_expiry`, `flow`."New value: +"Filter by check kind: `http`, `tcp`, `ping`, `heartbeat`, `manual`,\n`dns`, `tls_cert`, `domain_expiry`, `flow`."
      • changedOutput schema / $defs / MonitorListItem / properties / type / description
        Previous value: -"Check kind: `http`, `tcp`, `ping`, `heartbeat`, `dns`, `tls_cert`,\n`domain_expiry`, `flow`."New value: +"Check kind: `http`, `tcp`, `ping`, `heartbeat`, `manual`, `dns`,\n`tls_cert`, `domain_expiry`, `flow`."
    • Addedset_monitor_state
  13. 5 tool updates
    • Addedcancel_maintenance
    • Addedcreate_maintenance
    • Addedget_maintenance
    • Addedlist_maintenance
    • Addedupdate_maintenance
  14. 1 tool update
    • Changedget_org_usage1 field changed
      • addedOutput schema / properties / maintenance_windows / description
        Added value: +"Counts windows that have not ended (upcoming and active). Completed windows do not count."
  15. 1 tool update
    • Changedlist_notification_channels2 fields changed
      • addedOutput schema / $defs / ChannelItem / properties / resolve_button
        Added value: +{
        +  "description": "Alerts for an open incident carry a Resolve button. Off by default,\nand false for a kind that cannot carry one.",
        +  "type": "boolean"
        +}
      • changedOutput schema / $defs / ChannelItem / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "kind",
        -  "enabled",
        -  "awaiting_verification",
        -  "not_delivering",
        -  "auto_bind_tags",
        -  "acknowledge_button"
        -]New value: +[
        +  "id",
        +  "name",
        +  "kind",
        +  "enabled",
        +  "awaiting_verification",
        +  "not_delivering",
        +  "auto_bind_tags",
        +  "acknowledge_button",
        +  "resolve_button"
        +]
  16. 1 tool update
    • Changedlist_notification_channels2 fields changed
      • addedOutput schema / $defs / ChannelItem / properties / acknowledge_button
        Added value: +{
        +  "description": "Alerts for an open incident carry an Acknowledge button. False for a\nkind that cannot carry one.",
        +  "type": "boolean"
        +}
      • changedOutput schema / $defs / ChannelItem / required
        Previous value: -[
        -  "id",
        -  "name",
        -  "kind",
        -  "enabled",
        -  "awaiting_verification",
        -  "not_delivering",
        -  "auto_bind_tags"
        -]New value: +[
        +  "id",
        +  "name",
        +  "kind",
        +  "enabled",
        +  "awaiting_verification",
        +  "not_delivering",
        +  "auto_bind_tags",
        +  "acknowledge_button"
        +]
  17. 2 tool updates
    • Changedget_incident2 fields changed
      • addedOutput schema / properties / status_page_ids
        Added value: +{
        +  "description": "Pages an incident with no monitor is posted to. `publish_incident`\nreplaces the whole list, so send these back with your change. Empty for\na monitor's incident.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "id",
        -  "monitor_id",
        -  "state",
        -  "severity",
        -  "opened_at",
        -  "regions_down",
        -  "regions_up",
        -  "updates"
        -]New value: +[
        +  "id",
        +  "monitor_id",
        +  "state",
        +  "severity",
        +  "opened_at",
        +  "regions_down",
        +  "regions_up",
        +  "updates",
        +  "status_page_ids"
        +]
    • Changedpublish_incident1 field changed
      • addedInput schema / properties / status_page_ids
        Added value: +{
        +  "description": "Status page ids (from `list_status_pages`) for an incident with no\nmonitor; replaces its pages, so start from `get_incident`'s\n`status_page_ids` to add or drop one. Leave unset for a monitor's incident,\nwhich shows on the pages carrying that monitor.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "array",
        +    "null"
        +  ]
        +}

Publisher details

Operator
Artem Senenko (Uptimepage), Nicosia, Cyprus · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
Needs an Uptimepage account, and the free plan includes MCP. You connect with OAuth, and access is read-only unless you grant write scopes. · Publisher source

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Let agents read and manage your org’s independent monitors, incidents, status pages, and alerts (honest measured state, no false greens).
    -
  • A
    license
    A
    quality
    B
    maintenance
    Uptime 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.
    15
    76 npm
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables agents to inspect app status, uptime, response times, incidents, and certificate/domain expiry; set up and manage monitors and status pages; and draft incident updates through authenticated MCP tools.
    11
    852 npm
    27
    Functional Source , Version 1.1, MIT Future
  • A
    license
    A
    quality
    A
    maintenance
    Uptime monitoring your AI agent can set up: create HTTP, SSL, ping, TCP and DNS monitors checked from multiple regions, run checks on demand, read and acknowledge incidents, manage cron heartbeats, maintenance windows and status page updates.
    49
    824 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.