Skip to content
ScaledPapers

Blog

Add the check when you add the endpoint

Updated on by Nurbol Sakenov

A new endpoint ships. The health check for it gets added later, usually the week after it went down and nobody noticed.

Adding the check is not the hard part. You open a dashboard, copy a URL, fill in a form, and link it to the status page. It just happens in a different place, at a different time, from writing the code. So it waits.

If you write the endpoint with Cursor, Claude Code, or Codex, the agent that wrote it can add the check before the session ends.

What the ask looks like

Connect the ScaledPapers uptime monitoring MCP server, then ask in the same chat:

Watch the health URLs in this repo and put each one on our status page as its own component.

The agent reads the repo for routes, so it already knows where /health and /api/status live. Over MCP it then:

  1. Calls usage to see how many checks the plan allows.
  2. Creates one check per public URL.
  3. Creates the components on the status page and links each check to one.

The checks it creates are ordinary checks. They show up in the console and the API like any other, so nothing the agent made is hidden from the rest of the team.

Where it stops

At the plan cap. The server tells the agent to call usage before creating anything and to stop when a cap is reached. On the free plan that is 5 checks, and the API refuses a sixth either way. If the repo has nine health URLs, expect five checks and a note about the other four. You decide which five matter.

At localhost. Checks run from our probe regions, not your laptop. Private and loopback addresses are rejected. An agent working on a dev server will often reach for http://localhost:3000/health first. Give it the staging or production URL instead.

At anything visitors see. The server tells the agent to delete, open incidents, or email subscribers only when you asked for that action in the conversation. Those are instructions to the agent. The hard limits are in the next paragraph. A check set to Ask me to review first puts a draft incident under Needs review when it goes down. The agent can list those drafts. Publishing one emails subscribers and posts to Slack, so the agent only does it when you ask.

At access. These are enforced by the server, not left to the agent. Team invites and roles, creating and revoking API keys, billing, creating or deleting alert destinations, deleting an incident, and visitor subscribers stay in the console. The agent can attach and test an alert destination you already created. It cannot give itself more access.

Setup

An owner or admin creates an API key on API Keys in the console and copies it once. Export it in the shell your editor uses:

export SP_API_KEY=sp_…

Install the skill and wire the server:

npx skills add ScaledPapers/skills --skill uptime-status-page -a claude-code -a codex -g -y
bash ~/.agents/skills/uptime-status-page/scripts/wire-mcp.sh claude   # or cursor, or codex

The script reads the key from the environment, so the raw key never goes into a project file. To add it by hand in Claude Code:

claude mcp add --transport http scaledpapers https://api.scaledpapers.com/mcp \
  --header 'Authorization: Bearer ${SP_API_KEY}'

Keep the single quotes, so Claude Code stores the variable and not the key. The Cursor and Codex snippets are in the MCP docs. The server has 34 tools. Cursor enables at most 40 MCP tools across all servers, so leave room for the others you use.

claude.ai and Claude Desktop custom connectors are not supported yet. They expect OAuth, and this server takes a bearer key.

After the checks exist

The agent sets up the checks. The defaults decide when anyone gets paged. A new check needs 3 failed runs in a row before it counts as down, so one blip is stored and nothing is sent. If a check runs every 5 minutes and should page sooner, ask the agent to lower its confirmation period.

Maintenance works the same way. Over MCP, a maintenance window does not email subscribers unless you ask for it. Over the REST API, it emails them by default when a public component is included. Say so when you want the email sent.


API requests are unlimited and never billed on any plan. The free plan includes 5 checks and a status page. See pricing.

Validation report

Validation summary

Status validated

Date: 2026-11-03

What was checked

Each claim about the MCP server, plan limits, and setup was compared with the engine source, the skill's wire script, the public docs, and the live MCP tool list.

Result

  • Endpoint and auth: https://api.scaledpapers.com/mcp with a bearer key. claude.ai and Claude Desktop custom connectors are not supported because they expect OAuth. Source: content/docs/14-mcp.md.
  • Tool count: 34 @mcp.tool( registrations in data_pipeline/engine/api/mcp.py. The live server listed 34 tools on 2026-11-03.
  • Agent instructions: the server tells agents to call usage before creating anything, to stop at a cap, and to delete, open incidents, or email subscribers only when the user asked in the conversation. Source: server instructions in mcp.py.
  • Free cap: 5 checks, also enforced by the API (plan_max_endpoints in data_pipeline/engine/api/routes/endpoints.py). Plan values come from billing.write_workspace_plan and match /pricing/.
  • Private targets: localhost, .local, private, loopback, and link-local addresses are rejected (routes/endpoints.py).
  • Review drafts: list_incident_proposals and approve_incident_proposal exist. Approving publishes the incident, emails subscribers, and posts to Slack. The tool description says to run it only when the user asked.
  • Console only: no MCP tool covers team, API keys, billing, creating or deleting alert destinations, deleting incidents, or visitor subscribers. list_alert_destinations, test_alert_destination, and page_alert_destinations work only on destinations that already exist.
  • Confirmation default: 3 (confirmation_failures default in EndpointIn, routes/endpoints.py). MCP-created checks use the same model.
  • Maintenance email: maintenance_notify_value returns false over MCP unless set. The REST API defaults to true when a public component is targeted (content/docs/11-api.md).
  • Setup: wire-mcp.sh accepts cursor, claude, codex, or all. For Claude Code it registers the header as the literal ${SP_API_KEY}, and for Cursor and Codex it writes environment references, so the raw key is not written by the script.
  • Billing: "API requests are unlimited and never billed" is quoted from /pricing/.

Not checked

  • Cursor's 40-tool limit is Cursor's behavior, quoted from our MCP docs. It was not re-checked against Cursor.
  • How an agent finds routes in a repo depends on the agent. The post describes what it is asked to do, not a guarantee.