Uptime Globe · MCP docs

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.

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)

ToolDescriptionScopeAccess
get_monitorGet one monitor by id (full config, regions, alerting settings).monitors:readread
get_monitor_statusGet recent check results + an uptime/latency summary for one monitor. Optionally bucket by hour/day over a window.monitors:readread
list_monitorsList all monitors in the account, with their type, config, regions, and latest up/down status.monitors:readread
create_monitorCreate 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:writewrite
delete_monitorDelete (soft-delete) a monitor. Closes its open incidents and stops checks.monitors:writewrite destructive
pause_monitorPause a monitor (stops checks; closes any open incident).monitors:writewrite
regenerate_heartbeat_tokenRegenerate a heartbeat monitor’s ingest token. Invalidates the old token — any client still posting to the old URL will stop being counted.monitors:writewrite destructive
resume_monitorResume a paused monitor (re-enables checks).monitors:writewrite
update_monitorUpdate 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:writewrite

Incidents (2 read / 6 write)

ToolDescriptionScopeAccess
get_incidentGet one incident by id, including its timeline of updates.incidents:readread
list_incidentsList incidents, optionally filtered by status (open/resolved/all), monitor, or start-time window.incidents:readread
acknowledge_incidentAcknowledge 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:writewrite
delete_incident_updateDelete an incident timeline update.incidents:writewrite destructive
edit_incident_updateEdit the body text of an existing incident timeline update.incidents:writewrite
post_incident_updateAppend 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:writewrite
resolve_incidentResolve an incident now, or reopen it. Pass {id} to resolve; pass {id, reopen:true} to reopen a resolved incident.incidents:writewrite
update_incidentUpdate 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:writewrite

Channels (2 read / 3 write)

ToolDescriptionScopeAccess
get_channelGet one notification channel by id (secret fields redacted).channels:readread
list_channelsList notification channels (Slack, email, webhook, PagerDuty, etc.). Secret fields are redacted.channels:readread
create_channelCreate 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:writewrite
delete_channelPermanently delete a channel. This is a HARD delete and CASCADE-deletes every notification rule that uses this channel.channels:writewrite destructive
update_channelUpdate 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:writewrite

Notification rules (2 read / 3 write)

ToolDescriptionScopeAccess
get_notification_ruleGet one notification rule by id.notification_rules:readread
list_notification_rulesList notification rules (which channels fire for which monitors/tags on open/recovery/flap).notification_rules:readread
create_notification_ruleCreate 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:writewrite
delete_notification_ruleDelete a notification rule.notification_rules:writewrite destructive
update_notification_ruleUpdate a notification rule (scope, channel, on_* flags, renotify cadence). monitor_id and tag_filter remain mutually exclusive.notification_rules:writewrite

Maintenance windows (2 read / 3 write)

ToolDescriptionScopeAccess
get_maintenance_windowGet one maintenance window by id.maintenance_windows:readread
list_maintenance_windowsList maintenance windows, optionally filtered by lifecycle.maintenance_windows:readread
create_maintenance_windowCreate 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:writewrite
delete_maintenance_windowDelete a maintenance window.maintenance_windows:writewrite destructive
update_maintenance_windowUpdate a maintenance window (scope, time range, RRULE, note). ends_at must remain >= starts_at; monitor_id and tag_filter stay mutually exclusive.maintenance_windows:writewrite

Status pages (3 read / 5 write)

ToolDescriptionScopeAccess
get_status_pageGet one status page by id, including its bound monitors.status_pages:readread
list_status_page_subscribersList the email subscribers of a status page.status_pages:readread
list_status_pagesList the account’s status pages.status_pages:readread
create_status_pageCreate 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:writewrite
delete_status_pageDelete a status page.status_pages:writewrite destructive
delete_status_page_subscriberRemove an email subscriber from a status page.status_pages:writewrite destructive
set_status_page_monitorsReplace 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:writewrite
update_status_pageUpdate 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:writewrite