LastPing
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LASTPING_API_KEY | Yes | Your LastPing API key for authentication |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| add_incident_noteA | Requires an API key with the write scope or higher. Write back, in your own words, what you found out about an incident — so the person who gets paged reads a diagnosis instead of a timestamp: 'failed because the upstream API returned 503; same failure as the last three nights; I retried twice and stopped' instead of 'check failed at 03:04'. The note appears on the incident's page in the dashboard, attributed to its author, in the order it was written. Take incident_id from list_open_incidents. SEND A NOTE WHETHER OR NOT YOU COULD FIX THE PROBLEM. The person reading the alert cannot see what you saw. With no note, an incident is indistinguishable from one nobody has looked at yet, so an agent that writes back only its successes leaves a record worse than none: every unexplained incident then reads as 'not looked at yet' when it may equally mean 'looked at and gave up'. 'Could not reproduce; gave up after two attempts' IS a finding and is worth writing. NOTES ARE APPEND-ONLY. There is no way to edit a note and no way to delete one — not merely unexposed: no route and no query exists for either, and an edit is refused by the database itself. A correction is a new note, never an edit, because a diagnosis whose history a reader cannot trust is not evidence. This is NOT a write-once resource: a second, third or tenth note on the same incident is normal and expected, and there is no conflict for writing one. The only conflict this tool has is the cap of 50 notes per incident, and reaching it means something is looping rather than diagnosing. A CLOSED incident still accepts notes, on purpose: the run that finally succeeded is usually the one that understood why the previous one did not, so refusing the note would lose the explanation exactly when it became available. Authorship is not yours to choose — every note written through this tool is stored as author 'agent', because this is the API-key surface; there is no author argument and supplying one is not possible. |
| adopt_discovered_agentA | Requires an API key with the write scope or higher. Count a discovered trace source's traces under an agent from now on. Without agent_id, a new agent named after the source is created (the same limit and slug rules as register_agent; 409 AGENT_EXISTS when that slug is taken, so merge into it instead). With agent_id, the source is merged into that existing agent: use the suggested_agent_id list_discovered_agents gave. Traces already recorded stay where they are (backfilled is always false). Adopting again into the same agent changes nothing; a source already adopted into a different agent is a 409 ALREADY_ADOPTED. Results are wrapped: |
| create_api_keyA | Requires an API key with the admin scope or higher. Create a new LastPing API key. The plaintext key is returned ONCE and cannot be retrieved again — store it immediately in a secret manager. Set expires_at for a short-lived key. To give an exporter a tracing key for one monitor, use create_ingest_key instead: it needs only a write key. |
| create_destinationA | Requires an API key with the write scope or higher. Create a notification destination (channel) that monitors can route alerts to. Provide the fields for the chosen kind; unrelated fields are ignored. Non-email kinds are usable immediately; email kinds are created unverified and send a confirmation link that must be clicked before they can be attached to a route. A project holds at most 25 destinations — if creation is refused with DESTINATION_CAP_REACHED, delete one with delete_destination rather than retrying. Returns the new channel id — pass it to set_route. |
| create_ingest_keyA | Requires an API key with the write scope or higher. Create a tracing key for one monitor: an ingest-scoped LastPing key bound to that monitor. It can send traces, metrics, logs and pings for that one monitor and nothing else; it cannot read or change anything in the account, and every REST call refuses it. This is the credential get_trace_setup's steps need. The plaintext key is returned ONCE: write it straight into the git-ignored file or helper script the set-up names, never into committed code, and never echo it back to the person, in a reply, a commit message or a log. Never use your own LastPing API key as an exporter's credential instead. Omit expires_at for a 90-day key, capped at your own key's expiry. |
| create_monitorA | Requires an API key with the write scope or higher. Create a new LastPing monitor (or update an existing one if slug matches — returns 'updated' note on upsert). For heartbeat/ci monitors supply schedule_kind ('simple' requires period_s, 'cron' requires cron_expr, 'on_demand' requires neither). For http monitors supply probe_url and probe_interval_s instead — and set probe_expected_status/probe_expected_body too, because those are what define 'healthy'; a probe with neither only proves something answered. For a monitor fed by CI rather than by its own pings, set ci_provider here: it is the ONLY place it can be set, and the secret it returns is shown exactly once. |
| create_status_pageA | Requires an API key with the write scope or higher. Create a status page — a single page showing the current status and recent history of a chosen set of monitors. Reach for this when the health of a monitor needs to be visible to someone who cannot log in to the project. Pages are PRIVATE unless you ask for otherwise; read the visibility parameter before making one public. |
| declare_run_expectationsA | Requires an API key with the write scope or higher. Commit, at the START of a run, to the criteria by which THAT RUN will be judged when it closes — before you can see how it turns out. This is how a run stops grading itself: once declared, a success ping whose body does not satisfy every declared criterion is recorded as a FAILED run with cause 'assertion', regardless of the exit code or what the ping claims. Call this right after your run's /start ping, before doing any work — see the assertions argument for the full, immutable contract, and get_ping_instructions' expectations_how_to for a worked example. |
| delete_agentA | Requires an API key with the write scope or higher. Permanently delete a LastPing agent from the registry by UUID. THIS DOES NOT DELETE ITS MONITORS: the agent_id foreign key on a monitor is ON DELETE SET NULL, so every monitor this agent owned survives the delete with its ping history and incidents completely intact — it just becomes unowned (agent_id cleared to null) and keeps running on its existing schedule, no longer attributed to any agent. list_monitors/get_monitor will still show it afterwards. To reattach a survivor, call update_monitor with agent_id set to a different agent's id or slug. To also remove a monitor, call delete_monitor on it separately — deleting the agent alone never does that. This action on the agent row itself cannot be undone. |
| delete_destinationA | Requires an API key with the write scope or higher. Permanently delete a notification destination (channel). This cannot be undone. It also removes the destination from every monitor's routing — any event type routed ONLY to this destination stops notifying anyone, silently and with no incident to show for it. Before deleting a destination that is in use, check which monitors route to it (get_monitor returns a monitor's |
| delete_monitorA | Requires an API key with the write scope or higher. Permanently delete a LastPing monitor by UUID. This cannot be undone. |
| delete_routeA | Requires an API key with the write scope or higher. Stop routing ONE event type of a monitor to any destination: its alerts for that event go nowhere afterwards. Every other event type's routing on the monitor is left exactly as it was. To drop one destination but keep the rest for the same event type, call get_monitor and then set_route with the remaining ids instead. An event type with no routing answers "route not found". |
| delete_status_pageA | Requires an API key with the write scope or higher. Permanently delete a status page. This cannot be undone, and any public URL it had stops working immediately. The monitors on the page are NOT affected — they keep running and alerting exactly as before; only the shared view of them is removed. To stop sharing without losing the page, set visibility to 'private' with update_status_page instead. |
| discover_monitors_reconcileA | Requires an API key with the write scope or higher. Turn a scan of a repository or a host into monitors: send every scheduled job you found, get back a diff of what was created, what already existed and what has gone missing. This is how a user gets monitored without filling in a form. PROPOSE, THEN ASK. Show the user what you found and get their agreement BEFORE calling this — it CREATES monitors. Eleven monitors created on a repository you were asked to look at are eleven things that can page a person at 03:00 and that they never agreed to, and this endpoint has no delete path to undo them with. WHAT TO SEND: a JSON array as a string in |
| export_terraformA | Requires an API key with the read scope or higher. Export existing LastPing monitors, destinations, routes, alert templates and status pages as Terraform HCL, including import blocks so they are adopted rather than recreated. Secrets are NOT exported — the output references Terraform variables you must fill in. |
| get_agentA | Requires an API key with the read scope or higher. Get a single LastPing agent by UUID. Returns the same fields as list_agents, including its live status rollup, usage_24h and top_dependencies. Use list_agents to find valid IDs, or register_agent to create one. Results are wrapped: |
| get_agent_dependenciesA | Requires an API key with the read scope or higher. What one agent calls, heaviest first, from its OpenTelemetry traces: each model, tool, HTTP host, database, queue, RPC endpoint or other agent, with calls, errors, error_rate (0 to 1), p50_ms and p95_ms, a daily series, and for a model its tokens and estimated cost_usd. p95_ms is a bucket ceiling, not an exact value; p95_is_floor true means over 60 seconds. For an outgoing row, operations names up to five span names the agent used against it (sampled from its ten newest traced runs). direction=in lists who calls this agent instead, and direction=all both. At most 50 rows; |
| get_agent_usageA | Requires an API key with the read scope or higher. Model usage, one row per model per UTC day: tokens_in (which INCLUDES cache reads, so never add tokens_cache_read to it), tokens_out, tokens_cache_read, tokens_cache_write, cost_usd (decimal text) and cost_source: client when the tool reported its own cost, estimated when LastPing priced the tokens, empty when unknown. origin is traces or metrics; a day and model can have one of each, and the two are never summed. With id, one agent's usage; without id, the whole project's, traces only, plus by_agent (each agent's totals, costliest first). Results are wrapped: |
| get_alert_templatesA | Requires an API key with the read scope or higher. Get all custom alert message templates for a LastPing monitor. Returns a map of event-type (or event-type/cause) keys to template strings. Keys: 'down', 'recovery', 'fail', 'every-run', 'success', 'started', 'blocked', 'note', or 'event_type/cause' (e.g. 'down/silence'). An empty result means all alerts use the built-in plain-language defaults. |
| get_incidentA | Requires an API key with the read scope or higher. Get ONE incident with its recorded timeline: an ordered list of events — run_started, step, run_failed/run_cancelled/run_blocked, incident_opened, alert_delivered/alert_failed/alert_suppressed/alert_pending (which destination, how many attempts; down and fail alerts only — the recovery notification is not yet attributed to the incident), note (what an agent or a person wrote back), incident_resolved. Use it to answer 'what was the run doing when it broke, did anyone get paged, and what has already been tried' in one call. Nothing is inferred: run events are matched by the run id recorded when the incident opened, so a timeline with no run_* events means no run was recorded (run_id is an empty string) — that is a fact about the record, not an anomaly to report. The delivery error text is never included. Results are wrapped: |
| get_monitorA | Requires an API key with the read scope or higher. Get a single LastPing monitor by UUID. Returns the monitor's full configuration including its output assertions (the |
| get_ping_instructionsA | Requires an API key with the read scope or higher. Get everything needed to make a monitor actually report: the ping URL, copy-paste check-in snippets, and the three MECHANISMS for reporting, returned together. Call this right after create_monitor. CHOOSE BY WHAT THE MONITORED THING IS — read |
| get_runA | Requires an API key with the read scope or higher. Get ONE run's full timeline: every event it recorded (start, step, log, success/fail/cancel, incident_opened) in time order, its declared assertions with pass/fail/not_evaluated verdicts against the terminal ping body, the terminal output excerpt, CI provider metadata when this run carried it, and its OTLP spans (spans[], tree order: parents before children, siblings by start time) when the run was traced. Use it after get_run_history or list_open_incidents points at a specific run (id + rid) and you need the blow-by-blow rather than the summary row. outcome is one of succeeded, failed, cancelled, blocked, running or unfinished: unfinished is a run with no end ping, no incident and not blocked whose start is older than the monitor's max_runtime_s (24 hours when unset); it is not a failure and never pages. The timeline is capped at 200 events (events_truncated is true when this run had more, though the terminal event is always present regardless); spans[] is capped at 2,000 (spans_truncated is true past that), with spans_dropped naming any that never made it in from the write side. A span's gen_ai block (system, model, tokens_in, tokens_out, cost_usd) is present only when it was a GenAI call. Results are wrapped: |
| get_run_historyA | Requires an API key with the read scope or higher. Get structured run history for a monitor — both CI/CD runs and agent/heartbeat runs. It lists runs from pings only: a run that exists only as OpenTelemetry traces is not here, and it takes no filters; use list_runs for traced runs, for runs across every monitor, and to filter by outcome (including unfinished), agent, dependency, model, error or cost. Each run carries its run id (rid), kind, received_at, the progress steps reported under it (steps: seq, name, at), its title (the free-text body posted with its /start ping, when one was), and the correlated incident log excerpt (incident_detail) with resolution status. A run that stalled tells you which step it reached and when it stopped moving — no need to follow links to the CI provider. steps is absent for a run that reported none — steps are matched on rid, so they appear only when the job or agent posted /step?rid= with the same run id it started with. CI-specific fields — failing step (failing_stage), triggering actor, commit SHA, run URL, branch, duration_s, outcome — are present only on runs that carried ci_meta; they are simply absent on agent/heartbeat runs. A ping with neither ci_meta nor a rid is excluded entirely. duration_ms is a SEPARATE measurement, present on ANY run (CI or agent/heartbeat) whose success ping paired with its preceding start — this is how to answer 'how long does this job normally take?' for a non-CI monitor. It is computed by LastPing from the /start->success timing, not self-reported by a provider like duration_s is; the two must not be confused as confirming each other, and either can be present without the other. Results are wrapped: |
| get_trace_diagnosticsA | Requires an API key with the read scope or higher. Why traces, metrics or logs sent to one monitor did or did not arrive: the newest 20 ingest attempts (kept 7 days), last_accepted_at, and a summary of the monitor's newest traced run. Call it after sending the test span get_trace_setup describes, and whenever a person says their agent is sending and nothing shows up. Each attempt has outcome (accepted or refused), a reason code, span_count, bytes, protocol, user_agent and signal. Refusals: unsupported_media_type (set the protocol to http/protobuf; gRPC sent to the HTTP URL lands here), body_too_large (over 1 MB: smaller batches), too_many_spans or too_many_records (over 500 in one batch: export more often), unknown_monitor (no lastping.monitor_id, or one outside this project: set it, or use a tracing key bound to the monitor), expired_key (mistyped, revoked or expired: create_ingest_key), wrong_scope (that key cannot send telemetry: use a tracing key), wrong_project, monitor_mismatch (the batch named a different monitor from the key's), over_budget or over_log_budget (the daily budget; resets 00:00 UTC), rate_limited, busy (retry) and malformed. Answered 202 but kept nothing: future_start (check the sending machine's clock), unknown_event, unknown_metric, cumulative_temporality and invalid_point (routine, nothing to fix); too_many_series means new model series past the daily limit were dropped. Two failures leave NO row: an exporter using gRPC against the gRPC port, and a missing or wrong key; an empty list means check those two first. Results are wrapped: |
| get_trace_setupA | Requires an API key with the read scope or higher. Get the exact steps to make a tool send OpenTelemetry traces to LastPing for one monitor: what to write, where, how to verify it, and what that tool cannot do. Call this when a person asks you to set up tracing, observability or telemetry for a project. Carry the steps out yourself rather than printing them: write the files, check they are git ignored, send the test span, and report the console link. Never echo the credential back to the person and never put it in committed code. The result's |
| list_agentsA | Requires an API key with the read scope or higher. List all agents registered in the project. Returns id, slug, name, status, monitor_count and last_seen for each. status is rolled up live from the monitors the agent owns, worst first: down (a monitor is down), blocked (a monitor's run needs a human right now), late (a monitor is late), running (a monitor's run is in flight), up (healthy), pending (a monitor exists but has never reported) or idle (no monitors, or all of them paused/in maintenance). Each also carries usage_24h (model tokens and cost over the last 24 hours, summed over every model; null when it made no model call) and top_dependencies (its five heaviest outgoing dependencies over the same window: models, tools, hosts, databases; get_agent_dependencies has the rest and other ranges). Use register_agent to create one. Results are wrapped: |
| list_api_keysA | Requires an API key with the admin scope or higher. List all API keys in the project. Never returns plaintext key values — only the non-secret prefix, which is enough to identify a key for revoke_api_key. Each key includes last_used_at and last_used_surface (which client — "mcp", "terraform", or "api" — most recently authenticated with it), both absent if the key has never been used, plus scope ("read", "write" or "admin" — what the key is permitted to do) and created_by_key_id (which key minted it, absent for a key made in the dashboard; revoking a key also revokes every key below it in that chain). last_used_surface is best-effort client self-identification from a caller-controlled, spoofable User-Agent header: useful for answering "did my client ever successfully authenticate?", never a basis for trust or authorization decisions. |
| list_deliveriesA | Requires an API key with the read scope or higher. List recent alert deliveries across every monitor in the project — the answer to 'my monitor went down and I was not paged: did the alert fire, fail, or get suppressed, and to which destination?'. Each row is one (incident event, destination) outcome: pending while an attempt is in flight, delivered on success, dead once the per-channel attempt ceiling is reached, or suppressed when the destination's rate cap dropped it. Defaults to the last 30 days. Paging is not exposed: this returns only the newest page, because the question this tool answers is about the last few alerts, not a full archive — use the dashboard's delivery log for that. Results are wrapped: |
| list_dependenciesA | Requires an API key with the read scope or higher. Everything the project's agents call, across every agent, most calls first: each dependency with the same figures as get_agent_dependencies plus agents (which agents call it, and how often). Use it to answer "what calls postgres" or "which agents use this model". At most 50 rows; |
| list_destinationsA | Requires an API key with the read scope or higher. List all notification destinations (channels) in the project: email, webhook, Slack, Discord, Telegram. Use channel IDs to configure routing rules for monitors. |
| list_discovered_agentsA | Requires an API key with the read scope or higher. Trace sources that sent spans but match no registered agent: each with its id, source_name (the OpenTelemetry service.name it sent), first and last seen, span_count, and suggested_agent_id when a registered agent's slug or name now matches it. Call this when traces arrive but an agent shows none of them, then adopt_discovered_agent to count the source under an agent. At most 200, most recently seen first. Results are wrapped: |
| list_incidentsA | Requires an API key with the read scope or higher. List recent incidents (downtime events) for a monitor. Returns newest first. An open incident has closed_at=null. Results are wrapped: |
| list_monitorsA | Requires an API key with the read scope or higher. List all monitors in the authenticated LastPing project. Returns id, name, slug, status, ping_url for each. Use the tag param to filter by a single tag. |
| list_open_incidentsA | Requires an API key with the read scope or higher. Read this agent's failure inbox: every incident currently OPEN on the monitors it owns, newest first. Call it at the START of a run, before doing the work — this is how an agent finds out what broke while it was not running, with no webhook, chat integration or mailbox to wire up. What makes the payload worth reading is NOT 'your check failed' — the run that failed already knows that. It is the context that no single failure body can contain:
|
| list_runsA | Requires an API key with the read scope or higher. List runs across every monitor in the project, newest started first, including runs that exist only as OpenTelemetry traces (traced: true), which get_run_history cannot list. Each run carries check_id, check_name, rid, title, outcome, started_at, ended_at, duration_ms, step_count, exit_code, its incident when one opened, span_count, tokens and estimated cost_usd when it was traced, and agent_id, agent_name, source_name (the trace source) and multi_trace (true when the run holds more than one trace). outcome is succeeded, failed, cancelled, blocked, running or unfinished: unfinished is a run that started and never ended within its monitor's max_runtime_s (24 hours when unset); it is not a failure and never pages. The filters combine, and they narrow counts (the window's total per outcome) too. Page with next_cursor. Call get_run with check_id and rid for one run's full timeline and spans. Results are wrapped: |
| list_status_pagesA | Requires an API key with the read scope or higher. List the project's status pages: id, slug, title, the monitors on each, visibility, and the public URL of any public page. A status page is how a monitor's health is shown to people who are not in the project — customers, or another team. This is also the read you need before update_status_page, because its check_ids REPLACE the page's monitor set. |
| pause_monitorA | Requires an API key with the write scope or higher. Pause a LastPing monitor so it stops alerting (paused=true). The monitor still receives pings but does not alert. |
| regenerate_api_keyA | Requires an API key with the admin scope or higher. Replace an API key's secret: a new key with the same name, scope and, for a tracing key, the same monitor is created, and THE OLD KEY STOPS WORKING IMMEDIATELY, in every job, exporter, dotfile and agent that still holds it. If it is the key you are calling with, your next call fails until you switch to the new one. The new key has a NEW id. A key that never expired still never expires; one that had an expiry gets a fresh 90 days, capped at your own key's expiry. Unlike revoke_api_key this does not cascade: keys the old key created keep working. Refused (403, with max_scope) for a key with a higher scope than yours. The plaintext key is returned ONCE and cannot be retrieved again: write it where the old one was used, and never echo it back to the person. |
| register_agentA | Requires an API key with the write scope or higher. Register a new autonomous agent in the project's agent registry, returning its id, slug and wire-up instructions in one call — so an agent can go from nothing to reporting in a single conversation. Call this ONCE per autonomous worker, not once per monitor. ATTACHMENT RULE: after registering, attach monitors to this agent by passing the returned agent_id (its id OR its slug) to create_monitor's agent_id parameter. Naming an agent that does not exist is an error (400 UNKNOWN_AGENT) — it is NEVER an implicit create, so re-running this tool with the same name is the only way to get a new agent_id to attach to. Re-registering with the same name is safe: the API derives a stable slug from name and rejects a duplicate slug rather than creating a second row. |
| resume_monitorA | Requires an API key with the write scope or higher. Resume a paused LastPing monitor (paused=false). Alerting resumes on the next missed ping. |
| revoke_api_keyA | Requires an API key with the admin scope or higher. Permanently revoke an API key AND every key it created, recursively: the keys that key made, the keys those keys made, all the way down. All of them stop authenticating immediately. Revoking cascades because a key that can mint keys would otherwise outlive its own revocation. Check list_api_keys first — created_by_key_id shows which keys hang off this one — because this cannot be undone and may revoke more than one credential. |
| set_alert_templateA | Requires an API key with the write scope or higher. Set or clear a single alert message template on a monitor. The template is validated for allowed variables before saving. Pass an empty string for template to reset that entry to the built-in default. All other existing templates are preserved (read-modify-write). Available variables: {check_name}, {event}, {status}, {cause}, {last_ping}, {schedule}, {incident_url}, {run_url}, {branch}, {commit}, {actor}, {failing_stage}, {duration}, {latency}, {status_code}, {url}, {last_step}, {step_count}, {run_duration}, {body}, {detail}, {title}. {failing_stage} is CI-only and provider-dependent: always populated on GitLab; on GitHub only if the repository webhook also subscribes to the workflow_job event; never on Jenkins, whose Notification Plugin payload carries no step detail. {body} is the triggering ping's own text (pings.body_excerpt) — it is how a 'blocked' or 'note' event's reason reaches the alert, and a custom template is the only way to control where in the message it appears. {title} is the title of the run the alert is about — the free-text body posted with that run's /start ping. Populated for 'fail' (when the failing ping's rid resolves to a titled /start) and for 'stalled'/'overrun' under the same run-identification rule as {last_step}; empty otherwise, including for any run with no title, which is every run until a caller starts posting one. |
| set_routeA | Requires an API key with the write scope or higher. Route a monitor's alerts for one event type to a set of destinations (channels). THIS REPLACES THE WHOLE SET for that event type — every destination you leave out stops receiving that event, including ones somebody else configured. CALL get_monitor FIRST and read its |
| snooze_monitorA | Requires an API key with the write scope or higher. Set or clear a maintenance window on a monitor. During the window the monitor will not alert. Provide exactly one of: duration (e.g. '1h', '24h'), until (RFC 3339 timestamp), or clear=true to remove the window. |
| test_destinationA | Requires an API key with the write scope or higher. Send something through a destination right now, to move it from 'created' to 'known to work'. By default it delivers a synthetic 'LastPing test alert' immediately — use that after create_destination to confirm the credentials are right. For an EMAIL destination that is still unverified, a test alert is not what you need: an unverified email cannot be attached to a route at all, and no amount of testing changes that. Pass resend_verification=true instead to re-send the confirmation link a human must click. That is the tool to reach for when create_destination reported UNVERIFIED and the confirmation email never arrived or has expired. |
| update_agentA | Requires an API key with the write scope or higher. Update an existing LastPing agent's name/description by UUID using merge-patch semantics: only the fields you supply are changed, and any field you omit keeps its current stored value. slug is derived from name at creation and is immutable — this can rename the agent's display name, but never its slug, so anything that already references it by slug (including monitors attached via agent_id) keeps working. |
| update_destinationA | Requires an API key with the write scope or higher. Update a notification destination's name and/or config in place. Only the fields you pass are changed. The destination kind cannot be changed — delete and recreate instead. Changing an email destination's address resets verification and sends a new confirmation email. |
| update_monitorA | Requires an API key with the write scope or higher. Update an existing LastPing monitor's schedule/config by UUID using merge-patch semantics: only the fields you supply are changed, and any field you omit keeps its current stored value. If supplied, tags replaces the full tag set on the monitor (not merged). slug is immutable and cannot be changed. This is also the tool that sets a monitor's OUTPUT ASSERTIONS (the assertions argument) — conditions the ping body of a successful run must satisfy, which is how a job that exits zero having done nothing gets caught — and its METRIC GUARDS (the guards argument) — ceilings on a number the job reports, which is how an agent that loops and burns money gets caught. Like tags, assertions and guards each REPLACE the full set. ci_provider is NOT patchable — it is immutable once set, so only its ci_workflow/ci_branch filters can be changed here; rebinding a monitor to a different CI system means deleting and recreating it. |
| update_status_pageA | Requires an API key with the write scope or higher. Update a status page's title, slug, visibility, or the set of monitors on it. Only the arguments you pass are changed; anything you omit keeps its current value (this tool reads the page first and merges, so omitting check_ids can never blank the page). check_ids, when you DO pass it, REPLACES the whole monitor set — to add one monitor, pass the existing ids plus the new one, which list_status_pages gives you. Changing the slug changes the public URL and BREAKS any link already shared. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 50 tools
Most tools map to a distinct resource+action pair, but several close neighbors exist: list_open_incidents vs list_incidents, list_runs vs get_run_history, get_agent_dependencies vs list_dependencies, and pause_monitor vs snooze_monitor. The detailed descriptions help, but an agent could still misselect between run-listing or dependency tools without reading carefully.
The set overwhelmingly follows verb_noun snake_case (list_monitors, create_monitor, update_monitor, delete_monitor). Minor deviations include register_agent instead of create_agent, the awkward discover_monitors_reconcile, and one-off verbs like test_destination and declare_run_expectations.
50 tools is well into the heavy range, even for a broad monitoring platform. While the scope justifies many CRUD surfaces (monitors, incidents, agents, destinations, API keys, status pages), the count makes selection harder and bloats the context an agent must process.
The domain is covered thoroughly: monitors, incidents, routes/destinations, agents, API keys, status pages, runs, and telemetry all have lifecycle coverage. Minor gaps include no singleton get_destination or get_status_page (list + update/delete only) and no manual incident resolution, though that is likely automatic.