Docs · Model Context Protocol

Your agent, plugged in.

Quietbeat ships a first-party MCP server — read and write. Ask your agent what's down, or let it wire a dead-man switch for the cron job it just wrote. Two minutes to connect.

Mint a token

Account → API — mint a token named after the machine ("laptop", "ci"). It's shown once; treat it like a password. Revoking it cuts the agent off instantly.

Pick your agent

Claude Code · terminal · anthropic

one command
claude mcp add --transport http quietbeat https://quietbeat.dev/mcp --header "Authorization: Bearer qb_YOUR_TOKEN"

verify with `claude mcp list` · remove with `claude mcp remove quietbeat`

per-project (.mcp.json, commit-safe via env var)
{
  "mcpServers": {
    "quietbeat": {
      "type": "http",
      "url": "https://quietbeat.dev/mcp",
      "headers": { "Authorization": "Bearer ${QUIETBEAT_TOKEN}" }
    }
  }
}

OpenAI Codex · terminal · openai

~/.codex/config.toml
[mcp_servers.quietbeat]
url = "https://quietbeat.dev/mcp"
bearer_token_env_var = "QUIETBEAT_TOKEN"

export QUIETBEAT_TOKEN=qb_YOUR_TOKEN in your shell profile — the token never lands in the config file

stdio alternative (one command)
codex mcp add quietbeat -- npx -y mcp-remote https://quietbeat.dev/mcp --header "Authorization: Bearer qb_YOUR_TOKEN"

Gemini CLI · terminal · google

one command
gemini mcp add --transport http quietbeat https://quietbeat.dev/mcp --header "Authorization: Bearer qb_YOUR_TOKEN"
~/.gemini/settings.json
{
  "mcpServers": {
    "quietbeat": {
      "httpUrl": "https://quietbeat.dev/mcp",
      "headers": { "Authorization": "Bearer qb_YOUR_TOKEN" }
    }
  }
}

httpUrl (not url) selects streamable HTTP transport

Cursor · ide

~/.cursor/mcp.json
{
  "mcpServers": {
    "quietbeat": {
      "url": "https://quietbeat.dev/mcp",
      "headers": { "Authorization": "Bearer qb_YOUR_TOKEN" }
    }
  }
}

VS Code · copilot agent mode

.vscode/mcp.json (prompts for the token, stores it as a secret)
{
  "inputs": [
    {
      "type": "promptString",
      "id": "quietbeat-token",
      "description": "Quietbeat API token",
      "password": true
    }
  ],
  "servers": {
    "quietbeat": {
      "type": "http",
      "url": "https://quietbeat.dev/mcp",
      "headers": { "Authorization": "Bearer ${input:quietbeat-token}" }
    }
  }
}

Windsurf · ide · codeium

~/.codeium/windsurf/mcp_config.json (via mcp-remote bridge)
{
  "mcpServers": {
    "quietbeat": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote", "https://quietbeat.dev/mcp",
        "--header", "Authorization: Bearer qb_YOUR_TOKEN"
      ]
    }
  }
}

Anything else · any mcp client

stdio bridge (works everywhere)
npx mcp-remote https://quietbeat.dev/mcp --header "Authorization: Bearer qb_YOUR_TOKEN"

Say things like

  • "Is anything flat right now?"
  • "You just wrote that backup script — create a heartbeat monitor for it (hourly) and append the ping to the crontab line."
  • "Which monitors had incidents this week, and how long were they down?"
  • "Pause the staging monitors while I deploy."

The toolbox

Tool What it does
get_status_summary One glance at the workspace: monitor counts by status, what is down right now, and a plain-language summary.
list_monitors List monitors. Compact rows by default (id, name, kind, status, group, url) — on a large account start here with a status filter instead of asking for everything. Pass full: true only when you need whole configs.
get_monitor Full detail for one monitor: config, status, uptime (honest observed span), response-time stats (24h), recent incidents, and for heartbeats the masked ping address (ping_url_masked) — the full ping URL is shown once, by create_monitor.
get_incident_evidence The black box for one incident: forensics captured at the moment of failure (response snapshot, DNS, TLS, response-time trend — or last beats and payload for heartbeats), plus the monitor's runbook. Start here when investigating.
list_incidents Recent incidents across all monitors (last 14 days, ongoing first). Filter by state or monitor to keep the result small.
get_diagnosis The saved AI investigation for an incident — verdict class, hypothesis, confidence, suspect ref, and what to check next. Read-only; a missing diagnosis is stated, not invented.
trigger_check Run one probe right now instead of waiting for the next scheduled slot — use inside an investigation to confirm a fix landed. Not for heartbeat, paused, or relay-checked monitors.
ack_incident Acknowledge an ongoing incident — "I'm on it". Stops the escalation ladder from climbing; the first ack wins and is idempotent.
post_incident_update Post a human-readable note on an incident's timeline. CAUTION: the note is public on every status page the monitor is on, or is later added to, and while it is on one the note is emailed to confirmed subscribers — confirm the wording with the user before posting. status "resolved" on an open incident resolves it, even while the check is still failing. Owners and admins only.
create_monitor Create a monitor. kind=heartbeat: your cron job pings us — the response includes the ping URL and a crontab example; append `&& curl -fsS <ping_url>` to the job. kind=http: we check the URL (optional keyword must appear in the body). kind=tcp: we connect to host:port (put host:port in url). Arguments outside this schema are refused. Certificate monitors are not created here — they need a source, a validation profile and often pasted material, and one configuration system is the web dashboard; list_monitors can filter kind=certificate to read them. Browser monitors are refused while browser execution is unavailable.
pause_monitor Pause a monitor (no checks, no alerts).
resume_monitor Resume a paused monitor.
delete_monitor Delete a monitor and its whole history. Requires confirm: true.

Write-capable from day one — most monitoring MCPs are read-only. Everything is scoped to your account; deletes require confirm: true; 240 requests/min per token. The same data is available as a REST API under /api/v1.