Skip to content
Docs/Connect Claude

Agents on call

Connect Claude

Add UpButler to Claude and it can set up monitoring, run your status page and work incidents from the conversation. You sign in once in the browser and choose what it may do. There is no API key to copy.

Pick your client

The server URL is the same everywhere: https://upbutler.com/mcp. Each client opens UpButler's consent screen in your browser the first time it connects.

Claude Code

Terminal
claude mcp add --transport http upbutler "https://upbutler.com/mcp?toolset=core"

?toolset=core is the recommended setup for Claude Code: it lists the 35 tools you need day to day instead of all 234, so the tool list takes a fraction of the context. Leave it out to get every tool (see Toolsets).

Then run /mcp inside Claude Code, select upbutler and choose Authenticate. Try: “set up monitoring for this repo” or “what's down right now?”

Prefer a guided setup? The plugin adds the server, a skill and slash commands in one install.

Claude Desktop and claude.ai

  1. Open Settings → Connectors and choose Add custom connector.
  2. Name it UpButler and paste https://upbutler.com/mcp. Leave the advanced OAuth client fields empty: Claude registers itself.
  3. Click Connect, pick a workspace and the access level on the consent screen.

Connectors sync across Claude Desktop, the web app and mobile. On Team and Enterprise plans an organization owner adds the connector once, then each member connects their own account.

Cursor

Add to Cursor

Or add it to .cursor/mcp.json (project) or ~/.cursor/mcp.json (global), then click Needs login next to the server in Cursor's MCP settings:

.cursor/mcp.json
{
  "mcpServers": {
    "upbutler": {
      "url": "https://upbutler.com/mcp"
    }
  }
}

VS Code

Add to VS Code

code --add-mcp '{"name":"upbutler","type":"http","url":"https://upbutler.com/mcp"}'

Any other MCP client

Anything that speaks Streamable HTTP and the MCP authorization spec works with just the URL. Clients without OAuth can send an API key as a Bearer header instead.

{
  "mcpServers": {
    "upbutler": {
      "type": "http",
      "url": "https://upbutler.com/mcp"
    }
  }
}

The consent screen shows the app's name, where it will send you back to, and asks two things:

  • Workspace. A connection is tied to one workspace. Connect again to add another.
  • Access. Untick what the app shouldn't do.
ScopeAllows
readAlways on. Monitors, checks, incidents, status pages, deploys, members, events.
incidentsAcknowledge, update and resolve incidents, schedule maintenance, postmortems and templates. Nothing else can be changed.
writeEverything a tool can change: monitors, status pages, components, alert channels, on-call. Includes incidents.

A connection never gets more than your own role allows, and it can't create or revoke API keys. Tools the connection may not call are left out of its tool list, so a read-only Claude doesn't try to write. Calling one anyway returns a forbidden error that names the missing scope.

See and disconnect apps under Settings → Connect Claude (/app/settings/connect). Disconnecting takes effect immediately. Connecting and disconnecting are recorded in the audit log as connection.created and connection.revoked, and everything the app does is attributed to it in incident timelines.

Prompts

The server ships 5 prompts. Claude clients list them as slash commands (in Claude Code: /mcp__upbutler__setup-monitoring).

PromptArgumentsDoes
triage-incidentincident?Gather evidence for an open incident, acknowledge it and draft an honest update.
setup-monitoringtarget, statusPage?Put a URL or a whole repo under monitoring, with a status page and heartbeats for background jobs.
weekly-reliability-reviewdays?Uptime, incidents, flaky monitors and follow-ups for the last week.
deploy-guardversion?, service?Check it is safe to ship, record the deploy, verify afterwards.
write-postmortemincident?Turn a resolved incident into a blameless postmortem.

Resources

Read-only context Claude can attach to a conversation (type @ in Claude Code):

URIContent
upbutler://workspace/overviewWorkspace, plan and usage, monitors that are not healthy, open incidents and status pages in one read.
upbutler://monitorsEvery monitor with its current state.
upbutler://incidents/openIncidents and maintenance that are not resolved yet.
upbutler://status-pagesStatus pages of the workspace with their public URLs.
upbutler://guideShort field guide for agents: the main flows and the tools behind them.
upbutler://monitors/{id}One monitor with recent checks and stats.
upbutler://incidents/{id}One incident with its timeline and AI reports.
upbutler://status/{slug}Public status of any UpButler status page, by slug.

All 234 tools are listed in the MCP reference.

Toolsets

Every connected session loads the server's tool list, so a shorter list leaves more room for your work. Add ?toolset=core to the URL (it works on /mcp and /mcp/public, with OAuth or an API key) to list only the essentials. ?toolset=all, or no parameter, lists everything. Prompts and resources are the same in both.

core (35)agent_bootstrap, services_add, heartbeat_ping, components_push, agent_whoami, monitors_list, monitors_create, monitors_get, monitors_update, monitors_check, monitors_checks, pages_list, pages_get, pages_push, incidents_list, incidents_get, incidents_create, incidents_update, incidents_resolve, public_status, workspace_get, events_list, incidents_ack, deploys_create, responder_wait_for_page, incidents_packet, incidents_claim, incidents_claim_renew, incidents_note, incidents_verify, incidents_escalate, deploys_guard, runs_list, runs_stop, setup_apply
all (234)Everything in the MCP reference: status page editing, alert channels, on-call, postmortems, imports, billing and more.

