MCP Server
Drive Enori from Claude Desktop, Claude.ai custom connectors, or any client that speaks the Model Context Protocol. 45 tools — monitors, incidents, alerts, status pages, browser checks, and SLOs — all from natural language.
What you can do
Once connected, ask Claude things like:
- "Which of my monitors had incidents in the last 24 hours?"
- "Pause the API monitor for an hour while I deploy."
- "Create a 99.9% availability SLO with a rolling 30-day window on monitor X."
- "What's the current burn rate on my customer SLA?"
- "Generate a status page for the public-facing services."
Claude routes the question through the relevant Enori MCP tools, fetches your data, and answers in plain language. No copy-pasting between dashboards.
Connecting
The MCP server lives at https://mcp.enori.io/mcp. There are two ways to authenticate:
OAuth (recommended for Claude Desktop / Claude.ai)
OAuth gives the client full access to your account, just like a browser session. No scopes to manage, no API keys to rotate.
Claude Desktop / Claude Code CLI:
{
"mcpServers": {
"enori": {
"url": "https://mcp.enori.io/mcp"
}
}
}The first time Claude calls a tool, your browser opens to https://app.enori.io for sign-in. After approval, the client stores a refresh token (30-day TTL, rotated on each use) and the dance is invisible from then on.
Claude.ai custom connectors:
In Claude.ai, Settings → Custom Connectors → Add custom connector → URL = https://mcp.enori.io/mcp/sse. The legacy SSE transport is on the /mcp/sse path; modern HTTP-streaming clients use /mcp. Both paths talk to the same server.
API key (recommended for scripts / CI)
API keys are scope-bound. The MCP server reuses the same scopes as the REST API:
| Scope | Tools |
|---|---|
monitors:read | List, get, stats, check results, traces, SLO status, SLO compliance, SLO breaches, browser monitors, browser check details |
monitors:write | Create, update, pause, resume, snooze, check-now, share, browser CRUD, SLO CRUD |
incidents:read | List, get, active, stats |
incidents:write | Acknowledge, resolve, add update, register live activity |
alerts:read | List alerts, list channels |
status_pages:read | List, get |
maintenance:write | Create + start maintenance windows |
Generate keys in Settings → API Keys in the dashboard. Each key can hold multiple scopes; pick the smallest set the use case needs.
Config:
{
"mcpServers": {
"enori": {
"url": "https://mcp.enori.io/mcp",
"headers": { "X-Api-Key": "YOUR_KEY" }
}
}
}Rate limits
| Auth | Limit |
|---|---|
| API key | 60 tool calls / minute |
| OAuth | 100 tool calls / minute |
Hitting the limit returns a 429 with a Retry-After header. Bursts well below this on natural conversational use; the limit is mostly there to catch runaway scripts.
Tool catalog
Tools are grouped by what you'd reach for them to do. Every read tool requires a read scope; every write tool requires the corresponding write scope. Browser-monitor and SLO tools share the regular monitors: scopes — there is no separate browser: or slos:* scope.
Monitors
| Tool | Purpose |
|---|---|
list_monitors | Every monitor on your account with status, type, URL, interval, response time. |
get_monitor | Full config + state + SSL + alert settings for one monitor. |
get_monitor_stats | Uptime %, average response time, p95, total checks, failed checks, downtime minutes. |
get_check_results | Recent check results — status, response time, status code, error, timestamp. |
get_health_summary | Cross-monitor health roll-up sorted worst-first. Error rate, average response, p95 per monitor. |
create_monitor | Create a Website / Ping / Port / DNS / Domain / Job monitor. Plan limits enforced. |
update_monitor | Update any field on an existing monitor. PATCH-style — only fields you pass change. |
check_now | Trigger an immediate check. Bypasses the schedule queue. |
pause_monitor / resume_monitor | Stop / start checks. Paused monitors don't burn SLO budget when excludePaused=true. |
snooze_monitor / unsnooze_monitor / get_snooze_status | Suppress your alerts on a monitor for 30m–72h. Incident stays open, teammates still get notified. |
Incidents
| Tool | Purpose |
|---|---|
list_incidents / get_incident / get_active_incidents | Browse + drill into incident records. |
acknowledge_incident | Mark an incident "I'm on it". |
resolve_incident | Close an incident with a resolution note. |
add_incident_update | Append a status update to a running incident (visible on status pages). |
register_live_activity_token | Wire iOS Live Activities — push tokens for incident timeline updates on the lock screen. |
Alerts & status
| Tool | Purpose |
|---|---|
list_alerts | Recent alert deliveries — type, channel, monitor, timestamp. |
list_alert_channels | Configured email / Slack / Discord / Teams / Webhook channels. |
list_status_pages / get_status_page | Public status pages and their component health. |
get_overview | Account-wide summary — totals, plan, recent incidents, top failing monitors. |
Maintenance windows
| Tool | Purpose |
|---|---|
list_maintenance_windows | Scheduled, active, and completed windows. |
create_maintenance_window | Schedule a future window — checks continue, alerts suppressed. |
start_maintenance_now | Open a window immediately (e.g. for an unplanned deploy). |
Browser monitors
Browser monitors run real Playwright sessions through the warm-pool executor. The MCP surface here mirrors the dashboard's browser tab.
| Tool | Purpose |
|---|---|
get_browser_monitors | List browser monitors with status, interval, step count, healing status. |
get_browser_monitor_status | Quick status — uptime %, LCP, CLS, healing status, step count. |
get_browser_check_details | One check's full payload — step results, CWV, console errors, AI failure analysis. |
create_browser_monitor | Create a browser monitor. Steps can be supplied explicitly or AI-generated from a URL + description. Free slot + Stripe billing handled automatically. |
update_browser_steps | Replace the step sequence on an existing browser monitor (max 25 steps). |
generate_browser_steps | AI-generate steps from a URL + plain-English description. Returns a preview without creating the monitor. |
delete_browser_monitor | Permanently delete a browser monitor. Cancels the Stripe item for paid monitors with prorated credit. |
Traces (Website monitors)
| Tool | Purpose |
|---|---|
get_monitor_traces | List recent OTLP traces for a Website monitor — trace id, root service / operation, duration, span count, error flag. |
get_trace_detail | Full trace — every span with parent ids, timing, status, attributes, events. Use for root-cause investigation on a failed check. |
Job monitors
| Tool | Purpose |
|---|---|
get_monitor_pings | Heartbeat history. Returns runId for pings that share a batched/sharded logical run. |
get_monitor_custom_metrics | Per-run custom metrics emitted via the metrics field on the ping payload. Omit key to list distinct keys; pass key to get a (t, v, runId?) time-series. Window max 90 days. |
get_monitor_run_series | Run-grouped view. Per-run summary (start, completion, ping count, success / failure) plus the flat ping list, max 5000. |
SLOs
See the Service Level Objectives guide for the concepts behind these tools — windows, burn rate, the three SLI types, exclusions, and the SLA-report flow.
| Tool | Purpose |
|---|---|
list_slos | Every SLO on a monitor with computed burn status. Empty list when no SLOs are configured. |
get_slo_status | Full computed status for one SLO — target, burn, achieved %, multiplier, exhaustion ETA, status (green / amber / red), exclusion totals. |
create_slo | Create an SLO. SLI types: availability, latency (requires latencyThresholdMs 1–60000), content_match. Window types: rolling (requires windowLengthDays from {7, 28, 30, 90, 365}) or calendar (requires calendarCycle from {weekly, monthly, quarterly, yearly}). Target % between 90.000 and 99.999. |
update_slo | Replace every field on an existing SLO. PUT-style — fetch with get_slo_status first, then change what you need. Same validation as create_slo. |
delete_slo | Permanently delete an SLO. Removes its slo_burn_daily history; the monitor itself is untouched. |
Examples
Smoke-check uptime over coffee
You: Anything degraded right now? Claude: Calling
get_health_summary… two monitors are burning. The API monitor is at 34 % error rate over the last hour (last successful check 12 minutes ago, response time spiking from 180 ms to 4.2 s); the staging environment is showing intermittent SSL errors (3 of the last 10 checks failed handshake). Other 18 monitors green. Want me to acknowledge an incident on the API one or check its recent traces?
Set up a customer-grade SLA from scratch
You: Set up a 99.5 % monthly availability SLA on the production API monitor with a customer-friendly description. Claude: Calling
list_monitorsto find the production API monitor… found it (mon_abc123). Callingcreate_slowith availability SLI, calendar-monthly window, target 99.5, description "MSA §4.2 — monthly uptime commitment for paying customers", maintenance + paused exclusions on, balanced burn-rate alerts (fast + slow). Createdslo_def456. The first monthly window starts 2026-05-01 00:00 UTC and the achieved % so far is 100 % (no incidents yet this month).
Investigate a slow check
You: Why was check
chk_xyzon monitor X slow? Claude: Callingget_check_resultsto find that check (response time 8.3 s vs typical 220 ms)… it has trace data. Callingget_trace_detail. The check spent 7.6 s in a single Postgres query (SELECT … FROM users WHERE …) inside the/api/usersendpoint — that's where the budget went. Database span hasdb.statementtruncated to 200 chars; it's a query against a 50M-row table without an index hint. Want me to open an incident with this evidence pre-filled?
Errors
The MCP server returns errors as a normal JSON tool result with an error field rather than HTTP 5xx — this is what most MCP clients render correctly. Common shapes:
| Error | Meaning |
|---|---|
Monitor not found | The monitor ID doesn't exist on your account, or it was deleted. |
SLO not found | The SLO ID doesn't belong to the monitor in the same call. |
Insufficient scope | The API key has fewer scopes than the tool requires. OAuth users get full scope automatically. |
Rate limit exceeded | More tool calls in the rolling minute than your auth tier allows. The response includes a hint for when to retry. |
Plan limit reached | Creating a monitor / status page / maintenance window past your plan cap. Upgrade or delete an existing one. |
For OAuth, refresh tokens rotate on every use. If you let a token sit unused for 30 days the next call returns Refresh token expired — the client will re-prompt you to sign in.
Self-host the internal flavor (advanced)
The public server at mcp.enori.io is the recommended path. There's also an internal stdio version (tools/enori-mcp-server in the repo) with extra debugging and admin tools. It's intended for developers building against Enori — not for production agents — and runs locally over stdio rather than HTTP. Set ENORI_API_KEY (and optionally ENORI_ADMIN_KEY for admin tools) in your shell env, then add it to .claude/mcp.json:
{
"mcpServers": {
"enori-internal": {
"command": "node",
"args": ["./tools/enori-mcp-server/dist/index.js"],
"env": {
"ENORI_API_KEY": "YOUR_KEY",
"ENORI_API_URL": "https://api.enori.io"
}
}
}
}The internal server adds manage_* consolidated CRUD tools, admin observability, and direct DB validation helpers. See the repo for full surface details.
Status
The public MCP server has been live at mcp.enori.io since 2026-04. Tool count grows when the dashboard surface grows — recently added: SLO management (May 2026), browser monitor variables (April 2026), Job-monitor custom metrics (April 2026). The contract is additive; we don't break existing tools.
Spotted a missing tool, hit a confusing error, or want a workflow that needs a new tool? Email support@enori.io.