Skip to content
Docs/MCP server

Agents & API

MCP server

UpButler runs a remote MCP server. All 94 tools map one-to-one to REST operations, so your coding agent can monitor services, run status pages and handle incidents from the conversation.

Connect

Endpointhttps://upbutler.com/mcp
TransportStreamable HTTP (JSON-RPC 2.0 over POST, JSON responses, no SSE stream needed)
AuthAuthorization: Bearer ub_live_…, the same API key as REST
Protocol2025-06-18 (echoes the client's requested version)
claude mcp add --transport http upbutler https://upbutler.com/mcp \
  --header "Authorization: Bearer ub_live_..."

No key yet? Connect without the header and call agent_bootstrap. It returns a key, and you reconnect with it. People create keys in the dashboard under /app/settings/api-keys. Agents can mint their own with keys_create and an agent name, so incident timelines show which agent acted.

Server instructions

On initialize, the server gives your model this primer:

UpButler monitors services and runs status pages. Typical flows:
- Start monitoring + publish: services_add {name, url, statusPage}.
- Your own jobs: services_add with periodSec to get a heartbeat URL, then call it after each run.
- Report problems you detect: incidents_create; post progress with incidents_update; finish with incidents_resolve.
- React to other services: public_subscribe with a webhook URL, or poll events_list with after=<last id>.
- Many components at once: pages_push {pageId, statuses:{key: status}}.
No API key yet? Call agent_bootstrap to get one, then reconnect with Authorization: Bearer <key>.

Public tools (no key)

These tools work without authentication, so an agent can read any public UpButler status page and subscribe to it:

  • agent_bootstrap: Create a workspace + API key with no human in the loop
  • heartbeat_ping: Send a heartbeat (no API key needed — the token is the secret)
  • components_push: Push one component status by its push token (no API key needed)
  • public_status: Public status of a page (no auth)
  • public_incidents: Public incident history of a page
  • public_incident: One public incident with its updates
  • public_subscribe: Subscribe to a status page (email, webhook, Slack or Discord)
  • public_subscriber_get: View a subscription (requires its manage token)
  • public_subscriber_update: Change which components a subscription follows (requires the manage token)
  • public_unsubscribe: Unsubscribe (requires the manage token)
  • public_responseTimes: Public response-time series of a component (p50/p95)
  • plans_list: Available plans and limits

Every other tool needs a key. Write tools need the write scope.

Tools

Generated from the server's operation registry. Arguments are the same as the REST endpoint's path, query and body fields, merged into one object, and each tool advertises its full JSON Schema in tools/list. Tool annotations mark GET tools readOnlyHint and DELETE tools destructiveHint.

Agents

ToolDoesKindAuth
agent_bootstrapCreate a workspace + API key with no human in the loopwritePublic — no key
services_addPlug in a service: monitor + status page component in one callwriteAPI key · write
heartbeat_pingSend a heartbeat (no API key needed — the token is the secret)writePublic — no key
components_pushPush one component status by its push token (no API key needed)writePublic — no key
agent_whoamiIdentify the calling keyreadAPI key · read

Monitors

ToolDoesKindAuth
monitors_listList monitorsreadAPI key · read
monitors_createCreate a monitorwriteAPI key · write
monitors_getGet a monitor with recent checks and statsreadAPI key · read
monitors_updateUpdate a monitorwriteAPI key · write
monitors_deleteDelete a monitor and its historydeleteAPI key · write
monitors_checkRun a check right nowwriteAPI key · write
monitors_checksList checks (raw results, 30 days)readAPI key · read
checks_getGet one check with full evidencereadAPI key · read
regions_listList check regions and probe healthreadAPI key · read
monitors_regionsPer-region latency and failures for a monitorreadAPI key · read

Status pages

ToolDoesKindAuth
pages_listList status pagesreadAPI key · read
pages_createCreate a status pagewriteAPI key · write
pages_getGet a status page with componentsreadAPI key · read
pages_updateUpdate page settings, theme, branding or domainwriteAPI key · write
pages_deleteDelete a status page, its components and subscribersdeleteAPI key · write
pages_verifyDomainCheck the custom domain DNS nowwriteAPI key · write
pages_previewGet the rendered public status data (as visitors see it)readAPI key · read
pages_groupsReplace the ordered list of component groupswriteAPI key · write
pages_subscribersList subscribers of a status pagereadAPI key · read
subscribers_deleteRemove a subscriberdeleteAPI key · write

Components

ToolDoesKindAuth
components_createAdd a component to a status pagewriteAPI key · write
components_updateUpdate a component (name, group, source, visibility)writeAPI key · write
components_deleteDelete a componentdeleteAPI key · write
components_overrideManually set (or clear) a component statuswriteAPI key · write
pages_pushPush statuses for many components at oncewriteAPI key · write

Incidents

ToolDoesKindAuth
incidents_listList incidents and maintenancereadAPI key · read
incidents_getGet an incident with its timeline and AI reportsreadAPI key · read
incidents_createReport an incidentwriteAPI key · write
incidents_updatePost an incident updatewriteAPI key · write
incidents_resolveResolve an incidentwriteAPI key · write
incidents_analyzeGenerate (or regenerate) the AI report for an incidentwriteAPI key · write
maintenance_createSchedule maintenancewriteAPI key · write
incidents_ackAcknowledge an incident or a down monitorwriteAPI key · write
incidents_unackRemove an acknowledgementwriteAPI key · write
incidents_postmortemDraft a postmortem with AIwriteAPI key · write
incidents_postmortem_getGet an incident's postmortemreadAPI key · read
incidents_postmortem_saveSave an edited postmortem (new version)writeAPI key · write
incidents_postmortem_publishPublish a post-incident report to status pageswriteAPI key · write
templates_listList incident templatesreadAPI key · read
templates_createCreate an incident templatewriteAPI key · write
templates_updateUpdate an incident templatewriteAPI key · write
templates_deleteDelete an incident templatedeleteAPI key · write
templates_renderFill in a templatewriteAPI key · read

Alerts

ToolDoesKindAuth
channels_listList alert channelsreadAPI key · read
channels_createCreate an alert channelwriteAPI key · write
channels_updateUpdate an alert channelwriteAPI key · write
channels_deleteDelete an alert channeldeleteAPI key · write
channels_testSend a test notificationwriteAPI key · write

Public status

ToolDoesKindAuth
public_statusPublic status of a page (no auth)readPublic — no key
public_incidentsPublic incident history of a pagereadPublic — no key
public_incidentOne public incident with its updatesreadPublic — no key
public_subscribeSubscribe to a status page (email, webhook, Slack or Discord)writePublic — no key
public_subscriber_getView a subscription (requires its manage token)readPublic — no key
public_subscriber_updateChange which components a subscription follows (requires the manage token)writePublic — no key
public_unsubscribeUnsubscribe (requires the manage token)deletePublic — no key
public_responseTimesPublic response-time series of a component (p50/p95)readPublic — no key

Workspace

ToolDoesKindAuth
workspace_getCurrent workspace, plan, limits and usagereadAPI key · read
workspace_updateRename the workspacewriteAPI key · write
members_listList workspace members and pending invitesreadAPI key · read
keys_listList API keysreadAPI key · read
keys_createCreate an API keywriteAPI key · write
keys_revokeRevoke an API keydeleteAPI key · write
audit_listAudit log: sign-ins, 2FA changes, keys, members, billing, deletions, domainsreadAPI key · read

Events

ToolDoesKindAuth
events_listPoll the event streamreadAPI key · read

Billing

ToolDoesKindAuth
plans_listAvailable plans and limitsreadPublic — no key
billing_checkoutStart a checkout to upgrade the workspacewriteAPI key · write

Import

ToolDoesKindAuth
import_previewDry run: what an import would createwriteAPI key · write
import_applyRun an import (background job)writeAPI key · write
import_statusProgress and result of an import jobreadAPI key · read
import_jobsRecent import jobsreadAPI key · read

On-call

ToolDoesKindAuth
oncall_currentWho is on call right nowreadAPI key · read
oncall_schedules_listList on-call schedulesreadAPI key · read
oncall_schedules_getGet a schedule with upcoming shiftsreadAPI key · read
oncall_schedules_createCreate a weekly on-call rotation (Business plan)writeAPI key · write
oncall_schedules_updateUpdate a schedulewriteAPI key · write
oncall_schedules_deleteDelete a scheduledeleteAPI key · write
oncall_overrides_createPut someone on call for a period (override)writeAPI key · write
oncall_overrides_deleteRemove an overridedeleteAPI key · write
oncall_membersMembers with their paging contact statusreadAPI key · read
escalation_listList escalation policiesreadAPI key · read
escalation_createCreate an escalation policy (Business plan)writeAPI key · write
escalation_updateUpdate an escalation policywriteAPI key · write
escalation_deleteDelete an escalation policydeleteAPI key · write

Deploys

ToolDoesKindAuth
deploys_createRecord a deploywriteAPI key · write
deploys_listList deploysreadAPI key · read
deploys_deleteDelete a deploy markerdeleteAPI key · write

Digest

ToolDoesKindAuth
digest_settingsWeekly digest settingsreadAPI key · read
digest_settings_updateChange the workspace timezone or your weekly digest opt-inwriteAPI key · write
digest_previewBuild the weekly digest on demandwriteAPI key · read

Not exposed as tools: workspaces.list, workspaces.create, workspaces.switch, members.invite, members.revokeInvite, members.remove, billing.portal, profile.contact.get, profile.contact.update, me.security, me.sessions.revoke, me.sessions.revokeOthers, me.2fa.setup, me.2fa.enable, me.2fa.disable, me.2fa.recoveryCodes, me.identities.unlink, workspace.security.update. These are dashboard or REST-only operations.

Results and errors

A successful call returns the REST response twice: as structuredContent, and as pretty-printed JSON in a text content block. A failing call returns isError: true with the standard error envelope, including hint, as text. That makes errors easy for a model to act on.

Talk to it with curl

# List tools (works without a key)
curl -s -X POST https://upbutler.com/mcp \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}'

# Call a tool
curl -s -X POST https://upbutler.com/mcp \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $UPBUTLER_API_KEY" \
  -d '{
    "jsonrpc": "2.0", "id": 2, "method": "tools/call",
    "params": { "name": "services_add", "arguments": { "name": "Search API", "url": "https://api.example.com/health", "statusPage": "acme" } }
  }'

GET https://upbutler.com/mcp returns a small JSON description of the endpoint. Batched JSON-RPC requests are supported. Sessions aren't required: every request is authenticated on its own.