Drive your monitoring from an AI agent
Uptime Globe exposes a remote Model Context Protocol server so your AI client (Claude Code, Claude Desktop, claude.ai, Cursor, …) can read and manage your monitors, incidents, channels, rules, maintenance windows, and status pages.
- Endpoint
https://mcp.uptimeglobe.com - TransportStreamable HTTP · JSON-RPC 2.0 (protocol
2025-06-18) - Auth
Authorization: Bearer sk_live_…(a scoped API key) - PlanAvailable on any paid plan
Connect your client
Two ways to authenticate: one-click OAuth (sign in + approve in your browser — best for desktop/web clients), or a scoped API key as a Bearer header (best for CLI/headless). Both require a paid plan.
One-click OAuth (claude.ai, Claude Desktop, OAuth-capable clients)
Add a custom connector pointing at https://mcp.uptimeglobe.com — leave the auth blank. The client discovers the authorization server, registers itself, and opens a browser where you sign in to Uptime Globe and approve the requested permissions. No key to copy or paste. OAuth connections act as you, so they can do real-user actions like acknowledge_incident that API keys can’t.
Claude Code (CLI) — with a scoped key
claude mcp add --transport http uptimeglobe https://mcp.uptimeglobe.com --header "Authorization: Bearer sk_live_YOUR_KEY"
Cursor & other HTTP MCP clients
Point any Streamable-HTTP MCP client at the endpoint with a Bearer header. The exact config shape varies by client; a common form is:
{
"mcpServers": {
"uptimeglobe": {
"url": "https://mcp.uptimeglobe.com",
"headers": { "Authorization": "Bearer sk_live_YOUR_KEY" }
}
}
}
stdio-only clients (mcp-remote bridge)
If your client only speaks stdio, bridge it to the remote server with mcp-remote:
npx mcp-remote https://mcp.uptimeglobe.com --header "Authorization: Bearer sk_live_YOUR_KEY"
Authentication & scopes
OAuth (OAuth 2.1 + PKCE) is the one-click path: the client registers dynamically, you sign in and consent in the browser, and a short-lived token (auto-refreshed) is issued bound to your user + workspace. You grant scopes on the consent screen, capped by your role. OAuth connections can perform real-user actions (e.g. acknowledging an incident) that API keys cannot.
Or authenticate with a scoped API key. Create one in the dashboard under Settings → API keys, choose exactly the permissions the agent needs, and pass it as a Bearer token. The key is shown only once at creation — copy it immediately; it can't be retrieved later (only revoked). Each key belongs to one tenant (workspace).
MCP access requires a paid plan. A free-plan key authenticates but is rejected at the MCP server with plan_upgrade_required.
Scopes are per-resource × {read, write} across the six resources below. Billing, members, and API-key management are never grantable to a key. A read-only key cannot even see the write tools; the API re-checks every call. Secret fields (Slack tokens, webhooks, …) are always redacted to *** on read.
Tool reference
40 tools total. Each tools/call is forwarded to the Uptime Globe API and enforced against the key's scopes; a key only ever sees the tools its scopes allow.
Monitors (3 read / 6 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_monitor | Get one monitor by id (full config, regions, alerting settings). | monitors:read | read |
get_monitor_status | Get recent check results + an uptime/latency summary for one monitor. Optionally bucket by hour/day over a window. | monitors:read | read |
list_monitors | List all monitors in the account, with their type, config, regions, and latest up/down status. | monitors:read | read |
create_monitor | Create a monitor. `type` selects the config shape (http/tcp/dns/tls/browser/browser_multi/heartbeat/mcp). Notes the schema cannot express: regions_required_to_alert must be <= regions.length; TLS monitors require a 1h/6h/12h/24h interval and broad (non-city) regions only; http json_query needs `value` for eq/neq/contains/gt/lt. The api validates and returns a 422 describing any violation. | monitors:write | write |
delete_monitor | Delete (soft-delete) a monitor. Closes its open incidents and stops checks. | monitors:write | write destructive |
pause_monitor | Pause a monitor (stops checks; closes any open incident). | monitors:write | write |
regenerate_heartbeat_token | Regenerate a heartbeat monitor’s ingest token. Invalidates the old token — any client still posting to the old URL will stop being counted. | monitors:write | write destructive |
resume_monitor | Resume a paused monitor (re-enables checks). | monitors:write | write |
update_monitor | Update a monitor. All fields optional; `type` cannot change (delete + recreate instead). To change `config`, pass the FULL config object matching the monitor's existing type — call get_monitor first to see the current shape. | monitors:write | write |
Incidents (2 read / 6 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_incident | Get one incident by id, including its timeline of updates. | incidents:read | read |
list_incidents | List incidents, optionally filtered by status (open/resolved/all), monitor, or start-time window. | incidents:read | read |
acknowledge_incident | Acknowledge an incident as the signed-in user (or clear the acknowledgement with {id, unacknowledge:true}). Requires an OAuth (user) connection — not available to API-key connections. | incidents:write | write |
delete_incident_update | Delete an incident timeline update. | incidents:write | write destructive |
edit_incident_update | Edit the body text of an existing incident timeline update. | incidents:write | write |
post_incident_update | Append a public timeline update to an incident (status + body). Posting a status of "resolved" only adds a note — it does NOT close the incident; use resolve_incident for that. | incidents:write | write |
resolve_incident | Resolve an incident now, or reopen it. Pass {id} to resolve; pass {id, reopen:true} to reopen a resolved incident. | incidents:write | write |
update_incident | Update an incident’s metadata: severity, postmortem, or assignee. To resolve/reopen an incident use resolve_incident instead. (Acknowledging is not available to API keys.) | incidents:write | write |
Channels (2 read / 3 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_channel | Get one notification channel by id (secret fields redacted). | channels:read | read |
list_channels | List notification channels (Slack, email, webhook, PagerDuty, etc.). Secret fields are redacted. | channels:read | read |
create_channel | Create a notification channel. `type` selects the config shape (email/slack/discord/teams/telegram/webhook/pagerduty/opsgenie/pushover/sms/voice/mattermost/gchat). Some types have cross-field rules the schema cannot show (e.g. Slack needs a webhook_url; sms/voice need a Twilio integration_id) — the api validates and returns a 422 describing any violation. | channels:write | write |
delete_channel | Permanently delete a channel. This is a HARD delete and CASCADE-deletes every notification rule that uses this channel. | channels:write | write destructive |
update_channel | Update a channel’s name and/or config. To change config, pass the FULL config object matching the channel’s type (call list_channels first). Secret fields you supply replace the stored value; pass "***" to keep the existing secret. | channels:write | write |
Notification rules (2 read / 3 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_notification_rule | Get one notification rule by id. | notification_rules:read | read |
list_notification_rules | List notification rules (which channels fire for which monitors/tags on open/recovery/flap). | notification_rules:read | read |
create_notification_rule | Create a notification rule: which channel fires for which scope (a monitor, a tag, or — if neither — all monitors) on open/recovery/flap, with an optional per-rule renotify cadence. monitor_id and tag_filter are mutually exclusive (the api 422s if both are set). | notification_rules:write | write |
delete_notification_rule | Delete a notification rule. | notification_rules:write | write destructive |
update_notification_rule | Update a notification rule (scope, channel, on_* flags, renotify cadence). monitor_id and tag_filter remain mutually exclusive. | notification_rules:write | write |
Maintenance windows (2 read / 3 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_maintenance_window | Get one maintenance window by id. | maintenance_windows:read | read |
list_maintenance_windows | List maintenance windows, optionally filtered by lifecycle. | maintenance_windows:read | read |
create_maintenance_window | Create a maintenance window that suppresses alerts for a monitor OR a tag (not both) over a time range; optionally recurring via an RRULE (FREQ=DAILY/WEEKLY/MONTHLY with INTERVAL/BYDAY/BYMONTHDAY/UNTIL/COUNT). starts_at/ends_at are epoch-ms; ends_at must be >= starts_at. | maintenance_windows:write | write |
delete_maintenance_window | Delete a maintenance window. | maintenance_windows:write | write destructive |
update_maintenance_window | Update a maintenance window (scope, time range, RRULE, note). ends_at must remain >= starts_at; monitor_id and tag_filter stay mutually exclusive. | maintenance_windows:write | write |
Status pages (3 read / 5 write)
| Tool | Description | Scope | Access |
|---|---|---|---|
get_status_page | Get one status page by id, including its bound monitors. | status_pages:read | read |
list_status_page_subscribers | List the email subscribers of a status page. | status_pages:read | read |
list_status_pages | List the account’s status pages. | status_pages:read | read |
create_status_page | Create a public status page bound to a primary monitor (its host derives the slug). A slug collision returns 409 (you may pass accept_fallback:true, or delete the conflicting page and recreate). custom_domain is Pro+ only. | status_pages:write | write |
delete_status_page | Delete a status page. | status_pages:write | write destructive |
delete_status_page_subscriber | Remove an email subscriber from a status page. | status_pages:write | write destructive |
set_status_page_monitors | Replace the full set of monitors shown on a status page (with optional display name, group, and sort order per monitor). This is a FULL replace — monitors not in the list are unbound. | status_pages:write | write |
update_status_page | Update a status page (title, branding, visibility, custom_domain, or primary monitor — changing the primary monitor re-derives the slug and re-runs the collision flow). | status_pages:write | write |