Access is the same either way: the toolset only changes what is listed, and scopes still decide what a connection may do.

Claude Code plugin

The plugin bundles the MCP server, a skill that teaches Claude the UpButler workflows, and four commands:

Terminal
claude plugin marketplace add upbutler/upbutler
claude plugin install upbutler@upbutler
CommandDoes
/upbutler:statusWhat's down or degraded, open incidents, upcoming maintenance.
/upbutler:incident [text | id]Triage what's open, work one incident, or report a new one.
/upbutler:monitor <url>Put a URL under monitoring and on a status page, then run the first check.
/upbutler:deploy [version]Deploy guard: check, record the deploy, verify afterwards.

After installing, run /mcp and authenticate once, as above.

Hooks: monitoring that stays current

The plugin also installs Claude Code hooks, so Claude knows the state of production and notices new things to monitor without being asked. They only read and suggest: anything that changes UpButler still goes through the MCP tools, with the access you approved.

WhenWhat Claude is told
Session startThree lines at most: how many monitors are up or failing, open incidents, and the verdict of the last deploy guard.
A file is writtenWhen the change adds an HTTP route (Next.js, Express, Hono, Fastify, FastAPI, Flask, Rails, Astro, SvelteKit, Nitro) or a scheduled job (vercel.json crons, GitHub Actions schedule, crontab files, node-cron, Celery beat, Kubernetes CronJob, pg_cron) that has no monitor: a short note with the services_add call that registers it.
git pushAfter a push to the default branch: whether a deploy hook will guard the deploy by itself, or the deploys_guard call to make once it is live.
Session endOne reminder, once, if routes or jobs added in the session are still unmonitored.

The hooks are small scripts that run on your machine and need their own credential, because the MCP sign-in is not available to them: UPBUTLER_API_KEY in the environment, the plugin's optional API key setting, or the login saved by upbutler login. A read-only key is enough. Without one they still point out new routes and jobs, but cannot tell which are already monitored, and the session-start summary is skipped. They stay silent when UpButler cannot be reached within two seconds, and the monitor list is fetched at most once every five minutes. Set UPBUTLER_HOOKS=off to turn them off.

No account yet

An agent can start without a human. The keyless endpoint https://upbutler.com/mcp/public never asks for credentials: it serves the public status tools and agent_bootstrap, which creates a workspace. From then on the same MCP session is connected to that workspace, so the agent keeps calling tools without reconfiguring anything.

Terminal
claude mcp add --transport http upbutler https://upbutler.com/mcp/public

The bootstrap result contains a claimUrl for you and an API key. Once you have claimed the workspace, switch the client to https://upbutler.com/mcp and sign in. Details in Quickstart for agents.

Public tools need no session at all
curl -s -X POST https://upbutler.com/mcp/public -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"public_status","arguments":{"slug":"acme"}}}'

How the sign-in works

UpButler implements the MCP authorization spec: OAuth 2.1 with PKCE, and UpButler is its own authorization server.

# 1. No token: the server says where to authenticate
curl -si -X POST https://upbutler.com/mcp -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize"}' | grep -i www-authenticate
# WWW-Authenticate: Bearer resource_metadata="https://upbutler.com/.well-known/oauth-protected-resource/mcp", scope="read write incidents"

# 2. Protected resource metadata → authorization server
curl -s https://upbutler.com/.well-known/oauth-protected-resource/mcp

# 3. Authorization server metadata → endpoints
curl -s https://upbutler.com/.well-known/oauth-authorization-server
TransportStreamable HTTP, JSON responses. Protocol versions 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05
Client registrationDynamic client registration (RFC 7591) at /oauth/register, or a Client ID Metadata Document URL as client_id
Authorization/oauth/authorize: code flow only, PKCE S256 required, state echoed when sent, iss returned (RFC 9207)
Redirect URIsExact match with a registered URI. https, http on localhost / 127.0.0.1 (any port), or an app scheme such as cursor://
Tokens/oauth/token. Access tokens last 1 hour. Refresh tokens rotate on every use. For 30 seconds the previous one returns the same new pair (two processes refreshing at once); after that, reusing an old one revokes the connection
Revocation/oauth/revoke (RFC 7009), or Settings → Connect Claude
AudienceTokens are issued for https://upbutler.com/mcp only (RFC 8707) and are not accepted by the REST API
StorageTokens, codes and client secrets are stored as SHA-256 hashes (plus an encrypted copy of a fresh pair for the 30-second refresh window). Authorization codes are single use and expire after 2 minutes

Troubleshooting

  • “Needs authentication” keeps coming back. Refresh tokens are single use. Two processes refreshing at the same moment are fine, but a copy of the login that comes back with an old refresh token later revokes the connection. Authenticate again.
  • Claude says a tool doesn't exist. You connected with ?toolset=core and the tool is outside it. Add the server again without the parameter.
  • A tool is missing. The connection was approved without write or incidents. Disconnect it in settings and connect again with more access.
  • “This app is not registered”. Registrations that go unused for 90 days are removed. Remove the server in your client and add it again.
  • Workspace missing on the consent screen. It requires two-factor authentication and your account doesn't have it yet. Turn it on under Settings → Security.
  • Scripts and CI. Use an API key: OAuth connections are meant for a person at a client.