Skip to main content
Glama
phuryn

Staygreen MCP Server

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.

Add Staygreen to Cursor Install Staygreen in VS Code

Claude Code:

claude mcp add --transport http staygreen https://staygreen.io/mcp

Then 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 mcp

Without 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

get_status

Current status of one app or every app: monitors, page components and open incidents

list_monitors

Monitors in your workspace, filtered by app, type or state, with each one's last check

get_uptime

Measured uptime, downtime minutes, incident counts and daily history. Unmeasured time is no data, not 100%

get_response_times

Response-time series for a monitor, by city and country

get_incidents

Incident evidence and timelines: failing assertions, locations and masked snippets

get_ssl_and_domain_expiry

Certificate and domain expiry dates for monitored hosts

scan_app

A one-time scan of a public app URL. Optional keys are used once and never stored. Creates nothing

provision_app

Sets up an app's website check, SSL and domain check, status page and cron heartbeats in one call

create_monitor

Adds one monitor to an app, with the dashboard's own checks and plan limits

pause

Pauses one monitor or one app's monitors for up to 24 hours, then resumes them

draft_incident_update

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 tools
create_monitorCreate monitorA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
appYesApp id from list_monitors, get_status or provision_app.
nameNoMonitor name. Without one, Staygreen picks a default (a heartbeat's is "Scheduled job"), which this tool does not return; list_monitors shows it.
typeYesMonitor type. MCP server monitors are not available yet.
configNoSettings for the chosen type only. Unknown keys and settings for other types are refused.
targetYesHTTP 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_idYesA 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

NameRequiredDescription
monitorYes
first_checkYes

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness5/5

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.

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 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.

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 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.

Usage Guidelines5/5

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 updateA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
textYesPlain-text draft for the builder to review. This tool never publishes.
stateNoState proposed in the draft; does not change the incident or publish the note.investigating
incidentYesIncident id from get_incidents or get_status.
request_idYesA 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

NameRequiredDescription
draftYes
publishedYes
approval_urlYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

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: 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.

Usage Guidelines4/5

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 incidentsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
appNoApp id from list_monitors, get_status or provision_app.
limitNoMaximum records in this page, from 1 to 100; defaults to 50.
sinceNoOnly incidents opened at or after this ISO 8601 timestamp; defaults to the plan's history window.
stateNoFilter to open or resolved incidents.
cursorNoCall again with cursor set to the returned next_cursor until next_cursor is null.

Output Schema

NameRequiredDescription
incidentsYes
next_cursorYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

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 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.

Purpose5/5

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.

Usage Guidelines4/5

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 timesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
limitNoMaximum records in this page, from 1 to 100; defaults to 50.
cursorNoCall again with cursor set to the returned next_cursor until next_cursor is null.
windowNoHistory window ending now, capped at 30 days without history_1y. The result reports the effective window.24h
monitorYesMonitor id from list_monitors or create_monitor.
locationNoOptional check location, using the city and country returned by get_incidents.

Output Schema

NameRequiredDescription
seriesYes
windowYes
monitorYes
resolutionYes
aggregationYes
next_cursorYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

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 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.

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 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.

Purpose4/5

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.

Usage Guidelines4/5

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 expiryA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
appNoApp id from list_monitors, get_status or provision_app.
limitNoMaximum records in this page, from 1 to 100; defaults to 50.
cursorNoCall again with cursor set to the returned next_cursor until next_cursor is null.

Output Schema

NameRequiredDescription
hostsYes
next_cursorYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

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-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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 statusA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
appNoApp id from list_monitors or provision_app, or * for all apps.*

Output Schema

NameRequiredDescription
appsYes

TDQS

A4.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

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 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.

Parameters4/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 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.

Purpose5/5

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.

Usage Guidelines5/5

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 uptimeA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
limitNoMaximum records in this page, from 1 to 100; defaults to 50.
cursorNoCall again with cursor set to the returned next_cursor until next_cursor is null.
windowNoHistory window ending now, capped at 30 days without history_1y. The result reports the effective window.24h
monitorNoMonitor id from list_monitors, or * for all monitors.*

Output Schema

NameRequiredDescription
windowYes
monitorsYes
next_cursorYes

TDQS

A4.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

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 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.

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 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.

Purpose5/5

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.

Usage Guidelines5/5

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 monitorsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
appNoApp id from list_monitors, get_status or provision_app.
typeNoMonitor type. MCP server monitors are not available yet.
limitNoMaximum records in this page, from 1 to 100; defaults to 50.
cursorNoCall again with cursor set to the returned next_cursor until next_cursor is null.
statusNoFilter by current state; unchecked means no established state yet.

Output Schema

NameRequiredDescription
monitorsYes
next_cursorYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

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 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

pausePauseA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
appNoApp id from list_monitors, get_status or provision_app.
minutesYesPause length from 1 to 1440 minutes. Monitoring resumes automatically.
monitorNoMonitor id from list_monitors or create_monitor.
request_idYesA 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

NameRequiredDescription
monitorsYes
paused_untilYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

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 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.

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 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.

Purpose5/5

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.

Usage Guidelines4/5

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 appA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic HTTP(S) app address with a hostname of at most 80 characters. Repeated provisioning of its normalized URL returns the existing setup.
nameNoApp 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_urlNoMCP server address; currently reported as skipped because that monitor type is Coming soon.
crons_fromNoCron 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_idYesA new UUID for this write. Retry with the same UUID and identical inputs after a lost reply; never reuse it for another operation.
stripe_keyNoRestricted Stripe key; also supply stripe_endpoints. Never returned.
supabase_keyNoThat project's publishable or legacy anon key, stored encrypted.
supabase_urlNoSupabase project URL. Supply supabase_key too to create its health monitor.
status_domainNoDesired status-page hostname. Domain setup is reported as skipped until the separate status-edge stage is available.
stripe_endpointsNoStripe webhook endpoint ids to monitor with stripe_key.

Output Schema

NameRequiredDescription
appYes
cnameYes
createdYes
skippedYes
monitorsYes
heartbeatsYes
status_page_urlYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

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 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.

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 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.

Usage Guidelines5/5

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 appA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
urlYesPublic app URL. No credentials or query parameters.
cronsNoRepository cron findings from the CLI. No file contents or local paths.
stripe_keyNoRestricted Stripe key, used once and never stored.
supabase_keyNoProject publishable or matching legacy anon key. Used once, never stored.
supabase_urlNoSupabase project URL; supply its publishable key too.

Output Schema

NameRequiredDescription
mcpYes
cronsYes
domainYes
stripeYes
supabaseYes
checked_atYes
certificateYes
status_pageYes
dependenciesYes
crons_messageYes

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: 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

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 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.

Usage Guidelines4/5

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. 1 tool updatev0.1.1
    • Changedcreate_monitor2 fields changed
      • changedInput schema / properties / name / description
        Previous 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."
      • changedInput schema / properties / target / description
        Previous 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."
  2. 11 tool updatesv0.1.0
    • First observedcreate_monitor
    • First observeddraft_incident_update
    • First observedget_incidents
    • First observedget_response_times
    • First observedget_ssl_and_domain_expiry
    • First observedget_status
    • First observedget_uptime
    • First observedlist_monitors
    • First observedpause
    • First observedprovision_app
    • First observedscan_app

TDQS

A4.4/5.0

Scored across 11 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness3/5

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

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables 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.
    13
    3 npm
    Apache 2.0
  • 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
    Not graded
    quality
    C
    maintenance
    Enables AI agents to investigate production incidents by exposing service health, logs, and deployment data through MCP tools.
    3 npm
    ISC