The Model Context Protocol (MCP) server gives AI agents access to your Hyperping project over HTTP. An agent can read monitors, uptime, incidents, on-call and status pages, and act on them: create and pause monitors, declare and resolve incidents, build status pages, publish status page incidents and schedule maintenance. Works with any MCP-compatible client: Claude Desktop, Claude Code, Cursor, Windsurf, mcp-inspector, or custom clients built on the MCP SDK.
In the dashboard sidebar, open API Keys and create a read_only or read_write key. A read_only key can call the 28 read tools; the 21 write tools need read_write. Keys are strictly scoped to one project.
Paste the mcpServers block below into your Claude Desktop, Cursor, or Windsurf config. Per-client instructions are in Agent setup.
Restart your client. Start asking questions: "What's down?", "SLA on the API monitor this month?"
Claude Desktop, Cursor, Windsurf, Claude Code. Add to the mcpServers block of your client config:
{
"mcpServers": {
"hyperping": {
"type": "http",
"url": "https://api.hyperping.io/v1/mcp",
"headers": {
"Authorization": "Bearer sk_..."
}
}
}
}Older clients that only speak stdio can bridge via mcp-remote:
{
"mcpServers": {
"hyperping": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://api.hyperping.io/v1/mcp",
"--header",
"Authorization: Bearer sk_..."
]
}
}
}The server exposes 49 tools: 28 read and 21 write. Parameters marked ? are optional. UUIDs carry a prefix: monitors mon_, components comp_, servers agt_, status pages sp_, status page incidents inci_, maintenance windows mw_, incidents outage_.
list_monitors(status?, page?, limit?)readstatus is up, down, paused or ssl_expiring (certificate expires within 30 days). limit defaults to 50, 200 at most.get_monitor(uuid)readsearch_monitors_by_name(query)readcreate_monitor(name, url, protocol?, port?, http_method?, regions?, check_frequency?, follow_redirects?, timeout?, expected_status_code?, request_body?, request_headers?, required_keyword?, paused?, alerts_wait?, dns_record_type?, dns_nameserver?, dns_expected_answer?, escalation_policy?, group_id?)writeprotocol is http (default), icmp, port (with port) or dns (with the dns_* fields). http_method defaults to GET and timeout to 30 seconds, 60 at most. expected_status_code takes 200, "2xx" or "1xx-3xx", and regions: ["*"] checks from every region.
check_frequency is one of 10, 20, 30, 60, 120, 180, 300, 600, 1800, 3600, 21600, 43200 or 86400 seconds; under 30 seconds needs a Business plan. alerts_wait is in minutes: -1 (never), 0 (at once), 1, 2, 3, 5, 10, 30 or 60. Any other value is refused.
update_monitor(uuid, ...fields?)writecreate_monitor, all optional. Only the fields passed change; the others are kept.pause_monitor(uuid)writeupdate_monitor with paused: true.resume_monitor(uuid)writeupdate_monitor with paused: false.get_status_summary()readget_monitor_uptime(from?, to?, resolution?, monitor_uuids?)readUptime percentage over the window, aggregated and per hour, day (default), week or month. from defaults to 30 days ago and to to now.
The answer is broken down per monitor, so pass every monitor in one call: one call per monitor costs about N times more against the rate limit. Omit monitor_uuids for the whole project.
get_monitor_response_time(from?, to?, resolution?, monitor_uuids?)readget_monitor_mttr(from?, to?, monitor_uuids?)readget_monitor_mtta(from?, to?, monitor_uuids?)readlist_outages(page?, search?, status?, type?)read20 per page. search matches a monitor name, URL or domain, or an INC-123 number.
status is all (default), ongoing or resolved. type is all (default), manual (declared by hand) or monitor.
get_outage(uuid)readget_outage_timeline(uuid)readoutage_ UUID or an INC-123 number.get_monitor_outages(monitor_uuid, page?, status?)readcreate_outage(description, summary?, severity?, escalation_policy_uuid?)writeDeclares an incident by hand, for a problem no monitor detects. With escalation_policy_uuid, the policy's on-call responders are paged; without one, nobody is. Nothing is published on a status page.
description is its title (255 characters at most) and summary the details for responders. severity is one of the project's severity keys (critical, major and minor by default); it defaults to the least severe, and an unknown key is refused.
acknowledge_outage(uuid)writeescalate_outage(uuid)writeresolve_outage(uuid)writeget_monitor_anomalies(uuid)readget_monitor_http_logs(uuid, page?, limit?, level?)readlevel filters on info, warn and error. limit defaults to 50, 200 at most.list_recent_alerts(from?, to?, resolution?, monitor_uuids?)readresolution defaults to day.list_on_call_schedules()readget_on_call_schedule(uuid)readsch_) with its full rotation and the escalation policies linked to it.list_escalation_policies()readget_escalation_policy(uuid)readesc_): its steps, linked schedules and contact channels.list_team_members()readlist_integrations()readget_integration(uuid)readint_) with its channel settings: channel name, webhook URL, routing.list_status_pages(page?, search?)readsearch matches the name and hostname.get_status_page(uuid)readcreate_status_page(name, subdomain, description?, website?, language?, theme?, accent_color?, sections?, show_uptime?, show_response_times?)writeCreates a page at <subdomain>.hyperping.app, public as soon as it exists. Paused monitors are refused. Password protection, SSO, a custom domain and a logo are set in the dashboard.
sections is a list of { name, services }, 20 at most, where services are monitor and component UUIDs. language defaults to en and theme to system (or light, dark). show_uptime defaults to true and show_response_times to false.
update_status_page(uuid, name?, description?, language?, website?, theme?, accent_color?, font?, calendar?, auto_refresh?, hide_from_search_engines?, subscriptions?)writeChanges only the fields passed; the rest of the page is kept. An empty description or website removes it, and language names the language of the new description, keeping the other translations.
font is one of system-ui, Lato, Manrope, Inter, Open Sans, Montserrat, Poppins, Roboto, Raleway, Nunito, Merriweather, DM Sans, Work Sans. calendar shows the incident calendar, auto_refresh reloads the page every minute for a wall screen, and subscriptions lets visitors subscribe to updates.
add_status_page_services(uuid, services, section?, show_uptime?, show_response_times?)writeremove_status_page_services(uuid, services)writelist_status_page_incidents(status_page_uuid?, status?, page?)readstatus is all (default), ongoing or resolved.get_status_page_incident(uuid)readcreate_status_page_incident(title, message, status_pages, type?, status?, affected_components?, notify_subscribers?, language?)writePublishes the incident and its first update on the pages listed. Subscribers are notified unless notify_subscribers is false. It pages nobody on call; create_outage does that.
type is incident (degraded, default) or outage (down). status is investigating (default), identified or monitoring. title takes 240 characters at most; message allows basic HTML.
add_status_page_incident_update(uuid, message, status, notify_subscribers?, language?)writePosts an update. Subscribers are notified unless notify_subscribers is false.
status is investigating, identified, update (keeps the current stage), monitoring or resolved. Any stage but resolved reopens a resolved incident.
resolve_status_page_incident(uuid, message, notify_subscribers?, language?)writeresolved update. Refuses an incident that is already resolved, so subscribers never hear it twice.update_status_page_incident(uuid, title?, language?, type?, add_status_pages?, remove_status_pages?, add_components?, remove_components?)writeedit_status_page_incident_update(uuid, update_uuid, message?, status?, language?)writelist_maintenance_windows(timeline?, page?)readupcoming, ongoing or past windows, or all of them newest first, 20 per page. Each comes with its monitors, status pages, updates and status: upcoming, inprogress or completed.get_maintenance_window(uuid)readcreate_maintenance_window(name, start_date, end_date, monitors, title?, message?, status_pages?, notify?, notify_minutes_before?, language?)writeChecks and alerts stop during the window for its monitors, components and servers. name is internal; title (defaults to name) and message are public on the status pages listed.
Dates need a timezone, for example 2026-10-04T02:00:00Z. notify is none (default), immediate or scheduled; a scheduled notice goes out notify_minutes_before the start (default 60, up to 10080).
update_maintenance_window(uuid, name?, title?, message?, start_date?, end_date?, add_monitors?, remove_monitors?, add_status_pages?, remove_status_pages?, language?)writeReschedules, renames or retargets a window, or posts a public update on it with message; earlier updates stay. Subscribers are not notified.
A scheduled subscriber notice that has not gone out keeps its lead time when the start moves. At least one monitor must remain.
complete_maintenance_window(uuid)writecancel_maintenance_window(uuid)writecomplete_maintenance_window) or already over.An incident in Incident Management and an incident on a status page are separate records, with separate tools.
Incident (outage_) | Status page incident (inci_) | |
|---|---|---|
| What it is | An internal incident, detected on a monitor or a server, or declared by hand. | A write-up published on one or more status pages. |
| Who sees it | Your team, under Incident Management in the dashboard. | Anyone who opens the status page. |
| Who is told | The on-call responders of its escalation policy. | The page's subscribers, by email, SMS, Slack and Teams. |
| Write tools | create_outage, acknowledge_outage, escalate_outage, resolve_outage | create_status_page_incident, add_status_page_incident_update, resolve_status_page_incident, update_status_page_incident, edit_status_page_incident_update |
One never creates the other: create_outage publishes nothing, and create_status_page_incident pages nobody. To page your team and tell customers, ask for both. The server's instructions to agents make the same distinction.
create_status_page_incident, add_status_page_incident_update and resolve_status_page_incident reach the page's subscribers by email, SMS, Slack and Teams unless notify_subscribers is false. create_maintenance_window notifies them only with notify: "immediate" or "scheduled"; the default is "none".create_outage with an escalation_policy_uuid and escalate_outage page responders. resolve_outage sends the recovery to the channels the incident paged.update_status_page_incident, edit_status_page_incident_update and update_maintenance_window change what the pages show without notifying subscribers. cancel_maintenance_window does not tell subscribers who already heard about the window.language (two letters, such as fr) when writing in another one. Updates default to the language of the incident title.Every tool declares MCP tool annotations. Clients such as Claude Code read them to decide which calls run freely and which ask you first. They are hints for the client: the server enforces read-only keys and project scope on its own.
true on the 28 read tools, false on the 21 write tools.false on every read tool.The 21 write tools declare these values:
| Write tool | destructiveHint | idempotentHint | openWorldHint |
|---|---|---|---|
| Monitors | |||
create_monitor | - | - | - |
update_monitor | - | ||
pause_monitor | - | - | |
resume_monitor | - | - | |
| Incidents | |||
create_outage | - | - | |
acknowledge_outage | - | - | |
escalate_outage | - | - | |
resolve_outage | - | ||
| Status pages | |||
create_status_page | - | - | |
update_status_page | |||
add_status_page_services | - | ||
remove_status_page_services | |||
| Status page incidents | |||
create_status_page_incident | - | - | |
add_status_page_incident_update | - | - | |
resolve_status_page_incident | - | ||
update_status_page_incident | |||
edit_status_page_incident_update | |||
| Maintenance | |||
create_maintenance_window | - | - | |
update_maintenance_window | - | ||
complete_maintenance_window | - | ||
cancel_maintenance_window | |||
req.projectuuid is resolved server-side from the key. Client headers cannot override.projectuuid, and where a tool goes through a dashboard controller or a status page's settings (status page incident edits, status page settings and services), it first checks the incident, update, status page, monitor and component UUIDs against the project. Cross-project access returns an error, never data, and the UUIDs an agent passes to a write tool are checked before anything is published.read_only key with a clear error. Enforced at the tool handler, not at the route, and the attempt is recorded in the audit log.hasAccountRole with the user's actual project role. viewer keys cannot invoke write-adjacent endpoints.MCP writes show up in the project's audit logs like REST writes made with an API key. Audit logs are available on the Business plan.
ApiKeyWriteAction entry with the API key as its target, as for a REST write made with that key.read_only key that calls a write tool leaves an ApiKeyPermissionDenied entry under that key.ApiKeyWriteAction entry, as on REST. The entries a resource records on its own, such as CreateMaintenance, are still written.cancel_maintenance_window, which deletes a maintenance window that has not started.create_maintenance_window schedules one window per call.Ask in plain language; the agent chains the calls. The IDs below are examples.
"Who's on call for the checkout monitor right now?"
search_monitors_by_name with query: "checkout", then get_monitor to read its escalation policy.get_escalation_policy for the linked schedule UUIDs.get_on_call_schedule for the user on call now, and list_team_members for their name and email."Payments are failing at checkout. Open a critical incident and page the payments team."
list_escalation_policies to find the policy, here esc_payments.create_outage with description: "Payments failing at checkout", severity: "critical" and escalation_policy_uuid: "esc_payments". The incident appears under Incident Management and the on-call responders are paged."I'm on it. Stop the alerts, and close the incident once payments are back."
list_outages with status: "ongoing" to find outage_payments.acknowledge_outage: repeat alerts stop. If nobody answers, escalate_outage pages the next step now.resolve_outage once the fix is out: the recovery goes to the channels that were paged. An incident detected on a monitor closes itself when checks pass again."Post on our status page that checkout is down and we're investigating."
list_status_pages to pick sp_acme, and get_status_page for the UUID of the checkout service, mon_checkout.create_status_page_incident with status_pages: ["sp_acme"], type: "outage" and affected_components: ["mon_checkout"].add_status_page_incident_update with status: "monitoring", then resolve_status_page_incident."Create a status page for Acme with an API section and a Checkout section."
list_monitors for the UUIDs, here mon_api and mon_checkout.create_status_page with name: "Acme Status", subdomain: "acme" and sections: [{ name: "API", services: ["mon_api"] }, { name: "Checkout", services: ["mon_checkout"] }]. The page goes live at acme.hyperping.app.add_status_page_services with services: ["comp_cdn"] and section: "Infrastructure" adds a section at the end."The last update on the checkout incident says 'resolvd'. Fix it without emailing everyone again."
get_status_page_incident on inci_checkout to find the update and its UUID.edit_status_page_incident_update with that update_uuid and the corrected message. The page shows the fix; subscribers are not notified again and the update keeps its date."The database upgrade needs 30 more minutes." or "Cancel Sunday's maintenance."
list_maintenance_windows with timeline: "ongoing" or "upcoming" to find mw_db_upgrade.update_maintenance_window with a later end_date, such as "2026-10-04T04:30:00Z", and message: "The work is extended by 30 minutes.". The page shows the update; subscribers are not notified.cancel_maintenance_window. To end one in progress early: complete_maintenance_window.200 monitors per page. Incidents, status pages, status page incidents and maintenance windows come 20 per page.100 UUIDs per services list and per add_* or remove_* list, and 20 sections per new status page.60 tool calls a minute and 600 an hour, plus 5 / 20 for initialize. Calls also count toward the REST API quota. Over the limit, the JSON-RPC error carries retry_after_seconds.from / to.