Staygreen MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Staygreen MCP Serveris everything up right now, and any open incidents?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Staygreen
Uptime and incident monitoring for apps built with coding agents: checks from more than one location, incidents with the evidence attached, and a public status page for each app. Free plan at staygreen.io.
This repository is Staygreen's public issue tracker, the home of its MCP server's listing, and the source of the staygreen command-line package and local MCP server (CLI.md), under the Apache 2.0 license. The rest of Staygreen's code opens here in November 2026.
Connect an agent (MCP)
Staygreen's MCP server is at https://staygreen.io/mcp (streamable HTTP). Every call requires sign-in; there is no anonymous tool.
Sign in: no token to handle
Add https://staygreen.io/mcp to an MCP client that supports signing in (OAuth), then sign in with your Staygreen account and choose the workspace. If you don't have an account yet, signing up there creates a Free workspace; you don't need to open the dashboard first. The connection can read and change that workspace's monitors, and you must be an administrator of it.
Claude Code:
claude mcp add --transport http staygreen https://staygreen.io/mcpThen run /mcp, choose staygreen and Authenticate. In Claude, add it as a custom connector with the same URL.
With an API token (CI and scripts)
An administrator creates a token in the dashboard under Agents and API: read-only or read-and-write, shown once. Send it as Authorization: Bearer <token>. The same token works on the MCP server and on the REST API (https://staygreen.io/api/v1/<tool>).
claude mcp add --transport http staygreen https://staygreen.io/mcp \
--header "Authorization: Bearer $STAYGREEN_API_TOKEN"Local server (npm)
The staygreen package runs the same tools as a local stdio server and calls the REST API with a workspace API token. Node 22 or later.
claude mcp add staygreen -e STAYGREEN_API_TOKEN=… -- npx -y staygreen mcpWithout a token only scan_app works. Configuration for Claude Desktop, Cursor and VS Code, and the package's scan and provision commands, are in CLI.md.
Tools
Tool | What it does |
| Current status of one app or every app: monitors, page components and open incidents |
| Monitors in your workspace, filtered by app, type or state, with each one's last check |
| Measured uptime, downtime minutes, incident counts and daily history. Unmeasured time is no data, not 100% |
| Response-time series for a monitor, by city and country |
| Incident evidence and timelines: failing assertions, locations and masked snippets |
| Certificate and domain expiry dates for monitored hosts |
| A one-time scan of a public app URL. Optional keys are used once and never stored. Creates nothing |
| Sets up an app's website check, SSL and domain check, status page and cron heartbeats in one call |
| Adds one monitor to an app, with the dashboard's own checks and plan limits |
| Pauses one monitor or one app's monitors for up to 24 hours, then resumes them |
| Saves an incident note as a draft. It appears publicly only once you publish it in the dashboard |
Writes take a request_id UUID: repeat it with the same inputs to retry safely. Deleting, alert channels, teammates, billing and publishing are not available to agents. Calls share your workspace's budget: 30 a minute on Free, 120 on Builder.
Related MCP server: StackWitness
Report a bug or suggest a feature
Open an issue. Say what you did, what you expected, and what happened instead; the monitor type and the screen help.
Issues are public. Never paste a heartbeat URL, an API token, a header value, or anything else your monitors keep secret. A heartbeat URL is the only credential for that heartbeat: anyone holding it can ping it. If you posted one by mistake, rotate it from the heartbeat's page.
For a security problem, don't open an issue: use private vulnerability reporting instead.
Pull requests aren't accepted until the code opens.
Available Tools
11 toolscreate_monitorCreate monitorAIdempotentInspect
Create one monitor in an existing app; for a new app use provision_app instead. type decides what target is and which config keys apply: http takes a URL with method, expect, keyword, slowMs, assertions and headers; tcp a hostname or public IP with port, tls and slowMs; ssl a hostname and no config; dns a record name with record and expected; heartbeat ignores target and takes schedule, tz, graceMin, maxRunMin and assertions, so give it a name; supabase a project URL with key and databaseRead; stripe https://api.stripe.com with key, endpoints, critical, failureThreshold, windowMin and pendingMin. A key belonging to another type is refused. Validation, public-address checks and plan quotas match the dashboard, and Stripe and Supabase checks must verify before saving. Returns a first test result but never a heartbeat's URL, which the dashboard shows. Supply request_id for safe retries. Needs write access.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | App id from list_monitors, get_status or provision_app. | |
| name | No | Monitor name. Without one, Staygreen picks a default (a heartbeat's is "Scheduled job"), which this tool does not return; list_monitors shows it. | |
| type | Yes | Monitor type. MCP server monitors are not available yet. | |
| config | No | Settings for the chosen type only. Unknown keys and settings for other types are refused. | |
| target | Yes | HTTP or Supabase URL, SSL hostname, TCP hostname or public IP, or DNS record name. HTTP(S) URL hostnames may be at most 80 characters. Stripe uses https://api.stripe.com; a heartbeat ignores it. | |
| request_id | Yes | A new UUID for this write. Retry with the same UUID and identical inputs after a lost reply; never reuse it for another operation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitor | Yes | |
| first_check | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent and non-destructive, so the safety profile is baseline. The description adds real context beyond that: cross-type key rejection, validation/public-address checks and plan quotas matching the dashboard, verify-before-save for Stripe/Supabase, a first test result in the response but never a heartbeat URL, and retry guidance. That is above-average disclosure, but return-shape caveats are partly covered by the output schema, keeping it at a solid 3 (leaning 4).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the sibling alternative, then a dense per-type map where every clause carries information. It is a single long paragraph, though — a per-type list would parse faster — which keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter write tool with nested config, an output schema, and full annotations, the description covers the remaining gaps: per-type conditional requirements, validation and quota behavior, verify-before-save, retry semantics via request_id, and permission needs. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter semantics the schema cannot express: 'type decides what target is and which config keys apply', with each type's required config keys enumerated, and 'a key belonging to another type is refused'. That is genuinely additive, though it restates fields the schema already documents individually rather than adding formats or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Create one monitor in an existing app') and immediately scopes it away from the sibling that handles a different case ('for a new app use provision_app instead'). An agent can pick between create_monitor and provision_app without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule to the sibling provision_app, plus a precondition ('Needs write access') and the constraint that Stripe/Supabase checks must verify before saving. The only mild gap is no guidance on avoiding duplicates against an existing monitor, which is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
draft_incident_updateDraft incident updateAIdempotentInspect
Save a new plain-text incident note as a draft and return the builder's approval link. Get the incident id from get_incidents. The note never appears publicly until the builder publishes it in the dashboard. Supply request_id for safe retries. Needs write access.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain-text draft for the builder to review. This tool never publishes. | |
| state | No | State proposed in the draft; does not change the incident or publish the note. | investigating |
| incident | Yes | Incident id from get_incidents or get_status. | |
| request_id | Yes | A new UUID for this write. Retry with the same UUID and identical inputs after a lost reply; never reuse it for another operation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| draft | Yes | |
| published | Yes | |
| approval_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already state this is a non-read-only, non-destructive, idempotent operation, and the description adds meaningful context: it saves only a draft, returns an approval link, does not publish publicly, and requires write access. The request_id retry guidance further clarifies idempotent behavior beyond the annotation. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five short, front-loaded sentences with no wasted language. The core action, draft-only behavior, incident id source, retry guidance, and access requirement are all stated efficiently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, complete schema coverage, and the presence of an output schema, the description covers what an agent needs in order to call the tool correctly. It explains the draft-only safety property, auth requirement, id source, and retry semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all four parameters, establishing a baseline of 3. The description adds useful meaning by explaining where the incident id comes from and how request_id supports safe retries, though it does not discuss the optional state parameter beyond what the schema says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: saving a plain-text incident note as a draft. It clarifies that this does not publish and that the output is an approval link, distinguishing it from any publish action. It also points to get_incidents for the required incident id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear prerequisites: obtain the incident id from get_incidents and use request_id for safe retries. It also explains the draft will not appear publicly until a builder publishes it, implicitly defining the boundary against publishing. However, it does not explicitly enumerate alternatives or when-not-to-use cases beyond that boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_incidentsGet incidentsARead-onlyIdempotentInspect
Read incident evidence and timelines for diagnosis, optionally filtered by app, start date and state. Returns incident ids for draft_incident_update, cities and countries, failing assertions and masked snippets. Only the latest published note is included. Follow next_cursor for older pages.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App id from list_monitors, get_status or provision_app. | |
| limit | No | Maximum records in this page, from 1 to 100; defaults to 50. | |
| since | No | Only incidents opened at or after this ISO 8601 timestamp; defaults to the plan's history window. | |
| state | No | Filter to open or resolved incidents. | |
| cursor | No | Call again with cursor set to the returned next_cursor until next_cursor is null. |
Output Schema
| Name | Required | Description |
|---|---|---|
| incidents | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, so the description correctly spends its words elsewhere: masked snippets, only the latest published note per incident, and the cursor pagination contract. These are real behavioral details an agent cannot get from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then return contents, then pagination. Every sentence carries distinct information and nothing is repeated from structured fields unnecessarily.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, filterability, what the payload contains, the latest-note caveat, pagination termination, and downstream consumption of the ids. With an output schema present, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns one extra point by mapping the returned next_cursor to the 'cursor' parameter, a relationship the schema alone only implies. The inline restatement of app/start date/state filters adds little beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read incident evidence and timelines'), plus the diagnosis use case and optional filters. It also distinguishes itself from the nearest sibling by noting it returns incident ids for draft_incident_update, which no other sibling does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'for diagnosis' establishes the primary context and 'Follow next_cursor for older pages' gives a concrete continuation rule. It stops short of naming when to prefer get_uptime or scan_app instead, so there is no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_response_timesGet response timesARead-onlyIdempotentInspect
Read response-time series for a monitor, optionally by city and country. Uses 5-minute windows for 24h, hourly up to 30d, daily beyond. Larger buckets report maxima of the recorded percentiles, not an exact percentile of raw requests. Follow next_cursor for all points.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records in this page, from 1 to 100; defaults to 50. | |
| cursor | No | Call again with cursor set to the returned next_cursor until next_cursor is null. | |
| window | No | History window ending now, capped at 30 days without history_1y. The result reports the effective window. | 24h |
| monitor | Yes | Monitor id from list_monitors or create_monitor. | |
| location | No | Optional check location, using the city and country returned by get_incidents. |
Output Schema
| Name | Required | Description |
|---|---|---|
| series | Yes | |
| window | Yes | |
| monitor | Yes | |
| resolution | Yes | |
| aggregation | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description still adds substantive behavior: automatic downsampling tied to window length and the caveat that larger buckets report maxima of percentiles rather than a true percentile of raw requests. That caveat materially changes how an agent should interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler. The primary capability is front-loaded, followed by granularity rules, then the accuracy caveat and pagination instruction in priority order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-shape explanation is unnecessary, and the description covers the non-obvious pieces: sampling resolution, the meaning of downsampled values, and pagination completion criteria. Nothing an agent needs to call or interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above baseline by explaining that bucket granularity is a function of the chosen window and that location filtering is optional. It does not clarify cursor/limit interaction, which the schema already handles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read response-time series for a monitor') with scope modifiers (city/country). The resource is clearly distinct from get_uptime and get_status, but it never names or contrasts with those siblings, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: which windows map to which bucket sizes, and the instruction to follow next_cursor until all points are collected. It stops short of saying when to prefer this over get_uptime/get_status, so there is no explicit alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ssl_and_domain_expiryGet ssl and domain expiryARead-onlyIdempotentInspect
Read certificate and domain expiry dates, with days remaining, for the hosts your SSL monitors check. Omit app for every SSL monitor in the workspace, or pass an app id for that app's hosts only. A null date means Staygreen has no date to show for that host; it never guesses one. Use this for renewal deadlines; use get_status instead for whether a site is up now. Follow next_cursor to read every host.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App id from list_monitors, get_status or provision_app. | |
| limit | No | Maximum records in this page, from 1 to 100; defaults to 50. | |
| cursor | No | Call again with cursor set to the returned next_cursor until next_cursor is null. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hosts | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the bar is lower; the description still adds substantive behavior: a null date means Staygreen has no date and 'never guesses one,' plus follow-next_cursor pagination guidance. It stops short of stating result shape or size 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with no filler, front-loaded with what it returns and immediately followed by scoping, alternative routing, and pagination. Each sentence carries distinct, actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value detail is unnecessary, and the description covers the remaining agent-critical points: scope semantics, null-date handling, sibling routing, and pagination. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, giving a baseline of 3, but the description adds real semantics beyond the schema: omitting app means every SSL monitor in the workspace versus passing an app id for that app's hosts only. The cursor sentence reinforces the paging contract in practical terms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Read certificate and domain expiry dates, with days remaining') and scopes it to monitored hosts. It also names the sibling it is not (get_status) so the agent can discriminate without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the selection rule: 'Use this for renewal deadlines; use get_status instead for whether a site is up now.' It also spells out the app-or-not branching, so an agent knows exactly when to omit or pass the app parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusGet statusARead-onlyIdempotentInspect
Read the current status of one app or every app: its overall state, monitors (private ones included), status page components and open incidents with their latest published note. Omit app or pass * for the whole workspace; an app id outside your workspace returns not_found. Start here: its app, monitor and incident ids feed the other tools. Use get_uptime or get_incidents for history. No draft notes are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App id from list_monitors or provision_app, or * for all apps. | * |
Output Schema
| Name | Required | Description |
|---|---|---|
| apps | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, and non-destructive, so the safety profile is largely covered. The description still earns credit for adding non-obvious behavior: private monitors are included in results, draft notes are excluded, and an out-of-workspace app id returns not_found rather than erroring or empty. It stops short of describing result size or pagination, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the scope and payload, then usage routing, then the default/error semantics. Four dense sentences with no restatement of the title or name; each one adds new information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be spelled out, yet the description still tells the agent what categories of data come back and what is deliberately absent (draft notes). Combined with the entry-point guidance and error semantics, nothing required to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents the app id format and the '*' const. The description adds semantic weight by explaining that omitting the param is equivalent to passing '*' and by describing the not_found failure mode for foreign ids, which the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource ('Read the current status of one app or every app') and then enumerates exactly what 'status' contains: overall state, monitors (including private ones), status page components, and open incidents with their latest published note. Sibling tools with overlapping domains (get_uptime, get_incidents) are explicitly positioned as history-only, so the boundary is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Start here: its app, monitor and incident ids feed the other tools' gives an explicit entry-point rule, and 'Use get_uptime or get_incidents for history' names the alternatives and the condition that selects them. The '*'-vs-omit behavior and the not_found case for out-of-workspace ids close the remaining ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_uptimeGet uptimeARead-onlyIdempotentInspect
Read measured uptime, downtime minutes, incident counts and daily history. With monitor omitted or *, every monitor is returned a page at a time (follow next_cursor); a monitor id returns that monitor alone, so pass no cursor with it. window is capped at 30d unless your plan includes a year of history, and the result's window says which one applied. Unmeasured time is no data, not 100% uptime. Use get_response_times instead for latency, and get_incidents for what failed and why.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum records in this page, from 1 to 100; defaults to 50. | |
| cursor | No | Call again with cursor set to the returned next_cursor until next_cursor is null. | |
| window | No | History window ending now, capped at 30 days without history_1y. The result reports the effective window. | 24h |
| monitor | No | Monitor id from list_monitors, or * for all monitors. | * |
Output Schema
| Name | Required | Description |
|---|---|---|
| window | Yes | |
| monitors | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description does add genuine behavioral context beyond that: the 30d window cap unless the plan includes a year of history, that the result reports the effective window, pagination via next_cursor, and the important caveat that unmeasured time is no data rather than 100% uptime.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with what is read, then scoping/pagination, then alternatives. Every sentence carries information, though the window cap is stated in both description and schema, a small redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return shape, and it still covers the caveats an agent needs: window capping, cursor following, and the misreading risk of treating missing data as full uptime.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds interaction semantics the schema does not: monitor=* means every monitor a page at a time while a specific id returns that monitor alone and must not be paired with a cursor. It also explains that window may be silently reduced and the effective value is reported back.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the exact metrics returned (uptime, downtime minutes, incident counts, daily history). It also names the two siblings that cover adjacent concerns, so an agent can distinguish it from get_response_times and get_incidents 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes latency questions to get_response_times and failure-cause questions to get_incidents. It also gives the operational rules for choosing a scope: omit monitor or pass * for all (paginated), pass an id for one monitor and no cursor with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_monitorsList monitorsARead-onlyIdempotentInspect
List monitors in your workspace with their app ids, current state and last check, ordered by id. The app, type and status filters combine, each narrowing the same list; with none you get every monitor, automatic SSL checks included. last_check_precision says whether last_check is an exact outcome, the start of its latest five-minute check window, or no data. Never returns credentials or heartbeat URLs. Use get_status instead for each app's overall state and open incidents, get_uptime for history. Call again with cursor set to next_cursor until null.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App id from list_monitors, get_status or provision_app. | |
| type | No | Monitor type. MCP server monitors are not available yet. | |
| limit | No | Maximum records in this page, from 1 to 100; defaults to 50. | |
| cursor | No | Call again with cursor set to the returned next_cursor until next_cursor is null. | |
| status | No | Filter by current state; unchecked means no established state yet. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitors | Yes | |
| next_cursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds real value: it discloses that credentials and heartbeat URLs are never returned, explains the three meanings of last_check_precision, and gives the pagination contract (re-call with cursor until next_cursor is null). It does not mention rate limits or page-size interaction, but the safety and paging profile is well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource, ordering and contents, then filters, then return caveats, then sibling routing — a sensible priority order. It is dense with six sentences and the last_check_precision sentence is somewhat compressed, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All five optional params are schema-documented, an output schema exists, and annotations cover the safety profile; the description still adds the filter-combination rule, the credential/heartbeat exclusion, pagination loop, and sibling routing. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns above that by explaining that app/type/status filters intersect rather than union, and that omitting all of them yields every monitor including automatic SSL checks — semantics the schema does not state. It also adds cursor loop behavior, though limit and enum value meanings are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource plus the exact payload shape ('with their app ids, current state and last check, ordered by id'), so an agent knows the return contents and ordering before calling. It also distinguishes itself from get_status and get_uptime by name, so it is unambiguous against siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use get_status for per-app overall state and open incidents, get_uptime for history. It also explains how filters combine and what the no-filter default returns, removing ambiguity about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pausePauseADestructiveIdempotentInspect
Temporarily pause exactly one monitor or every monitor of one app for at most 1440 minutes, then resume automatically. Get ids from list_monitors or get_status. A repeated request_id returns the original pause deadline without extending it. Needs write access.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | App id from list_monitors, get_status or provision_app. | |
| minutes | Yes | Pause length from 1 to 1440 minutes. Monitoring resumes automatically. | |
| monitor | No | Monitor id from list_monitors or create_monitor. | |
| request_id | Yes | A new UUID for this write. Retry with the same UUID and identical inputs after a lost reply; never reuse it for another operation. |
Output Schema
| Name | Required | Description |
|---|---|---|
| monitors | Yes | |
| paused_until | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains the maximum pause window, automatic resumption, and the idempotency contract for request_id (a repeated request returns the original deadline without extending it). It does not detail what monitoring data or alert behavior is affected while paused, but the core mutation semantics and reversibility are well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is three short sentences, front-loaded with the action and scope, then id sources, idempotency, and permissions. Every sentence adds useful information without repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers the mutation scope, timing limits, idempotency, and write-access requirement. It could say more about what happens to active alerts or monitoring data during the pause, but it is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics not obvious from the schema alone: exactly one monitor or all monitors of one app, the 1440-minute cap, and the idempotent behavior of request_id when repeated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (pause) and resource (exactly one monitor or every monitor of one app), including the scope and automatic-resume behavior. It clearly distinguishes the tool from adjacent monitoring and listing tools by naming its mutation effect and the id sources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent where to obtain the required ids ('list_monitors or get_status') and notes the write-access prerequisite. It does not explicitly name when *not* to use it or compare it to other alternatives, so it falls 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.
provision_appProvision appAIdempotentInspect
Set up a new app in one transaction: its website check, an automatic SSL/domain check when url is https on port 443 with a hostname that has no SSL monitor yet, a status page, and one heartbeat per crons_from entry. Optional checks come in pairs, supabase_url with supabase_key and stripe_key with stripe_endpoints: half a pair is reported in skipped, and a full pair that fails verification refuses the whole call. mcp_url and status_domain are reported in skipped when supplied. A new app's explicit name must be free; without one, the hostname is made unique. Every option is validated and checked first; then, if url matches an existing app, that app comes back with its monitors as they were (add checks with create_monitor), plus a status page if it had none. A plan_limit error creates nothing and lists what was not created. Heartbeat URLs are returned only to this request and its retries with the same request_id. Needs write access.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public HTTP(S) app address with a hostname of at most 80 characters. Repeated provisioning of its normalized URL returns the existing setup. | |
| name | No | App name, 1 to 60 characters and unique in the workspace ignoring case. Defaults to the hostname, shortened and suffixed as needed to be unique. | |
| mcp_url | No | MCP server address; currently reported as skipped because that monitor type is Coming soon. | |
| crons_from | No | Cron definitions read by your agent from vercel.json or netlify.toml. Send definitions, never a local file path: a remote server cannot read your checkout. | |
| request_id | Yes | A new UUID for this write. Retry with the same UUID and identical inputs after a lost reply; never reuse it for another operation. | |
| stripe_key | No | Restricted Stripe key; also supply stripe_endpoints. Never returned. | |
| supabase_key | No | That project's publishable or legacy anon key, stored encrypted. | |
| supabase_url | No | Supabase project URL. Supply supabase_key too to create its health monitor. | |
| status_domain | No | Desired status-page hostname. Domain setup is reported as skipped until the separate status-edge stage is available. | |
| stripe_endpoints | No | Stripe webhook endpoint ids to monitor with stripe_key. |
Output Schema
| Name | Required | Description |
|---|---|---|
| app | Yes | |
| cname | Yes | |
| created | Yes | |
| skipped | Yes | |
| monitors | Yes | |
| heartbeats | Yes | |
| status_page_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond annotations: all-or-nothing transactionality, whole-call refusal on failed pair verification, plan_limit creating nothing, needs write access, and heartbeat URLs being returned only to this request and retries with the same request_id. It doesn't restate the idempotentHint annotation but gives its practical shape via URL normalization.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what gets created, then conditional rules, then error/idempotency behavior; nearly every clause carries a distinct fact. It is dense and long for a description, though none of it is clearly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, multi-effect write tool with an output schema, the description still covers the failure modes (pair verification failure, plan_limit), idempotency, retry semantics, and skipped reporting. An agent can decide whether and how to call this without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still contributes pairing semantics for supabase_url/supabase_key and stripe_key/stripe_endpoints (half-pair reported in skipped, failed full pair refuses), plus name uniqueness and hostname fallback rules that complement the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb + resource and enumerates exactly what gets created atomically (website check, conditional SSL/domain check, status page, heartbeats per crons_from entry). It also distinguishes itself from the create_monitor sibling by directing users there for added checks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance and alternatives: re-provisioning an existing URL returns the existing setup, and additional checks should go through create_monitor. It also states the conditions under which mcp_url and status_domain merely report as skipped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_appScan appARead-onlyInspect
Run a one-time silent-failure scan of a public app URL. Reports certificate/domain expiry, a discoverable status page, detected sign-in dependencies with DNS/TLS/frontend evidence and suggested HTTP/CNAME/NS monitors, optional Supabase health and Stripe delivery failures over 30 days. Optional keys are used once, never stored or returned. Repository cron findings may be supplied by the client. MCP server health is Coming soon. Requires read access; limited per credential and globally. No monitor is created.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Public app URL. No credentials or query parameters. | |
| crons | No | Repository cron findings from the CLI. No file contents or local paths. | |
| stripe_key | No | Restricted Stripe key, used once and never stored. | |
| supabase_key | No | Project publishable or matching legacy anon key. Used once, never stored. | |
| supabase_url | No | Supabase project URL; supply its publishable key too. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mcp | Yes | |
| crons | Yes | |
| domain | Yes | |
| stripe | Yes | |
| supabase | Yes | |
| checked_at | Yes | |
| certificate | Yes | |
| status_page | Yes | |
| dependencies | Yes | |
| crons_message | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that optional keys are used once and never stored or returned, that read access is required, that usage is limited per credential and globally, and that MCP server health is 'Coming soon' (a known limitation). These are the exact behavioral facts an agent needs before sending secrets, and none are derivable from readOnlyHint/destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action and the 'no monitor is created' boundary are front-loaded, and every sentence carries a distinct fact. It is dense — several clauses (limits, key handling, cron source, coming-soon caveat) are packed into one block, which slightly hurts scannability but not information value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema handling return values and 100% schema coverage handling parameters, the description fills the remaining gaps: authorization, rate limiting, secret handling, scope boundaries, and a feature that is not yet available. An agent has enough to decide to call it and to call it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real semantic value: it explains the purpose of the optional Stripe/Supabase keys (health and 30-day delivery failures), the handling contract for those keys, and that 'crons' comes from repository findings supplied by the client. It does not cover the URL constraint (no credentials/query params), which the schema carries.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a one-time silent-failure scan of a public app URL') plus the concrete findings it reports. It explicitly distinguishes itself from the monitoring siblings by declaring 'No monitor is created', separating it from create_monitor and provision_app.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'one-time' framing and 'No monitor is created' make clear this is a diagnostic pre-check rather than a monitoring setup step, and the note that cron findings 'may be supplied by the client' tells the agent when to pass them. It stops short of naming specific alternatives (create_monitor, list_monitors) or stating exclusion conditions explicitly.
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 tool update
v0.1.1- Changed
create_monitor2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Monitor name; defaults to a name derived from the target."New value: +"Monitor name. Without one, Staygreen picks a default (a heartbeat's is \"Scheduled job\"), which this tool does not return; list_monitors shows it." - changed
Input schema / properties / target / descriptionPrevious value: -"HTTP or Supabase URL, SSL/TCP hostname, DNS record name, or job name for a heartbeat. HTTP(S) URL hostnames may be at most 80 characters. Stripe uses https://api.stripe.com."New value: +"HTTP or Supabase URL, SSL hostname, TCP hostname or public IP, or DNS record name. HTTP(S) URL hostnames may be at most 80 characters. Stripe uses https://api.stripe.com; a heartbeat ignores it."
11 tool updates
v0.1.0- First observed
create_monitor - First observed
draft_incident_update - First observed
get_incidents - First observed
get_response_times - First observed
get_ssl_and_domain_expiry - First observed
get_status - First observed
get_uptime - First observed
list_monitors - First observed
pause - First observed
provision_app - First observed
scan_app
TDQS
Scored across 11 tools
The six read tools (get_status, list_monitors, get_uptime, get_response_times, get_incidents, get_ssl_and_domain_expiry) sit close together, but each description explicitly states its distinct metric and cross-references the alternatives ('Use get_uptime ... instead for latency'), which keeps selection reliable. The only real proximity risk is provision_app vs create_monitor, which is handled by an explicit 'for a new app use provision_app instead' rule.
All snake_case with a mostly verb_noun pattern (get_incidents, list_monitors, create_monitor, provision_app, scan_app, draft_incident_update). Minor deviations: the bare verb 'pause' has no object, and draft_incident_update orders the noun before the action, but neither is confusing.
Eleven tools is well within a comfortable range and each one covers a distinct facet: status, monitors, uptime, latency, incidents, expiry, creation, pausing, incident notes, and a one-off scan. No filler tools are apparent.
Read coverage is thorough and provisioning is solid, but the write surface is thin: no update_monitor or delete_monitor, no way to resume a paused monitor early, no app update/delete, and no incident publish (drafting only). Agents can work around some of this via the dashboard, but lifecycle coverage is notably incomplete.
Maintenance
Related MCP Connectors
Manage uptime monitors, incidents and status pages from any MCP client.
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.
- StatOSSOAuthcom.statoss
Status pages and uptime monitoring: read status, monitors and incidents; open incidents.
Monitor websites, APIs, and servers: create monitors, triage incidents, and query uptime stats.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with Datadog's monitoring and observability platform through the MCP protocol. Supports incident management, monitor status checks, log searches, metrics queries, APM traces, dashboard access, RUM analytics, host management, and downtime scheduling.133 npmApache 2.0

StackWitnessofficial
FlicenseNot gradedqualityDmaintenanceLet agents read and manage your org’s independent monitors, incidents, status pages, and alerts (honest measured state, no false greens).-- AlicenseNot gradedqualityCmaintenanceEnables AI agents to investigate production incidents by exposing service health, logs, and deployment data through MCP tools.3 npmISC
- FlicenseNot gradedqualityCmaintenanceEnables agents to inspect machine status and sensor anomalies, search maintenance guidance, and create maintenance tickets through controlled MCP tools.-